From 30e37c7f6e3e69fefc709b6be5bcfb3a647909fc Mon Sep 17 00:00:00 2001 From: Jesse Luehrs Date: Sat, 15 Jan 2022 15:26:56 -0500 Subject: implement `cd -` --- src/runner/builtins/mod.rs | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'src/runner/builtins/mod.rs') diff --git a/src/runner/builtins/mod.rs b/src/runner/builtins/mod.rs index ff03499..c345a85 100644 --- a/src/runner/builtins/mod.rs +++ b/src/runner/builtins/mod.rs @@ -65,7 +65,9 @@ fn cd( ) -> std::process::ExitStatus { let dir = if let Some(dir) = exe.args().get(0) { if dir.is_empty() { - ".".to_string() + ".".to_string().into() + } else if dir == "-" { + env.prev_pwd().await } else { dir.into() } @@ -74,11 +76,29 @@ fn cd( if dir.is_empty() { bail!(cfg, exe, "could not find home directory"); } - dir + dir.into() + }; + let prev = match std::env::current_dir() { + Ok(path) => path, + Err(e) => { + bail!( + cfg, + exe, + "could not find current directory: {}", + crate::format::io_error(&e) + ); + } }; if let Err(e) = std::env::set_current_dir(&dir) { - bail!(cfg, exe, "{}: {}", crate::format::io_error(&e), dir); + bail!( + cfg, + exe, + "{}: {}", + crate::format::io_error(&e), + dir.display() + ); } + env.set_prev_pwd(&prev).await; async_std::process::ExitStatus::from_raw(0) } -- cgit v1.2.3-54-g00ecf