diff --git a/crates/nu-cmd-plugin/src/util.rs b/crates/nu-cmd-plugin/src/util.rs index 80d1a766b4..57de225ace 100644 --- a/crates/nu-cmd-plugin/src/util.rs +++ b/crates/nu-cmd-plugin/src/util.rs @@ -135,18 +135,24 @@ pub(crate) fn get_plugin_dirs( engine_state: &EngineState, stack: &Stack, ) -> impl Iterator { - // Get the NU_PLUGIN_DIRS constant or env var + // Get the NU_PLUGIN_DIRS from the constant and/or env var let working_set = StateWorkingSet::new(engine_state); - let value = working_set + let dirs_from_const = working_set .find_variable(b"$NU_PLUGIN_DIRS") .and_then(|var_id| working_set.get_constant(var_id).ok()) - .or_else(|| stack.get_env_var(engine_state, "NU_PLUGIN_DIRS")) - .cloned(); // TODO: avoid this clone - - // Get all of the strings in the list, if possible - value + .cloned() // TODO: avoid this clone .into_iter() .flat_map(|value| value.into_list().ok()) .flatten() - .flat_map(|list_item| list_item.coerce_into_string().ok()) + .flat_map(|list_item| list_item.coerce_into_string().ok()); + + let dirs_from_env = stack + .get_env_var(engine_state, "NU_PLUGIN_DIRS") + .cloned() // TODO: avoid this clone + .into_iter() + .flat_map(|value| value.into_list().ok()) + .flatten() + .flat_map(|list_item| list_item.coerce_into_string().ok()); + + dirs_from_const.chain(dirs_from_env) } diff --git a/crates/nu-utils/src/default_files/default_env.nu b/crates/nu-utils/src/default_files/default_env.nu index f4c3f562ff..2e2d66f0bc 100644 --- a/crates/nu-utils/src/default_files/default_env.nu +++ b/crates/nu-utils/src/default_files/default_env.nu @@ -46,7 +46,3 @@ $env.ENV_CONVERSIONS = { to_string: { |v| $v | path expand --no-symlink | str join (char esep) } } } - -$env.NU_PLUGIN_DIRS = $env.NU_PLUGIN_DIRS | default [ - ($nu.default-config-dir | path join 'plugins') # add /plugins -] diff --git a/crates/nu-utils/src/default_files/sample_env.nu b/crates/nu-utils/src/default_files/sample_env.nu index f44b8e1986..ea323c6c22 100644 --- a/crates/nu-utils/src/default_files/sample_env.nu +++ b/crates/nu-utils/src/default_files/sample_env.nu @@ -113,13 +113,15 @@ const NU_LIB_DIRS = $NU_LIB_DIRS ++ [($nu.default-config-dir | path join 'module # NU_PLUGIN_DIRS # -------------- -# Directories to search for plugin binaries when calling register. +# Directories to search for plugin binaries when calling add. # By default, the `plugins` subdirectory of the default configuration # directory is included: -$env.NU_PLUGIN_DIRS = [ +const NU_PLUGIN_DIRS = [ ($nu.default-config-dir | path join 'plugins') # add /plugins ] +# You can replace (override) or append to this list by shadowing the constant +const NU_PLUGIN_DIRS = $NU_PLUGIN_DIRS ++ [($nu.default-config-dir | path join 'plugins')] # Appending to the OS path is a common configuration task. # Because of the previous ENV_CONVERSIONS (performed internally diff --git a/src/main.rs b/src/main.rs index 7898988844..1c82e58851 100644 --- a/src/main.rs +++ b/src/main.rs @@ -169,12 +169,21 @@ fn main() -> Result<()> { let mut default_nu_plugin_dirs_path = nushell_config_path; default_nu_plugin_dirs_path.push("plugins"); - engine_state.add_env_var( - "NU_PLUGIN_DIRS".to_string(), + engine_state.add_env_var("NU_PLUGIN_DIRS".to_string(), Value::test_list(vec![])); + let mut working_set = nu_protocol::engine::StateWorkingSet::new(&engine_state); + let var_id = working_set.add_variable( + b"$NU_PLUGIN_DIRS".into(), + Span::unknown(), + Type::List(Box::new(Type::String)), + false, + ); + working_set.set_variable_const_val( + var_id, Value::test_list(vec![Value::test_string( default_nu_plugin_dirs_path.to_string_lossy(), )]), ); + engine_state.merge_delta(working_set.render())?; // End: Default NU_LIB_DIRS, NU_PLUGIN_DIRS // This is the real secret sauce to having an in-memory sqlite db. You must diff --git a/tests/repl/test_env.rs b/tests/repl/test_env.rs index f0a2070c30..d540ce2fd4 100644 --- a/tests/repl/test_env.rs +++ b/tests/repl/test_env.rs @@ -33,7 +33,17 @@ fn default_nu_lib_dirs_type() { } #[test] -fn default_nu_plugin_dirs_type() { +fn default_nu_plugin_dirs_env_type() { + // Previously, this was a list + // While we are transitioning to const NU_PLUGIN_DIRS + // the env version will be empty, and thus a + // list let actual = nu!("$env.NU_PLUGIN_DIRS | describe"); + assert_eq!(actual.out, "list"); +} + +#[test] +fn default_nu_plugin_dirs_type() { + let actual = nu!("$NU_PLUGIN_DIRS | describe"); assert_eq!(actual.out, "list"); }