From 1239f8157a13eea9c0145bf3f59d1509edf3b76f Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Fri, 11 Nov 2022 18:36:09 +0400 Subject: [PATCH 1/4] Try to add support for fish shell --- src/cli/self_update/shell.rs | 47 +++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/src/cli/self_update/shell.rs b/src/cli/self_update/shell.rs index 31c1b84816..bdfc3e5748 100644 --- a/src/cli/self_update/shell.rs +++ b/src/cli/self_update/shell.rs @@ -71,7 +71,12 @@ pub(crate) fn cargo_home_str() -> Result> { // TODO?: Make a decision on Ion Shell, Power Shell, Nushell // Cross-platform non-POSIX shells have not been assessed for integration yet fn enumerate_shells() -> Vec { - vec![Box::new(Posix), Box::new(Bash), Box::new(Zsh)] + vec![ + Box::new(Posix), + Box::new(Bash), + Box::new(Zsh), + Box::new(Fish), + ] } pub(crate) fn get_available_shells() -> impl Iterator { @@ -201,6 +206,46 @@ impl UnixShell for Zsh { } } +struct Fish; + +impl UnixShell for Fish { + fn does_exist(&self) -> bool { + // fish has to either be the shell or be callable for fish setup. + matches!(process().var("SHELL"), Ok(sh) if sh.contains("fish")) + || matches!(utils::find_cmd(&["fish"]), Some(_)) + } + + // > "$XDG_CONFIG_HOME/fish/conf.d" (or "~/.config/fish/conf.d" if that variable is unset) for the user + // from + fn rcfiles(&self) -> Vec { + let p0 = process().var("XDG_CONFIG_HOME").ok().map(|p| { + let mut path = PathBuf::from(p); + path.push("fish/config.d/rustup.fish"); + path + }); + + let p1 = utils::home_dir().map(|mut path| { + path.push(".config/fish/config.d/rustup.fish"); + path + }); + + p0.into_iter().chain(p1).collect() + } + + fn update_rcs(&self) -> Vec { + if let Ok(home) = process().var("XDG_CONFIG_HOME") { + let mut path = PathBuf::from(home); + path.push("fish/config.d/rustup.fish"); + vec![path] + } else if let Some(mut path) = utils::home_dir() { + path.push(".config/fish/config.d/rustup.fish"); + vec![path] + } else { + Vec::new() + } + } +} + pub(crate) fn legacy_paths() -> impl Iterator { let zprofiles = Zsh::zdotdir() .into_iter() From 8b8be013bb40d6b031b5a1ab283dc8b8bca13430 Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Tue, 7 Mar 2023 18:04:40 +0400 Subject: [PATCH 2/4] Update all rc fish scripts --- src/cli/self_update/shell.rs | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/cli/self_update/shell.rs b/src/cli/self_update/shell.rs index bdfc3e5748..7e2b2a098a 100644 --- a/src/cli/self_update/shell.rs +++ b/src/cli/self_update/shell.rs @@ -233,16 +233,7 @@ impl UnixShell for Fish { } fn update_rcs(&self) -> Vec { - if let Ok(home) = process().var("XDG_CONFIG_HOME") { - let mut path = PathBuf::from(home); - path.push("fish/config.d/rustup.fish"); - vec![path] - } else if let Some(mut path) = utils::home_dir() { - path.push(".config/fish/config.d/rustup.fish"); - vec![path] - } else { - Vec::new() - } + self.rcfiles() } } From c87f68cad328a9be395c7d885bcf4245bd8bc316 Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Tue, 7 Mar 2023 18:06:04 +0400 Subject: [PATCH 3/4] Fix fish config dir paths --- src/cli/self_update/shell.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cli/self_update/shell.rs b/src/cli/self_update/shell.rs index 7e2b2a098a..3b66c53f38 100644 --- a/src/cli/self_update/shell.rs +++ b/src/cli/self_update/shell.rs @@ -220,12 +220,12 @@ impl UnixShell for Fish { fn rcfiles(&self) -> Vec { let p0 = process().var("XDG_CONFIG_HOME").ok().map(|p| { let mut path = PathBuf::from(p); - path.push("fish/config.d/rustup.fish"); + path.push("fish/conf.d/rustup.fish"); path }); let p1 = utils::home_dir().map(|mut path| { - path.push(".config/fish/config.d/rustup.fish"); + path.push(".config/fish/conf.d/rustup.fish"); path }); From f68b2850c55afc151b01643c7d5bf84be404d4f0 Mon Sep 17 00:00:00 2001 From: Maybe Waffle Date: Tue, 7 Mar 2023 18:06:32 +0400 Subject: [PATCH 4/4] Write a custom env script for fish --- src/cli/self_update/env.fish | 5 +++++ src/cli/self_update/shell.rs | 11 +++++++++++ 2 files changed, 16 insertions(+) create mode 100644 src/cli/self_update/env.fish diff --git a/src/cli/self_update/env.fish b/src/cli/self_update/env.fish new file mode 100644 index 0000000000..b6549f504d --- /dev/null +++ b/src/cli/self_update/env.fish @@ -0,0 +1,5 @@ +# rustup shell setup +if not contains "{cargo_bin}" $PATH + # Prepending path in case a system-installed rustc needs to be overridden + set -x PATH "{cargo_bin}" $PATH +end diff --git a/src/cli/self_update/shell.rs b/src/cli/self_update/shell.rs index 3b66c53f38..3df0fbb526 100644 --- a/src/cli/self_update/shell.rs +++ b/src/cli/self_update/shell.rs @@ -235,6 +235,17 @@ impl UnixShell for Fish { fn update_rcs(&self) -> Vec { self.rcfiles() } + + fn env_script(&self) -> ShellScript { + ShellScript { + name: "env.fish", + content: include_str!("env.fish"), + } + } + + fn source_string(&self) -> Result { + Ok(format!(r#". "{}/env.fish""#, cargo_home_str()?)) + } } pub(crate) fn legacy_paths() -> impl Iterator {