diff options
| author | Jonas Maier <> | 2026-03-07 11:57:46 +0100 |
|---|---|---|
| committer | Jonas Maier <> | 2026-03-07 11:57:46 +0100 |
| commit | cd63b5ffd756fd23e2385b935254dcceabe82696 (patch) | |
| tree | c52ff2ea64cfe9254ec49c536fe2ef2ff40d6a93 | |
| parent | 66b447cfc8eb2134bb43a3069b942ce34a72c325 (diff) | |
| download | pish-cd63b5ffd756fd23e2385b935254dcceabe82696.tar.gz | |
proper cd
| -rw-r--r-- | src/run/builtin.rs | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/src/run/builtin.rs b/src/run/builtin.rs index ed1285a..90c44a9 100644 --- a/src/run/builtin.rs +++ b/src/run/builtin.rs @@ -17,7 +17,7 @@ impl Builtin for cd { se: Arc<Mutex<Session>>, args: &[BString], _stdin: &mut dyn Read, - _stdout: &mut dyn Write, + stdout: &mut dyn Write, ) -> Result { let mut dir = match current_dir() { Ok(path) => path.as_os_str().as_bytes().to_vec(), @@ -26,21 +26,31 @@ impl Builtin for cd { std::mem::swap(&mut dir, &mut se.lock().unwrap().prev_path); - match args.get(0).map(|v| &v[..]) { + let target_path: BString = match args.get(0).map(|v| &v[..]) { Some(b"-") => { - let _ = set_current_dir(OsStr::from_bytes(&dir)); + dir } Some(path) => { - let _ = set_current_dir(OsStr::from_bytes(path)); + path.to_vec() } None => { if let Some(home) = std::env::var_os("HOME") { - let _ = set_current_dir(home); + home.into_encoded_bytes() + } else { + writeln!(stdout, "$HOME not set")?; + return Err(Error::Exit(-1)); } } - } + }; - Ok(()) + if let Err(_) = set_current_dir(OsStr::from_bytes(&target_path)) { + write!(stdout, "failed to cd into ")?; + stdout.write_all(&target_path)?; + writeln!(stdout, "\n")?; + Err(Error::Exit(1)) + } else { + Ok(()) + } } } |
