Skip to content

Commit c02f1fa

Browse files
committed
feat: add nushell support
1 parent c8eddcb commit c02f1fa

File tree

3 files changed

+45
-0
lines changed

3 files changed

+45
-0
lines changed

src/cli/self_update.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ the corresponding `env` file under {cargo_home}.
384384
This is usually done by running one of the following (note the leading DOT):
385385
. "{cargo_home}/env" # For sh/bash/zsh/ash/dash/pdksh
386386
source "{cargo_home}/env.fish" # For fish
387+
source "{cargo_home}/env.nu" # For nushell
387388
"#
388389
};
389390
}

src/cli/self_update/env.nu

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
if ("{cargo_bin}" not-in ($env.Path | split row (char esep))) {
2+
$env.Path = ($env.Path | prepend "{cargo_bin}")
3+
}

src/cli/self_update/shell.rs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ fn enumerate_shells() -> Vec<Shell> {
7777
Box::new(Bash),
7878
Box::new(Zsh),
7979
Box::new(Fish),
80+
Box::new(Nu),
8081
]
8182
}
8283

@@ -255,6 +256,46 @@ impl UnixShell for Fish {
255256
}
256257
}
257258

259+
struct Nu;
260+
261+
impl UnixShell for Nu {
262+
fn does_exist(&self, process: &Process) -> bool {
263+
// nu has to either be the shell or be callable for nu setup.
264+
matches!(process.var("SHELL"), Ok(sh) if sh.contains("nu"))
265+
|| utils::find_cmd(&["nu"], process).is_some()
266+
}
267+
268+
fn rcfiles(&self, process: &Process) -> Vec<PathBuf> {
269+
process.var("XDG_CONFIG_HOME").ok().and(
270+
process.home_dir()
271+
).iter().flat_map(|path| {
272+
let mut p0 = path.clone();
273+
let mut p1 = path.clone();
274+
p0.push("nushell/env.nu");
275+
p1.push("nushell/config.nu");
276+
[p0, p1]
277+
}).collect()
278+
}
279+
280+
fn update_rcs(&self, process: &Process) -> Vec<PathBuf> {
281+
self.rcfiles(process)
282+
.into_iter()
283+
.filter(|rc| rc.is_file())
284+
.collect()
285+
}
286+
287+
fn env_script(&self) -> ShellScript {
288+
ShellScript {
289+
name: "env.nu",
290+
content: include_str!("env.nu")
291+
}
292+
}
293+
294+
fn source_string(&self, process: &Process) -> Result<String> {
295+
Ok(format!(r#"source "{}/env.nu""#, cargo_home_str(process)?))
296+
}
297+
}
298+
258299
pub(crate) fn legacy_paths(process: &Process) -> impl Iterator<Item = PathBuf> + '_ {
259300
let zprofiles = Zsh::zdotdir(process)
260301
.into_iter()

0 commit comments

Comments
 (0)