From 595b188855e44ec2f9f0dda5246ebaacdffac170 Mon Sep 17 00:00:00 2001 From: Sam Hedin Date: Tue, 23 Jun 2020 18:37:50 +0200 Subject: [PATCH] Errors --- crates/nu-cli/src/cli.rs | 4 +- .../src/env/directory_specific_environment.rs | 99 ++++++++++++------- crates/nu-cli/src/env/environment_syncer.rs | 7 +- 3 files changed, 68 insertions(+), 42 deletions(-) diff --git a/crates/nu-cli/src/cli.rs b/crates/nu-cli/src/cli.rs index 97deb47a65..26790dcbf8 100644 --- a/crates/nu-cli/src/cli.rs +++ b/crates/nu-cli/src/cli.rs @@ -238,7 +238,7 @@ pub fn create_default_context( syncer.load_environment(); let mut context = Context::basic()?; - syncer.sync_env_vars(&mut context)?; + syncer.sync_env_vars(&mut context); syncer.sync_path_vars(&mut context); { @@ -677,7 +677,7 @@ pub async fn cli( // TODO: make sure config is cached so we don't path this load every call // FIXME: we probably want to be a bit more graceful if we can't set the environment syncer.reload(); - syncer.sync_env_vars(&mut context)?; + syncer.sync_env_vars(&mut context); syncer.sync_path_vars(&mut context); match line { diff --git a/crates/nu-cli/src/env/directory_specific_environment.rs b/crates/nu-cli/src/env/directory_specific_environment.rs index 626e2fea12..e1ae5ff116 100644 --- a/crates/nu-cli/src/env/directory_specific_environment.rs +++ b/crates/nu-cli/src/env/directory_specific_environment.rs @@ -2,6 +2,7 @@ use crate::commands::{self, autoenv::Trusted}; use commands::autoenv; use indexmap::{IndexMap, IndexSet}; use nu_errors::ShellError; +use nu_source::Span; use std::{ collections::hash_map::DefaultHasher, ffi::OsString, @@ -33,30 +34,51 @@ impl DirectorySpecificEnvironment { } } + // fn toml_if_directory_is_trusted( + // &self, + // mut wdirenv: PathBuf, + // ) -> Result { + // if let Some(trusted) = &self.trusted { + // wdirenv.push(".nu-env"); + // if wdirenv.exists() { + // let content = std::fs::read_to_string(&wdirenv)?; + // let mut hasher = DefaultHasher::new(); + // content.hash(&mut hasher); + // if trusted.files.get(wdirenv.to_str().unwrap()) + // == Some(&hasher.finish().to_string()) + // { + // return Ok(content.parse::().or_else(|_| { + // Err(ShellError::unexpected_eof( + // "Could not parse .nu-env file. Is it well-formed?", + // Span::default(), + // )) + // })?); + // } else { + // return Err(ShellError::unexpected_eof("Found .nu-env file in this directory, but it is not trusted. You can run 'autoenv trust' to allow it. This needs to be done after each change to the file", + // Span::default())); + // } + // } + // } + // Err(ShellError::unexpected_eof("No trusted directories", Span::default())) + // } + fn toml_if_directory_is_trusted( &self, - mut wdirenv: PathBuf, + wdirenv: PathBuf, ) -> Result { if let Some(trusted) = &self.trusted { - wdirenv.push(".nu-env"); - if wdirenv.exists() { - let content = std::fs::read_to_string(&wdirenv)?; - let mut hasher = DefaultHasher::new(); - content.hash(&mut hasher); - if trusted.files.get(wdirenv.to_str().unwrap()) - == Some(&hasher.finish().to_string()) - { - return Ok(content.parse::().or_else(|_| { - Err( - ShellError::untagged_runtime_error( - "Could not parse .nu-env file. Is it well-formed?", - ), - ) - })?); - } else { - return Err(ShellError::untagged_runtime_error("Found .nu-env file in this directory, but it is not trusted. You can run 'autoenv trust' to allow it. This needs to be done after each change to the file")); - } + let content = std::fs::read_to_string(&wdirenv)?; + let mut hasher = DefaultHasher::new(); + content.hash(&mut hasher); + + if trusted.files.get(wdirenv.to_str().unwrap()) == Some(&hasher.finish().to_string()) { + return Ok(content.parse::().or_else(|_| { + Err(ShellError::untagged_runtime_error( + "Could not parse .nu-env file. Is it well-formed?", + )) + })?); } + return Err(ShellError::untagged_runtime_error("Found .nu-env file in this directory, but it is not trusted. You can run 'autoenv trust' to allow it. This needs to be done after each change to the file")); } Err(ShellError::untagged_runtime_error("No trusted directories")) } @@ -68,26 +90,29 @@ impl DirectorySpecificEnvironment { //Start in the current directory, then traverse towards the root with working_dir to see if we are in a subdirectory of a valid directory. while let Some(wdir) = working_dir { - let toml_doc = self.toml_if_directory_is_trusted(wdir.to_path_buf())?; - toml_doc - .get("env") - .ok_or_else(|| Error::new(ErrorKind::InvalidData, "env section missing"))? - .as_table() - .ok_or_else(|| Error::new(ErrorKind::InvalidData, "env section malformed"))? - .iter() - .for_each(|(dir_env_key, dir_env_val)| { - let dir_env_val: EnvVal = dir_env_val.as_str().unwrap().into(); + let wdirenv = wdir.join(".nu-env"); + if wdirenv.exists() { + let toml_doc = self.toml_if_directory_is_trusted(wdirenv)?; + toml_doc + .get("env") + .ok_or_else(|| Error::new(ErrorKind::InvalidData, "env section missing"))? + .as_table() + .ok_or_else(|| Error::new(ErrorKind::InvalidData, "env section malformed"))? + .iter() + .for_each(|(dir_env_key, dir_env_val)| { + let dir_env_val: EnvVal = dir_env_val.as_str().unwrap().into(); - //This condition is to make sure variables in parent directories don't overwrite variables set by subdirectories. - if !vars_to_add.contains_key(dir_env_key) { - vars_to_add.insert(dir_env_key.clone(), dir_env_val); + //This condition is to make sure variables in parent directories don't overwrite variables set by subdirectories. + if !vars_to_add.contains_key(dir_env_key) { + vars_to_add.insert(dir_env_key.clone(), dir_env_val); - self.added_env_vars - .entry(wdir.to_path_buf()) - .or_insert(IndexSet::new()) - .insert(dir_env_key.clone()); - } - }); + self.added_env_vars + .entry(wdir.to_path_buf()) + .or_insert(IndexSet::new()) + .insert(dir_env_key.clone()); + } + }); + } working_dir = working_dir //Keep going up in the directory structure with .parent() .expect("This should not be None because of the while condition") diff --git a/crates/nu-cli/src/env/environment_syncer.rs b/crates/nu-cli/src/env/environment_syncer.rs index 4f5d6af12a..ca59313522 100644 --- a/crates/nu-cli/src/env/environment_syncer.rs +++ b/crates/nu-cli/src/env/environment_syncer.rs @@ -42,10 +42,12 @@ impl EnvironmentSyncer { environment.morph(&*self.config); } - pub fn sync_env_vars(&mut self, ctx: &mut Context) -> Result<(), ShellError>{ + pub fn sync_env_vars(&mut self, ctx: &mut Context) { let mut environment = self.env.lock(); - environment.maintain_directory_environment().ok(); + if let Err(e) = environment.maintain_directory_environment() { + ctx.error(e); + } if environment.env().is_some() { for (name, value) in ctx.with_host(|host| host.vars()) { if name != "path" && name != "PATH" { @@ -72,7 +74,6 @@ impl EnvironmentSyncer { } } } - Ok(()) } pub fn sync_path_vars(&mut self, ctx: &mut Context) {