diff --git a/crates/nu-command/src/filesystem/cd.rs b/crates/nu-command/src/filesystem/cd.rs index f34967a975..5bd15b352e 100644 --- a/crates/nu-command/src/filesystem/cd.rs +++ b/crates/nu-command/src/filesystem/cd.rs @@ -34,11 +34,15 @@ impl Command for Cd { let (path, span) = match path_val { Some(v) => { let path = v.as_path()?; - if !path.exists() { - return Err(ShellError::DirectoryNotFound(v.span()?)); - } - - let path = nu_path::canonicalize_with(path, &cwd)?; + let path = match nu_path::canonicalize_with(path, &cwd) { + Ok(p) => p, + Err(e) => { + return Err(ShellError::DirectoryNotFoundHelp( + v.span()?, + format!("IO Error: {:?}", e), + )) + } + }; (path.to_string_lossy().to_string(), v.span()?) } None => { diff --git a/crates/nu-command/src/filters/each.rs b/crates/nu-command/src/filters/each.rs index c712bd6f7c..84ca535961 100644 --- a/crates/nu-command/src/filters/each.rs +++ b/crates/nu-command/src/filters/each.rs @@ -82,8 +82,7 @@ impl Command for Each { .into_iter() .enumerate() .map(move |(idx, x)| { - stack.env_vars = orig_env_vars.clone(); - stack.env_hidden = orig_env_hidden.clone(); + stack.with_env(&orig_env_vars, &orig_env_hidden); if let Some(var) = block.signature.get_positional(0) { if let Some(var_id) = &var.var_id { diff --git a/crates/nu-protocol/src/engine/stack.rs b/crates/nu-protocol/src/engine/stack.rs index c9e277e899..35f65d2029 100644 --- a/crates/nu-protocol/src/engine/stack.rs +++ b/crates/nu-protocol/src/engine/stack.rs @@ -47,11 +47,12 @@ impl Stack { } pub fn with_env(&mut self, env_vars: &[HashMap], env_hidden: &HashSet) { - if env_vars.iter().any(|scope| !scope.is_empty()) { + // Do not clone the environment if it hasn't changed + if self.env_vars.iter().any(|scope| !scope.is_empty()) { self.env_vars = env_vars.to_owned(); } - if !env_hidden.is_empty() { + if !self.env_hidden.is_empty() { self.env_hidden = env_hidden.clone(); } } diff --git a/crates/nu-protocol/src/shell_error.rs b/crates/nu-protocol/src/shell_error.rs index 0d3a005bb5..7b05d1cd0b 100644 --- a/crates/nu-protocol/src/shell_error.rs +++ b/crates/nu-protocol/src/shell_error.rs @@ -189,10 +189,14 @@ pub enum ShellError { #[diagnostic(code(nu::shell::directory_not_found), url(docsrs))] DirectoryNotFound(#[label("directory not found")] Span), - #[error("File not found")] - #[diagnostic(code(nu::shell::file_not_found), url(docsrs))] + #[error("Directory not found")] + #[diagnostic(code(nu::shell::directory_not_found_custom), url(docsrs))] DirectoryNotFoundCustom(String, #[label("{0}")] Span), + #[error("Directory not found")] + #[diagnostic(code(nu::shell::directory_not_found_help), url(docsrs), help("{1}"))] + DirectoryNotFoundHelp(#[label("directory not found")] Span, String), + #[error("Move not possible")] #[diagnostic(code(nu::shell::move_not_possible), url(docsrs))] MoveNotPossible {