From 4af24363c239532453968d877e549d777fb1e4fa Mon Sep 17 00:00:00 2001 From: JT <547158+jntrnr@users.noreply.github.com> Date: Sat, 1 Jul 2023 07:57:51 +1200 Subject: [PATCH] remove let-env, focus on mutating $env (#9574) # Description For years, Nushell has used `let-env` to set a single environment variable. As our work on scoping continued, we refined what it meant for a variable to be in scope using `let` but never updated how `let-env` would work. Instead, `let-env` confusingly created mutations to the command's copy of `$env`. So, to help fix the mental model and point people to the right way of thinking about what changing the environment means, this PR removes `let-env` to encourage people to think of it as updating the command's environment variable via mutation. Before: ``` let-env FOO = "BAR" ``` Now: ``` $env.FOO = "BAR" ``` It's also a good reminder that the environment owned by the command is in the `$env` variable rather than global like it is in other shells. # User-Facing Changes BREAKING CHANGE BREAKING CHANGE This completely removes `let-env FOO = "BAR"` so that we can focus on `$env.FOO = "BAR"`. # Tests + Formatting # After / Before Submitting integration scripts to update: - :heavy_check_mark: [starship](https://github.com/starship/starship/blob/master/src/init/starship.nu) - :heavy_check_mark: [virtualenv](https://github.com/pypa/virtualenv/blob/main/src/virtualenv/activation/nushell/activate.nu) - :heavy_check_mark: [atuin](https://github.com/ellie/atuin/blob/main/atuin/src/shell/atuin.nu) (PR: https://github.com/ellie/atuin/pull/1080) - :x: [zoxide](https://github.com/ajeetdsouza/zoxide/blob/main/templates/nushell.txt) (PR: https://github.com/ajeetdsouza/zoxide/pull/587) - :heavy_check_mark: [oh-my-posh](https://github.com/JanDeDobbeleer/oh-my-posh/blob/main/src/shell/scripts/omp.nu) (pr: https://github.com/JanDeDobbeleer/oh-my-posh/pull/4011) --- .github/workflows/release-pkg.nu | 26 ++--- .../nu-cmd-lang/src/core_commands/def_env.rs | 2 +- .../src/core_commands/export_def_env.rs | 2 +- .../nu-cmd-lang/src/core_commands/hide_env.rs | 2 +- .../nu-cmd-lang/src/core_commands/module.rs | 4 +- .../src/core_commands/overlay/hide.rs | 2 +- .../src/core_commands/overlay/use_.rs | 2 +- crates/nu-color-config/src/style_computer.rs | 4 +- crates/nu-command/src/debug/view_source.rs | 8 +- crates/nu-command/src/default_context.rs | 2 +- crates/nu-command/src/deprecated/let_env.rs | 43 ++++++++ crates/nu-command/src/deprecated/mod.rs | 2 + crates/nu-command/src/env/export_env.rs | 4 +- crates/nu-command/src/env/let_env.rs | 72 -------------- crates/nu-command/src/env/mod.rs | 2 - crates/nu-command/src/example_test.rs | 7 +- crates/nu-command/tests/commands/nu_check.rs | 6 +- .../nu-command/tests/commands/redirection.rs | 2 +- crates/nu-command/tests/commands/rm.rs | 2 +- crates/nu-command/tests/commands/save.rs | 20 ++-- .../nu-command/tests/commands/source_env.rs | 8 +- crates/nu-command/tests/commands/table.rs | 18 ++-- crates/nu-command/tests/commands/use_.rs | 8 +- crates/nu-command/tests/commands/with_env.rs | 4 +- crates/nu-engine/src/eval.rs | 88 +++++++++-------- crates/nu-parser/src/parser.rs | 54 +++++------ crates/nu-protocol/tests/into_config.rs | 6 +- crates/nu-protocol/tests/test_config.rs | 10 +- crates/nu-std/std/dirs.nu | 10 +- crates/nu-std/std/help.nu | 8 +- crates/nu-std/std/log.nu | 10 +- crates/nu-std/std/mod.nu | 12 +-- crates/nu-std/tests/test_std.nu | 6 +- .../src/sample_config/default_config.nu | 2 +- .../nu-utils/src/sample_config/default_env.nu | 20 ++-- .../src/sample_config/sample_login.nu | 2 +- scripts/coverage-local.nu | 2 +- src/config_files.rs | 2 +- src/tests/test_engine.rs | 14 +-- src/tests/test_hiding.rs | 30 +++--- src/tests/test_modules.rs | 12 +-- src/tests/test_parser.rs | 4 +- tests/hooks/mod.rs | 97 +++++++++---------- tests/modules/mod.rs | 4 +- tests/overlays/mod.rs | 56 +++++------ tests/overlays/samples/spam.nu | 2 +- tests/parsing/mod.rs | 12 +-- tests/shell/environment/env.rs | 6 +- tests/shell/mod.rs | 18 ++-- tests/shell/pipeline/commands/internal.rs | 32 +++--- toolkit.nu | 4 +- 51 files changed, 372 insertions(+), 403 deletions(-) create mode 100644 crates/nu-command/src/deprecated/let_env.rs delete mode 100644 crates/nu-command/src/env/let_env.rs diff --git a/.github/workflows/release-pkg.nu b/.github/workflows/release-pkg.nu index 504df666209b..d14746209119 100755 --- a/.github/workflows/release-pkg.nu +++ b/.github/workflows/release-pkg.nu @@ -15,23 +15,23 @@ # unset CARGO_TARGET_DIR if set (I have to do this in the parent shell to get it to work) # 2. $env:CARGO_TARGET_DIR = "" # 2. hide-env CARGO_TARGET_DIR -# 3. let-env TARGET = 'x86_64-pc-windows-msvc' -# 4. let-env TARGET_RUSTFLAGS = '' -# 5. let-env GITHUB_WORKSPACE = 'C:\Users\dschroeder\source\repos\forks\nushell' -# 6. let-env GITHUB_OUTPUT = 'C:\Users\dschroeder\source\repos\forks\nushell\output\out.txt' -# 7. let-env OS = 'windows-latest' +# 3. $env.TARGET = 'x86_64-pc-windows-msvc' +# 4. $env.TARGET_RUSTFLAGS = '' +# 5. $env.GITHUB_WORKSPACE = 'C:\Users\dschroeder\source\repos\forks\nushell' +# 6. $env.GITHUB_OUTPUT = 'C:\Users\dschroeder\source\repos\forks\nushell\output\out.txt' +# 7. $env.OS = 'windows-latest' # make sure 7z.exe is in your path https://www.7-zip.org/download.html -# 8. let-env Path = ($env.Path | append 'c:\apps\7-zip') +# 8. $env.Path = ($env.Path | append 'c:\apps\7-zip') # make sure aria2c.exe is in your path https://github.com/aria2/aria2 -# 9. let-env Path = ($env.Path | append 'c:\path\to\aria2c') +# 9. $env.Path = ($env.Path | append 'c:\path\to\aria2c') # make sure you have the wixtools installed https://wixtoolset.org/ -# 10. let-env Path = ($env.Path | append 'C:\Users\dschroeder\AppData\Local\tauri\WixTools') +# 10. $env.Path = ($env.Path | append 'C:\Users\dschroeder\AppData\Local\tauri\WixTools') # You need to run the release-pkg twice. The first pass, with _EXTRA_ as 'bin', makes the output # folder and builds everything. The second pass, that generates the msi file, with _EXTRA_ as 'msi' -# 11. let-env _EXTRA_ = 'bin' +# 11. $env._EXTRA_ = 'bin' # 12. source .github\workflows\release-pkg.nu # 13. cd .. -# 14. let-env _EXTRA_ = 'msi' +# 14. $env._EXTRA_ = 'msi' # 15. source .github\workflows\release-pkg.nu # After msi is generated, you have to update winget-pkgs repo, you'll need to patch the release # by deleting the existing msi and uploading this new msi. Then you'll need to update the hash @@ -73,17 +73,17 @@ if $os in [$USE_UBUNTU, 'macos-latest'] { match $target { 'aarch64-unknown-linux-gnu' => { sudo apt-get install gcc-aarch64-linux-gnu -y - let-env CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER = 'aarch64-linux-gnu-gcc' + $env.CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER = 'aarch64-linux-gnu-gcc' cargo-build-nu $flags } 'riscv64gc-unknown-linux-gnu' => { sudo apt-get install gcc-riscv64-linux-gnu -y - let-env CARGO_TARGET_RISCV64GC_UNKNOWN_LINUX_GNU_LINKER = 'riscv64-linux-gnu-gcc' + $env.CARGO_TARGET_RISCV64GC_UNKNOWN_LINUX_GNU_LINKER = 'riscv64-linux-gnu-gcc' cargo-build-nu $flags } 'armv7-unknown-linux-gnueabihf' => { sudo apt-get install pkg-config gcc-arm-linux-gnueabihf -y - let-env CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER = 'arm-linux-gnueabihf-gcc' + $env.CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER = 'arm-linux-gnueabihf-gcc' cargo-build-nu $flags } _ => { diff --git a/crates/nu-cmd-lang/src/core_commands/def_env.rs b/crates/nu-cmd-lang/src/core_commands/def_env.rs index ce6adb8ecf16..10c2763897f4 100644 --- a/crates/nu-cmd-lang/src/core_commands/def_env.rs +++ b/crates/nu-cmd-lang/src/core_commands/def_env.rs @@ -48,7 +48,7 @@ impl Command for DefEnv { fn examples(&self) -> Vec { vec![Example { description: "Set environment variable by call a custom command", - example: r#"def-env foo [] { let-env BAR = "BAZ" }; foo; $env.BAR"#, + example: r#"def-env foo [] { $env.BAR = "BAZ" }; foo; $env.BAR"#, result: Some(Value::test_string("BAZ")), }] } diff --git a/crates/nu-cmd-lang/src/core_commands/export_def_env.rs b/crates/nu-cmd-lang/src/core_commands/export_def_env.rs index 1e0c7f61b9d9..54c6668f3ca5 100644 --- a/crates/nu-cmd-lang/src/core_commands/export_def_env.rs +++ b/crates/nu-cmd-lang/src/core_commands/export_def_env.rs @@ -73,7 +73,7 @@ export def-env cd_with_fallback [arg = ""] { fn examples(&self) -> Vec { vec![Example { description: "Define a custom command that participates in the environment in a module and call it", - example: r#"module foo { export def-env bar [] { let-env FOO_BAR = "BAZ" } }; use foo bar; bar; $env.FOO_BAR"#, + example: r#"module foo { export def-env bar [] { $env.FOO_BAR = "BAZ" } }; use foo bar; bar; $env.FOO_BAR"#, result: Some(Value::test_string("BAZ")), }] } diff --git a/crates/nu-cmd-lang/src/core_commands/hide_env.rs b/crates/nu-cmd-lang/src/core_commands/hide_env.rs index b582b32df891..403f5a7a92f2 100644 --- a/crates/nu-cmd-lang/src/core_commands/hide_env.rs +++ b/crates/nu-cmd-lang/src/core_commands/hide_env.rs @@ -72,7 +72,7 @@ impl Command for HideEnv { fn examples(&self) -> Vec { vec![Example { description: "Hide an environment variable", - example: r#"let-env HZ_ENV_ABC = 1; hide-env HZ_ENV_ABC; 'HZ_ENV_ABC' in (env).name"#, + example: r#"$env.HZ_ENV_ABC = 1; hide-env HZ_ENV_ABC; 'HZ_ENV_ABC' in (env).name"#, result: Some(Value::test_bool(false)), }] } diff --git a/crates/nu-cmd-lang/src/core_commands/module.rs b/crates/nu-cmd-lang/src/core_commands/module.rs index 8bc3ece6b59e..d7a91e5ebf39 100644 --- a/crates/nu-cmd-lang/src/core_commands/module.rs +++ b/crates/nu-cmd-lang/src/core_commands/module.rs @@ -57,12 +57,12 @@ impl Command for Module { }, Example { description: "Define an environment variable in a module", - example: r#"module foo { export-env { let-env FOO = "BAZ" } }; use foo; $env.FOO"#, + example: r#"module foo { export-env { $env.FOO = "BAZ" } }; use foo; $env.FOO"#, result: Some(Value::test_string("BAZ")), }, Example { description: "Define a custom command that participates in the environment in a module and call it", - example: r#"module foo { export def-env bar [] { let-env FOO_BAR = "BAZ" } }; use foo bar; bar; $env.FOO_BAR"#, + example: r#"module foo { export def-env bar [] { $env.FOO_BAR = "BAZ" } }; use foo bar; bar; $env.FOO_BAR"#, result: Some(Value::test_string("BAZ")), }, ] diff --git a/crates/nu-cmd-lang/src/core_commands/overlay/hide.rs b/crates/nu-cmd-lang/src/core_commands/overlay/hide.rs index f05e069a3360..f90b78481a6e 100644 --- a/crates/nu-cmd-lang/src/core_commands/overlay/hide.rs +++ b/crates/nu-cmd-lang/src/core_commands/overlay/hide.rs @@ -120,7 +120,7 @@ impl Command for OverlayHide { }, Example { description: "Hide the last activated overlay", - example: r#"module spam { export-env { let-env FOO = "foo" } } + example: r#"module spam { export-env { $env.FOO = "foo" } } overlay use spam overlay hide"#, result: None, diff --git a/crates/nu-cmd-lang/src/core_commands/overlay/use_.rs b/crates/nu-cmd-lang/src/core_commands/overlay/use_.rs index 1917bb6c3e95..6eb0c4a32696 100644 --- a/crates/nu-cmd-lang/src/core_commands/overlay/use_.rs +++ b/crates/nu-cmd-lang/src/core_commands/overlay/use_.rs @@ -188,7 +188,7 @@ impl Command for OverlayUse { }, Example { description: "Create an overlay from a file", - example: r#"'export-env { let-env FOO = "foo" }' | save spam.nu + example: r#"'export-env { $env.FOO = "foo" }' | save spam.nu overlay use spam.nu $env.FOO"#, result: None, diff --git a/crates/nu-color-config/src/style_computer.rs b/crates/nu-color-config/src/style_computer.rs index ca4e10d60366..25d578573de5 100644 --- a/crates/nu-color-config/src/style_computer.rs +++ b/crates/nu-color-config/src/style_computer.rs @@ -238,7 +238,7 @@ fn test_computable_style_closure_basic() { use nu_test_support::{nu, nu_repl_code, playground::Playground}; Playground::setup("computable_style_closure_basic", |dirs, _| { let inp = [ - r#"let-env config = { + r#"$env.config = { color_config: { string: {|e| touch ($e + '.obj'); 'red' } } @@ -256,7 +256,7 @@ fn test_computable_style_closure_basic() { fn test_computable_style_closure_errors() { use nu_test_support::{nu, nu_repl_code}; let inp = [ - r#"let-env config = { + r#"$env.config = { color_config: { string: {|e| $e + 2 } } diff --git a/crates/nu-command/src/debug/view_source.rs b/crates/nu-command/src/debug/view_source.rs index 7d33427e37d6..60d4f2595af7 100644 --- a/crates/nu-command/src/debug/view_source.rs +++ b/crates/nu-command/src/debug/view_source.rs @@ -163,8 +163,8 @@ impl Command for ViewSource { }, Example { description: "View the source of a custom command, which participates in the caller environment", - example: r#"def-env foo [] { let-env BAR = 'BAZ' }; view source foo"#, - result: Some(Value::test_string("def foo [] { let-env BAR = 'BAZ' }")), + example: r#"def-env foo [] { $env.BAR = 'BAZ' }; view source foo"#, + result: Some(Value::test_string("def foo [] { $env.BAR = 'BAZ' }")), }, Example { description: "View the source of a custom command with flags and arguments", @@ -173,8 +173,8 @@ impl Command for ViewSource { }, Example { description: "View the source of a module", - example: r#"module mod-foo { export-env { let-env FOO_ENV = 'BAZ' } }; view source mod-foo"#, - result: Some(Value::test_string(" export-env { let-env FOO_ENV = 'BAZ' }")), + example: r#"module mod-foo { export-env { $env.FOO_ENV = 'BAZ' } }; view source mod-foo"#, + result: Some(Value::test_string(" export-env { $env.FOO_ENV = 'BAZ' }")), }, Example { description: "View the source of an alias", diff --git a/crates/nu-command/src/default_context.rs b/crates/nu-command/src/default_context.rs index bc907bf23f8f..50d01c709785 100644 --- a/crates/nu-command/src/default_context.rs +++ b/crates/nu-command/src/default_context.rs @@ -315,8 +315,8 @@ pub fn add_shell_command_context(mut engine_state: EngineState) -> EngineState { // Env bind_command! { + LetEnvDeprecated, ExportEnv, - LetEnv, LoadEnv, SourceEnv, WithEnv, diff --git a/crates/nu-command/src/deprecated/let_env.rs b/crates/nu-command/src/deprecated/let_env.rs new file mode 100644 index 000000000000..84ecb214fb8f --- /dev/null +++ b/crates/nu-command/src/deprecated/let_env.rs @@ -0,0 +1,43 @@ +use nu_protocol::ast::Call; +use nu_protocol::engine::{Command, EngineState, Stack}; +use nu_protocol::{Category, PipelineData, ShellError, Signature, SyntaxShape, Type}; + +#[derive(Clone)] +pub struct LetEnvDeprecated; + +impl Command for LetEnvDeprecated { + fn name(&self) -> &str { + "let-env" + } + + fn signature(&self) -> Signature { + Signature::build(self.name()) + .input_output_types(vec![(Type::Nothing, Type::Nothing)]) + .allow_variants_without_examples(true) + .required("var_name", SyntaxShape::String, "variable name") + .required( + "initial_value", + SyntaxShape::Keyword(b"=".to_vec(), Box::new(SyntaxShape::MathExpression)), + "equals sign followed by value", + ) + .category(Category::Deprecated) + } + + fn usage(&self) -> &str { + "`let-env FOO = ...` is deprecated, use `$env.FOO = ...` instead." + } + + fn run( + &self, + _: &EngineState, + _: &mut Stack, + call: &Call, + _: PipelineData, + ) -> Result { + Err(nu_protocol::ShellError::DeprecatedCommand( + self.name().to_string(), + "$nu. = ...".to_owned(), + call.head, + )) + } +} diff --git a/crates/nu-command/src/deprecated/mod.rs b/crates/nu-command/src/deprecated/mod.rs index 8ab61d68303a..40e993f189d4 100644 --- a/crates/nu-command/src/deprecated/mod.rs +++ b/crates/nu-command/src/deprecated/mod.rs @@ -1,6 +1,7 @@ mod collect; mod deprecated_commands; mod hash_base64; +mod let_env; mod lpad; mod math_eval; mod rpad; @@ -12,6 +13,7 @@ mod str_int; pub use collect::StrCollectDeprecated; pub use deprecated_commands::*; pub use hash_base64::HashBase64; +pub use let_env::LetEnvDeprecated; pub use lpad::LPadDeprecated; pub use math_eval::SubCommand as MathEvalDeprecated; pub use rpad::RPadDeprecated; diff --git a/crates/nu-command/src/env/export_env.rs b/crates/nu-command/src/env/export_env.rs index bda426ddbd09..53c90f92eb54 100644 --- a/crates/nu-command/src/env/export_env.rs +++ b/crates/nu-command/src/env/export_env.rs @@ -57,14 +57,14 @@ impl Command for ExportEnv { vec![ Example { description: "Set an environment variable", - example: r#"export-env { let-env SPAM = 'eggs' }"#, + example: r#"export-env { $env.SPAM = 'eggs' }"#, result: Some(Value::Nothing { span: Span::test_data(), }), }, Example { description: "Set an environment variable and examine its value", - example: r#"export-env { let-env SPAM = 'eggs' }; $env.SPAM"#, + example: r#"export-env { $env.SPAM = 'eggs' }; $env.SPAM"#, result: Some(Value::test_string("eggs")), }, ] diff --git a/crates/nu-command/src/env/let_env.rs b/crates/nu-command/src/env/let_env.rs deleted file mode 100644 index d49aa1f22ec3..000000000000 --- a/crates/nu-command/src/env/let_env.rs +++ /dev/null @@ -1,72 +0,0 @@ -use nu_engine::{eval_expression_with_input, CallExt}; -use nu_protocol::ast::Call; -use nu_protocol::engine::{Command, EngineState, Stack}; -use nu_protocol::{ - Category, Example, PipelineData, ShellError, Signature, Spanned, SyntaxShape, Type, Value, -}; - -#[derive(Clone)] -pub struct LetEnv; - -impl Command for LetEnv { - fn name(&self) -> &str { - "let-env" - } - - fn usage(&self) -> &str { - "Create an environment variable and give it a value." - } - - fn signature(&self) -> nu_protocol::Signature { - Signature::build("let-env") - .input_output_types(vec![(Type::Nothing, Type::Nothing)]) - .allow_variants_without_examples(true) - .required("var_name", SyntaxShape::String, "variable name") - .required( - "initial_value", - SyntaxShape::Keyword(b"=".to_vec(), Box::new(SyntaxShape::MathExpression)), - "equals sign followed by value", - ) - .category(Category::Env) - } - - fn run( - &self, - engine_state: &EngineState, - stack: &mut Stack, - call: &Call, - input: PipelineData, - ) -> Result { - // TODO: find and require the crossplatform restrictions on environment names - let env_var: Spanned = call.req(engine_state, stack, 0)?; - - let keyword_expr = call - .positional_nth(1) - .expect("checked through parser") - .as_keyword() - .expect("internal error: missing keyword"); - - let rhs = - eval_expression_with_input(engine_state, stack, keyword_expr, input, false, true)? - .0 - .into_value(call.head); - - if env_var.item == "FILE_PWD" || env_var.item == "CURRENT_FILE" || env_var.item == "PWD" { - return Err(ShellError::AutomaticEnvVarSetManually { - envvar_name: env_var.item, - span: env_var.span, - }); - } else { - stack.add_env_var(env_var.item, rhs); - } - Ok(PipelineData::empty()) - } - - fn examples(&self) -> Vec { - vec![Example { - description: "Create an environment variable and display it", - example: "let-env MY_ENV_VAR = 1; $env.MY_ENV_VAR", - result: Some(Value::test_int(1)), - }] - } -} diff --git a/crates/nu-command/src/env/mod.rs b/crates/nu-command/src/env/mod.rs index 467038485c87..2a72df502908 100644 --- a/crates/nu-command/src/env/mod.rs +++ b/crates/nu-command/src/env/mod.rs @@ -1,6 +1,5 @@ mod config; mod export_env; -mod let_env; mod load_env; mod source_env; mod with_env; @@ -10,7 +9,6 @@ pub use config::ConfigMeta; pub use config::ConfigNu; pub use config::ConfigReset; pub use export_env::ExportEnv; -pub use let_env::LetEnv; pub use load_env::LoadEnv; pub use source_env::SourceEnv; pub use with_env::WithEnv; diff --git a/crates/nu-command/src/example_test.rs b/crates/nu-command/src/example_test.rs index f4cf8c6910d2..fb6b122c7eb9 100644 --- a/crates/nu-command/src/example_test.rs +++ b/crates/nu-command/src/example_test.rs @@ -9,9 +9,9 @@ pub fn test_examples(cmd: impl Command + 'static) { #[cfg(test)] mod test_examples { use super::super::{ - Ansi, Date, Enumerate, Flatten, From, Get, Into, IntoString, LetEnv, Math, MathEuler, - MathPi, MathRound, ParEach, Path, PathParse, Random, Sort, SortBy, Split, SplitColumn, - SplitRow, Str, StrJoin, StrLength, StrReplace, Update, Url, Values, Wrap, + Ansi, Date, Enumerate, Flatten, From, Get, Into, IntoString, Math, MathEuler, MathPi, + MathRound, ParEach, Path, PathParse, Random, Sort, SortBy, Split, SplitColumn, SplitRow, + Str, StrJoin, StrLength, StrReplace, Update, Url, Values, Wrap, }; use crate::{Each, To}; use nu_cmd_lang::example_support::{ @@ -78,7 +78,6 @@ mod test_examples { working_set.add_decl(Box::new(Into)); working_set.add_decl(Box::new(IntoString)); working_set.add_decl(Box::new(Let)); - working_set.add_decl(Box::new(LetEnv)); working_set.add_decl(Box::new(Math)); working_set.add_decl(Box::new(MathEuler)); working_set.add_decl(Box::new(MathPi)); diff --git a/crates/nu-command/tests/commands/nu_check.rs b/crates/nu-command/tests/commands/nu_check.rs index c6482e420ba0..b9c97a1d6748 100644 --- a/crates/nu-command/tests/commands/nu_check.rs +++ b/crates/nu-command/tests/commands/nu_check.rs @@ -230,7 +230,7 @@ fn parse_module_success_2() { r#" # foo.nu - export-env { let-env MYNAME = "Arthur, King of the Britons" } + export-env { $env.MYNAME = "Arthur, King of the Britons" } "#, )]); @@ -749,7 +749,7 @@ fn parse_script_with_nested_scripts_success() { .with_files(vec![FileWithContentToBeTrimmed( "foo.nu", r#" - let-env FOO = 'foo' + $env.FOO = 'foo' "#, )]); @@ -772,7 +772,7 @@ fn nu_check_respects_file_pwd() { .with_files(vec![FileWithContentToBeTrimmed( "lol/lol.nu", r#" - let-env RETURN = (nu-check ../foo.nu) + $env.RETURN = (nu-check ../foo.nu) "#, )]) .with_files(vec![FileWithContentToBeTrimmed( diff --git a/crates/nu-command/tests/commands/redirection.rs b/crates/nu-command/tests/commands/redirection.rs index c4b0c02b9aa5..3582ff67aebe 100644 --- a/crates/nu-command/tests/commands/redirection.rs +++ b/crates/nu-command/tests/commands/redirection.rs @@ -143,7 +143,7 @@ fn same_target_redirection_with_too_much_stderr_not_hang_nushell() { nu!( cwd: dirs.test(), pipeline( r#" - let-env LARGE = (open --raw a_large_file.txt); + $env.LARGE = (open --raw a_large_file.txt); nu --testbin echo_env_stderr LARGE out+err> another_large_file.txt "# ), diff --git a/crates/nu-command/tests/commands/rm.rs b/crates/nu-command/tests/commands/rm.rs index f0aced78cfb5..978a80325051 100644 --- a/crates/nu-command/tests/commands/rm.rs +++ b/crates/nu-command/tests/commands/rm.rs @@ -142,7 +142,7 @@ fn errors_if_attempting_to_delete_home() { Playground::setup("rm_test_8", |dirs, _| { let actual = nu!( cwd: dirs.root(), - "let-env HOME = myhome ; rm -rf ~" + "$env.HOME = myhome ; rm -rf ~" ); assert!(actual.err.contains("please use -I or -i")); diff --git a/crates/nu-command/tests/commands/save.rs b/crates/nu-command/tests/commands/save.rs index 8bc16727e40a..3518e2038957 100644 --- a/crates/nu-command/tests/commands/save.rs +++ b/crates/nu-command/tests/commands/save.rs @@ -91,8 +91,8 @@ fn save_stderr_and_stdout_to_afame_file() { let actual = nu!( cwd: dirs.root(), r#" - let-env FOO = "bar"; - let-env BAZ = "ZZZ"; + $env.FOO = "bar"; + $env.BAZ = "ZZZ"; do -c {nu -c 'nu --testbin echo_env FOO; nu --testbin echo_env_stderr BAZ'} | save -r save_test_5/new-file.txt --stderr save_test_5/new-file.txt "#, ); @@ -113,8 +113,8 @@ fn save_stderr_and_stdout_to_diff_file() { nu!( cwd: dirs.root(), r#" - let-env FOO = "bar"; - let-env BAZ = "ZZZ"; + $env.FOO = "bar"; + $env.BAZ = "ZZZ"; do -c {nu -c 'nu --testbin echo_env FOO; nu --testbin echo_env_stderr BAZ'} | save -r save_test_6/log.txt --stderr save_test_6/err.txt "#, ); @@ -206,8 +206,8 @@ fn save_append_works_on_stderr() { nu!( cwd: dirs.root(), r#" - let-env FOO = " New"; - let-env BAZ = " New Err"; + $env.FOO = " New"; + $env.BAZ = " New Err"; do -i {nu -c 'nu --testbin echo_env FOO; nu --testbin echo_env_stderr BAZ'} | save -a -r save_test_11/log.txt --stderr save_test_11/err.txt"#, ); @@ -227,8 +227,8 @@ fn save_not_overrides_err_by_default() { let actual = nu!( cwd: dirs.root(), r#" - let-env FOO = " New"; - let-env BAZ = " New Err"; + $env.FOO = " New"; + $env.BAZ = " New Err"; do -i {nu -c 'nu --testbin echo_env FOO; nu --testbin echo_env_stderr BAZ'} | save -r save_test_12/log.txt --stderr save_test_12/err.txt"#, ); @@ -250,8 +250,8 @@ fn save_override_works_stderr() { nu!( cwd: dirs.root(), r#" - let-env FOO = "New"; - let-env BAZ = "New Err"; + $env.FOO = "New"; + $env.BAZ = "New Err"; do -i {nu -c 'nu --testbin echo_env FOO; nu --testbin echo_env_stderr BAZ'} | save -f -r save_test_13/log.txt --stderr save_test_13/err.txt"#, ); diff --git a/crates/nu-command/tests/commands/source_env.rs b/crates/nu-command/tests/commands/source_env.rs index 56b20d48609f..439c821575bf 100644 --- a/crates/nu-command/tests/commands/source_env.rs +++ b/crates/nu-command/tests/commands/source_env.rs @@ -31,7 +31,7 @@ fn sources_also_files_under_custom_lib_dirs_path() { nu.within("lib/my_library").with_files(vec![FileWithContent( "main.nu", r#" - let-env hello = "hello nu" + $env.hello = "hello nu" "#, )]); @@ -163,7 +163,7 @@ fn source_env_eval_export_env() { sandbox.with_files(vec![FileWithContentToBeTrimmed( "spam.nu", r#" - export-env { let-env FOO = 'foo' } + export-env { $env.FOO = 'foo' } "#, )]); @@ -186,7 +186,7 @@ fn source_env_eval_export_env_hide() { )]); let inp = &[ - r#"let-env FOO = 'foo'"#, + r#"$env.FOO = 'foo'"#, r#"source-env spam.nu"#, r#"$env.FOO"#, ]; @@ -299,7 +299,7 @@ fn source_env_const_file() { sandbox.with_files(vec![FileWithContentToBeTrimmed( "spam.nu", r#" - let-env FOO = 'foo' + $env.FOO = 'foo' "#, )]); diff --git a/crates/nu-command/tests/commands/table.rs b/crates/nu-command/tests/commands/table.rs index 5a0fdcb68416..37c20d1dee2c 100644 --- a/crates/nu-command/tests/commands/table.rs +++ b/crates/nu-command/tests/commands/table.rs @@ -38,7 +38,7 @@ fn table_collapse_0() { #[test] fn table_collapse_basic() { let actual = nu!(nu_repl_code(&[ - "let-env config = { table: { mode: basic }};", + "$env.config = { table: { mode: basic }};", "[[a b, c]; [1 2 3] [4 5 [1 2 3]]] | table --collapse" ])); assert_eq!( @@ -60,7 +60,7 @@ fn table_collapse_basic() { #[test] fn table_collapse_heavy() { let actual = nu!(nu_repl_code(&[ - "let-env config = { table: { mode: heavy }};", + "$env.config = { table: { mode: heavy }};", "[[a b, c]; [1 2 3] [4 5 [1 2 3]]] | table --collapse" ])); assert_eq!( @@ -82,7 +82,7 @@ fn table_collapse_heavy() { #[test] fn table_collapse_compact() { let actual = nu!(nu_repl_code(&[ - "let-env config = { table: { mode: compact }};", + "$env.config = { table: { mode: compact }};", "[[a b, c]; [1 2 3] [4 5 [1 2 3]]] | table --collapse" ])); assert_eq!( @@ -104,7 +104,7 @@ fn table_collapse_compact() { #[test] fn table_collapse_compact_double() { let actual = nu!(nu_repl_code(&[ - "let-env config = { table: { mode: compact_double }};", + "$env.config = { table: { mode: compact_double }};", "[[a b, c]; [1 2 3] [4 5 [1 2 3]]] | table --collapse" ])); assert_eq!( @@ -126,7 +126,7 @@ fn table_collapse_compact_double() { #[test] fn table_collapse_compact_light() { let actual = nu!(nu_repl_code(&[ - "let-env config = { table: { mode: light }};", + "$env.config = { table: { mode: light }};", "[[a b, c]; [1 2 3] [4 5 [1 2 3]]] | table --collapse" ])); assert_eq!( @@ -148,7 +148,7 @@ fn table_collapse_compact_light() { #[test] fn table_collapse_none() { let actual = nu!(nu_repl_code(&[ - "let-env config = { table: { mode: none }};", + "$env.config = { table: { mode: none }};", "[[a b, c]; [1 2 3] [4 5 [1 2 3]]] | table --collapse" ])); assert_eq!( @@ -166,7 +166,7 @@ fn table_collapse_none() { #[test] fn table_collapse_compact_reinforced() { let actual = nu!(nu_repl_code(&[ - "let-env config = { table: { mode: reinforced }};", + "$env.config = { table: { mode: reinforced }};", "[[a b, c]; [1 2 3] [4 5 [1 2 3]]] | table --collapse" ])); assert_eq!( @@ -188,7 +188,7 @@ fn table_collapse_compact_reinforced() { #[test] fn table_collapse_compact_thin() { let actual = nu!(nu_repl_code(&[ - "let-env config = { table: { mode: thin }};", + "$env.config = { table: { mode: thin }};", "[[a b, c]; [1 2 3] [4 5 [1 2 3]]] | table --collapse" ])); assert_eq!( @@ -210,7 +210,7 @@ fn table_collapse_compact_thin() { #[test] fn table_collapse_hearts() { let actual = nu!(nu_repl_code(&[ - "let-env config = { table: { mode: with_love }};", + "$env.config = { table: { mode: with_love }};", "[[a b, c]; [1 2 3] [4 5 [1 2 3]]] | table --collapse" ])); assert_eq!( diff --git a/crates/nu-command/tests/commands/use_.rs b/crates/nu-command/tests/commands/use_.rs index e5a5644e7e72..d5ade1e480c8 100644 --- a/crates/nu-command/tests/commands/use_.rs +++ b/crates/nu-command/tests/commands/use_.rs @@ -71,7 +71,7 @@ fn use_eval_export_env() { sandbox.with_files(vec![FileWithContentToBeTrimmed( "spam.nu", r#" - export-env { let-env FOO = 'foo' } + export-env { $env.FOO = 'foo' } "#, )]); @@ -93,7 +93,7 @@ fn use_eval_export_env_hide() { "#, )]); - let inp = &[r#"let-env FOO = 'foo'"#, r#"use spam.nu"#, r#"$env.FOO"#]; + let inp = &[r#"$env.FOO = 'foo'"#, r#"use spam.nu"#, r#"$env.FOO"#]; let actual = nu!(cwd: dirs.test(), pipeline(&inp.join("; "))); @@ -173,7 +173,7 @@ fn use_export_env_combined() { r#" def foo [] { 'foo' } alias bar = foo - export-env { let-env FOO = (bar) } + export-env { $env.FOO = (bar) } "#, )]); @@ -267,7 +267,7 @@ fn use_main_4() { #[test] fn use_main_def_env() { let inp = &[ - r#"module spam { export def-env main [] { let-env SPAM = "spam" } }"#, + r#"module spam { export def-env main [] { $env.SPAM = "spam" } }"#, r#"use spam"#, r#"spam"#, r#"$env.SPAM"#, diff --git a/crates/nu-command/tests/commands/with_env.rs b/crates/nu-command/tests/commands/with_env.rs index eb899a027902..2031a4f96e28 100644 --- a/crates/nu-command/tests/commands/with_env.rs +++ b/crates/nu-command/tests/commands/with_env.rs @@ -70,7 +70,7 @@ fn with_env_hides_variables_in_parent_scope() { let actual = nu!( cwd: "tests/fixtures/formats", r#" - let-env FOO = "1" + $env.FOO = "1" print $env.FOO with-env [FOO null] { echo $env.FOO @@ -87,7 +87,7 @@ fn with_env_shorthand_can_not_hide_variables() { let actual = nu!( cwd: "tests/fixtures/formats", r#" - let-env FOO = "1" + $env.FOO = "1" print $env.FOO FOO=null print $env.FOO print $env.FOO diff --git a/crates/nu-engine/src/eval.rs b/crates/nu-engine/src/eval.rs index a2f22f8fff1d..775689de0894 100644 --- a/crates/nu-engine/src/eval.rs +++ b/crates/nu-engine/src/eval.rs @@ -489,51 +489,63 @@ pub fn eval_expression( Err(ShellError::AssignmentRequiresMutableVar { lhs_span: lhs.span }) } } - Expr::FullCellPath(cell_path) => match &cell_path.head.expr { - Expr::Var(var_id) | Expr::VarDecl(var_id) => { - // The $env variable is considered "mutable" in Nushell. - // As such, give it special treatment here. - let is_env = var_id == &ENV_VARIABLE_ID; - if is_env || engine_state.get_var(*var_id).mutable { - let mut lhs = - eval_expression(engine_state, stack, &cell_path.head)?; - - lhs.upsert_data_at_cell_path(&cell_path.tail, rhs)?; - if is_env { - if cell_path.tail.is_empty() { - return Err(ShellError::CannotReplaceEnv { - span: cell_path.head.span, - }); - } - - // The special $env treatment: for something like $env.config.history.max_size = 2000, - // get $env.config (or whichever one it is) AFTER the above mutation, and set it - // as the "config" environment variable. - let vardata = lhs.follow_cell_path( - &[cell_path.tail[0].clone()], - false, - )?; - match &cell_path.tail[0] { - PathMember::String { val, .. } => { - stack.add_env_var(val.to_string(), vardata); + Expr::FullCellPath(cell_path) => { + match &cell_path.head.expr { + Expr::Var(var_id) | Expr::VarDecl(var_id) => { + // The $env variable is considered "mutable" in Nushell. + // As such, give it special treatment here. + let is_env = var_id == &ENV_VARIABLE_ID; + if is_env || engine_state.get_var(*var_id).mutable { + let mut lhs = + eval_expression(engine_state, stack, &cell_path.head)?; + + lhs.upsert_data_at_cell_path(&cell_path.tail, rhs)?; + if is_env { + if cell_path.tail.is_empty() { + return Err(ShellError::CannotReplaceEnv { + span: cell_path.head.span, + }); } - // In case someone really wants an integer env-var - PathMember::Int { val, .. } => { - stack.add_env_var(val.to_string(), vardata); + + // The special $env treatment: for something like $env.config.history.max_size = 2000, + // get $env.config (or whichever one it is) AFTER the above mutation, and set it + // as the "config" environment variable. + let vardata = lhs.follow_cell_path( + &[cell_path.tail[0].clone()], + false, + )?; + match &cell_path.tail[0] { + PathMember::String { val, span, .. } => { + if val == "FILE_PWD" + || val == "CURRENT_FILE" + || val == "PWD" + { + return Err(ShellError::AutomaticEnvVarSetManually { + envvar_name: val.to_string(), + span: *span, + }); + } else { + stack.add_env_var(val.to_string(), vardata); + } + } + // In case someone really wants an integer env-var + PathMember::Int { val, .. } => { + stack.add_env_var(val.to_string(), vardata); + } } + } else { + stack.add_var(*var_id, lhs); } + Ok(Value::nothing(cell_path.head.span)) } else { - stack.add_var(*var_id, lhs); + Err(ShellError::AssignmentRequiresMutableVar { + lhs_span: lhs.span, + }) } - Ok(Value::nothing(cell_path.head.span)) - } else { - Err(ShellError::AssignmentRequiresMutableVar { - lhs_span: lhs.span, - }) } + _ => Err(ShellError::AssignmentRequiresVar { lhs_span: lhs.span }), } - _ => Err(ShellError::AssignmentRequiresVar { lhs_span: lhs.span }), - }, + } _ => Err(ShellError::AssignmentRequiresVar { lhs_span: lhs.span }), } } diff --git a/crates/nu-parser/src/parser.rs b/crates/nu-parser/src/parser.rs index 13d59c535959..5d5e4b15b0c1 100644 --- a/crates/nu-parser/src/parser.rs +++ b/crates/nu-parser/src/parser.rs @@ -5343,46 +5343,38 @@ pub fn parse_block( if idx == 0 { if let Some(let_decl_id) = working_set.find_decl(b"let", &Type::Nothing) { - if let Some(let_env_decl_id) = - working_set.find_decl(b"let-env", &Type::Nothing) - { - for element in pipeline.elements.iter_mut() { - if let PipelineElement::Expression( - _, - Expression { - expr: Expr::Call(call), + for element in pipeline.elements.iter_mut() { + if let PipelineElement::Expression( + _, + Expression { + expr: Expr::Call(call), + .. + }, + ) = element + { + if call.decl_id == let_decl_id { + // Do an expansion + if let Some(Expression { + expr: Expr::Keyword(_, _, expr), .. - }, - ) = element - { - if call.decl_id == let_decl_id - || call.decl_id == let_env_decl_id + }) = call.positional_iter_mut().nth(1) { - // Do an expansion - if let Some(Expression { - expr: Expr::Keyword(_, _, expr), - .. - }) = call.positional_iter_mut().nth(1) - { - if expr.has_in_variable(working_set) { - *expr = Box::new(wrap_expr_with_collect( - working_set, - expr, - )); - } + if expr.has_in_variable(working_set) { + *expr = Box::new(wrap_expr_with_collect( + working_set, + expr, + )); } - continue; - } else if element.has_in_variable(working_set) - && !is_subexpression - { - *element = - wrap_element_with_collect(working_set, element); } + continue; } else if element.has_in_variable(working_set) && !is_subexpression { *element = wrap_element_with_collect(working_set, element); } + } else if element.has_in_variable(working_set) && !is_subexpression + { + *element = wrap_element_with_collect(working_set, element); } } } diff --git a/crates/nu-protocol/tests/into_config.rs b/crates/nu-protocol/tests/into_config.rs index d06ae3e83823..a6da0801a5da 100644 --- a/crates/nu-protocol/tests/into_config.rs +++ b/crates/nu-protocol/tests/into_config.rs @@ -2,7 +2,7 @@ use nu_test_support::{nu, nu_repl_code}; #[test] fn config_is_mutable() { - let actual = nu!(cwd: ".", nu_repl_code(&[r"let-env config = { ls: { clickable_links: true } }", + let actual = nu!(cwd: ".", nu_repl_code(&[r"$env.config = { ls: { clickable_links: true } }", "$env.config.ls.clickable_links = false;", "$env.config.ls.clickable_links"])); @@ -11,7 +11,7 @@ fn config_is_mutable() { #[test] fn config_preserved_after_do() { - let actual = nu!(cwd: ".", nu_repl_code(&[r"let-env config = { ls: { clickable_links: true } }", + let actual = nu!(cwd: ".", nu_repl_code(&[r"$env.config = { ls: { clickable_links: true } }", "do -i { $env.config.ls.clickable_links = false }", "$env.config.ls.clickable_links"])); @@ -20,7 +20,7 @@ fn config_preserved_after_do() { #[test] fn config_affected_when_mutated() { - let actual = nu!(cwd: ".", nu_repl_code(&[r#"let-env config = { filesize: { metric: false, format:"auto" } }"#, + let actual = nu!(cwd: ".", nu_repl_code(&[r#"$env.config = { filesize: { metric: false, format:"auto" } }"#, r#"$env.config = { filesize: { metric: true, format:"auto" } }"#, "20mib | into string"])); diff --git a/crates/nu-protocol/tests/test_config.rs b/crates/nu-protocol/tests/test_config.rs index 7a1624eb746a..b03ff1fd5625 100644 --- a/crates/nu-protocol/tests/test_config.rs +++ b/crates/nu-protocol/tests/test_config.rs @@ -3,7 +3,7 @@ use nu_test_support::{nu, nu_repl_code}; #[test] fn filesize_metric_true() { let code = &[ - r#"let-env config = { filesize: { metric: true, format:"mb" } }"#, + r#"$env.config = { filesize: { metric: true, format:"mb" } }"#, r#"20mib | into string"#, ]; let actual = nu!(cwd: ".", nu_repl_code( code )); @@ -13,7 +13,7 @@ fn filesize_metric_true() { #[test] fn filesize_metric_false() { let code = &[ - r#"let-env config = { filesize: { metric: false, format:"mib" } }"#, + r#"$env.config = { filesize: { metric: false, format:"mib" } }"#, r#"20mib | into string"#, ]; let actual = nu!(cwd: ".", nu_repl_code( code )); @@ -23,7 +23,7 @@ fn filesize_metric_false() { #[test] fn filesize_metric_overrides_format() { let code = &[ - r#"let-env config = { filesize: { metric: false, format:"mb" } }"#, + r#"$env.config = { filesize: { metric: false, format:"mb" } }"#, r#"20mib | into string"#, ]; let actual = nu!(cwd: ".", nu_repl_code( code )); @@ -33,7 +33,7 @@ fn filesize_metric_overrides_format() { #[test] fn filesize_format_auto_metric_true() { let code = &[ - r#"let-env config = { filesize: { metric: true, format:"auto" } }"#, + r#"$env.config = { filesize: { metric: true, format:"auto" } }"#, r#"[2mb 2gb 2tb] | into string | to nuon"#, ]; let actual = nu!(cwd: ".", nu_repl_code( code )); @@ -43,7 +43,7 @@ fn filesize_format_auto_metric_true() { #[test] fn filesize_format_auto_metric_false() { let code = &[ - r#"let-env config = { filesize: { metric: false, format:"auto" } }"#, + r#"$env.config = { filesize: { metric: false, format:"auto" } }"#, r#"[2mb 2gb 2tb] | into string | to nuon"#, ]; let actual = nu!(cwd: ".", nu_repl_code( code )); diff --git a/crates/nu-std/std/dirs.nu b/crates/nu-std/std/dirs.nu index c8bc148275ac..6a10a8d46101 100644 --- a/crates/nu-std/std/dirs.nu +++ b/crates/nu-std/std/dirs.nu @@ -17,8 +17,8 @@ # This situation could arise if we started with [/a, /b, /c], then # we changed directories from /b to /var/tmp. export-env { - let-env DIRS_POSITION = 0 - let-env DIRS_LIST = [($env.PWD | path expand)] + $env.DIRS_POSITION = 0 + $env.DIRS_LIST = [($env.PWD | path expand)] } # Add one or more directories to the list. @@ -36,7 +36,7 @@ export def-env add [ $abspaths = ($abspaths | append $exp) } - let-env DIRS_LIST = ($env.DIRS_LIST | insert ($env.DIRS_POSITION + 1) $abspaths | flatten) + $env.DIRS_LIST = ($env.DIRS_LIST | insert ($env.DIRS_POSITION + 1) $abspaths | flatten) _fetch 1 @@ -66,7 +66,7 @@ export alias p = prev # PWD becomes the next working directory export def-env drop [] { if ($env.DIRS_LIST | length) > 1 { - let-env DIRS_LIST = ($env.DIRS_LIST | reject $env.DIRS_POSITION) + $env.DIRS_LIST = ($env.DIRS_LIST | reject $env.DIRS_POSITION) if ($env.DIRS_POSITION >= ($env.DIRS_LIST | length)) {$env.DIRS_POSITION = 0} } @@ -111,7 +111,7 @@ export def-env goto [shell?: int] { } } } - let-env DIRS_POSITION = $shell + $env.DIRS_POSITION = $shell cd ($env.DIRS_LIST | get $env.DIRS_POSITION) } diff --git a/crates/nu-std/std/help.nu b/crates/nu-std/std/help.nu index a379901acc0b..c8de4103b1e7 100644 --- a/crates/nu-std/std/help.nu +++ b/crates/nu-std/std/help.nu @@ -164,7 +164,7 @@ def build-module-page [module: record] { # > export def baz [] { "foo::baz" } # > # > export-env { -# > let-env FOO = "foo::FOO" +# > $env.FOO = "foo::FOO" # > } # > } # > @@ -174,7 +174,7 @@ def build-module-page [module: record] { # > export def baz [] { "bar::baz" } # > # > export-env { -# > let-env BAR = "bar::BAR" +# > $env.BAR = "bar::BAR" # > } # > } # > @@ -184,7 +184,7 @@ def build-module-page [module: record] { # > export def bar [] { "baz::bar" } # > # > export-env { -# > let-env BAZ = "baz::BAZ" +# > $env.BAZ = "baz::BAZ" # > } # > } # > ``` @@ -223,7 +223,7 @@ def build-module-page [module: record] { # # This module exports environment. # { -# let-env FOO = "foo::FOO" +# $env.FOO = "foo::FOO" # } # # search for a module that does not exist diff --git a/crates/nu-std/std/log.nu b/crates/nu-std/std/log.nu index 0acb9521eb63..93384a65e2d2 100644 --- a/crates/nu-std/std/log.nu +++ b/crates/nu-std/std/log.nu @@ -1,5 +1,5 @@ export-env { - let-env LOG_ANSI = { + $env.LOG_ANSI = { "CRITICAL": (ansi red_bold), "ERROR": (ansi red), "WARNING": (ansi yellow), @@ -7,7 +7,7 @@ export-env { "DEBUG": (ansi default_dimmed) } - let-env LOG_LEVEL = { + $env.LOG_LEVEL = { "CRITICAL": 50, "ERROR": 40, "WARNING": 30, @@ -15,7 +15,7 @@ export-env { "DEBUG": 10 } - let-env LOG_PREFIX = { + $env.LOG_PREFIX = { "CRITICAL": "CRT", "ERROR": "ERR", "WARNING": "WRN", @@ -23,7 +23,7 @@ export-env { "DEBUG": "DBG" } - let-env LOG_SHORT_PREFIX = { + $env.LOG_SHORT_PREFIX = { "CRITICAL": "C", "ERROR": "E", "WARNING": "W", @@ -31,7 +31,7 @@ export-env { "DEBUG": "D" } - let-env LOG_FORMAT = $"%ANSI_START%%DATE%|%LEVEL%|(ansi u)%MSG%%ANSI_STOP%" + $env.LOG_FORMAT = $"%ANSI_START%%DATE%|%LEVEL%|(ansi u)%MSG%%ANSI_STOP%" } def log-types [] { diff --git a/crates/nu-std/std/mod.nu b/crates/nu-std/std/mod.nu index cff5d6cc8ef3..3ea85d2465eb 100644 --- a/crates/nu-std/std/mod.nu +++ b/crates/nu-std/std/mod.nu @@ -68,12 +68,12 @@ export def-env "path add" [ }} } - let-env $path_name = ( - $env - | get $path_name - | if $append { append $paths } - else { prepend $paths } - ) + load-env {$path_name: ( + $env + | get $path_name + | if $append { append $paths } + else { prepend $paths } + )} if $ret { $env | get $path_name diff --git a/crates/nu-std/tests/test_std.nu b/crates/nu-std/tests/test_std.nu index 7b59f1c8ea34..960b15e851c4 100644 --- a/crates/nu-std/tests/test_std.nu +++ b/crates/nu-std/tests/test_std.nu @@ -16,7 +16,7 @@ def test_path_add [] { std path add "/bar/" "/baz/" assert equal (get_path) ["/bar/", "/baz/", "/foo/"] - let-env $path_name = [] + load-env {$path_name: []} std path add "foo" std path add "bar" "baz" --append @@ -25,13 +25,11 @@ def test_path_add [] { assert equal (std path add "fooooo" --ret) ["fooooo", "foo", "bar", "baz"] assert equal (get_path) ["fooooo", "foo", "bar", "baz"] - let-env $path_name = [] + load-env {$path_name: []} let target_paths = {linux: "foo", windows: "bar", macos: "baz"} std path add $target_paths assert equal (get_path) [($target_paths | get $nu.os-info.name)] - - } } diff --git a/crates/nu-utils/src/sample_config/default_config.nu b/crates/nu-utils/src/sample_config/default_config.nu index 5ec0741d8924..da5e6953d44d 100644 --- a/crates/nu-utils/src/sample_config/default_config.nu +++ b/crates/nu-utils/src/sample_config/default_config.nu @@ -183,7 +183,7 @@ let light_theme = { # The default config record. This is where much of your global configuration is setup. -let-env config = { +$env.config = { # true or false to enable or disable the welcome banner at startup show_banner: true ls: { diff --git a/crates/nu-utils/src/sample_config/default_env.nu b/crates/nu-utils/src/sample_config/default_env.nu index 60972762ac64..9385219e54a1 100644 --- a/crates/nu-utils/src/sample_config/default_env.nu +++ b/crates/nu-utils/src/sample_config/default_env.nu @@ -44,21 +44,21 @@ def create_right_prompt [] { } # Use nushell functions to define your right and left prompt -let-env PROMPT_COMMAND = {|| create_left_prompt } -let-env PROMPT_COMMAND_RIGHT = {|| create_right_prompt } +$env.PROMPT_COMMAND = {|| create_left_prompt } +$env.PROMPT_COMMAND_RIGHT = {|| create_right_prompt } # The prompt indicators are environmental variables that represent # the state of the prompt -let-env PROMPT_INDICATOR = {|| "> " } -let-env PROMPT_INDICATOR_VI_INSERT = {|| ": " } -let-env PROMPT_INDICATOR_VI_NORMAL = {|| "> " } -let-env PROMPT_MULTILINE_INDICATOR = {|| "::: " } +$env.PROMPT_INDICATOR = {|| "> " } +$env.PROMPT_INDICATOR_VI_INSERT = {|| ": " } +$env.PROMPT_INDICATOR_VI_NORMAL = {|| "> " } +$env.PROMPT_MULTILINE_INDICATOR = {|| "::: " } # Specifies how environment variables are: # - converted from a string to a value on Nushell startup (from_string) # - converted from a value back to a string when running external commands (to_string) # Note: The conversions happen *after* config.nu is loaded -let-env ENV_CONVERSIONS = { +$env.ENV_CONVERSIONS = { "PATH": { from_string: { |s| $s | split row (char esep) | path expand --no-symlink } to_string: { |v| $v | path expand --no-symlink | str join (char esep) } @@ -72,16 +72,16 @@ let-env ENV_CONVERSIONS = { # Directories to search for scripts when calling source or use # # By default, /scripts is added -let-env NU_LIB_DIRS = [ +$env.NU_LIB_DIRS = [ ($nu.default-config-dir | path join 'scripts') ] # Directories to search for plugin binaries when calling register # # By default, /plugins is added -let-env NU_PLUGIN_DIRS = [ +$env.NU_PLUGIN_DIRS = [ ($nu.default-config-dir | path join 'plugins') ] # To add entries to PATH (on Windows you might use Path), you can use the following pattern: -# let-env PATH = ($env.PATH | split row (char esep) | prepend '/some/path') +# $env.PATH = ($env.PATH | split row (char esep) | prepend '/some/path') diff --git a/crates/nu-utils/src/sample_config/sample_login.nu b/crates/nu-utils/src/sample_config/sample_login.nu index ff5d62d78f58..5231661879ba 100644 --- a/crates/nu-utils/src/sample_config/sample_login.nu +++ b/crates/nu-utils/src/sample_config/sample_login.nu @@ -3,7 +3,7 @@ # - will be sourced after config.nu and env.nu in case of nushell started as login shell # just as an example for overwriting of an environment variable of env.nu -let-env PROMPT_INDICATOR = {|| "(LS)> " } +$env.PROMPT_INDICATOR = {|| "(LS)> " } # Similar to env-path and config-path there is a variable containing the path to login.nu echo $nu.loginshell-path \ No newline at end of file diff --git a/scripts/coverage-local.nu b/scripts/coverage-local.nu index 62807e8abc6e..eecd16d653fc 100755 --- a/scripts/coverage-local.nu +++ b/scripts/coverage-local.nu @@ -45,7 +45,7 @@ let start = (date now) # Some of the internal tests rely on the exact cargo profile # (This is somewhat criminal itself) # but we have to signal to the tests that we use the `ci` `--profile` -let-env NUSHELL_CARGO_TARGET = "ci" +$env.NUSHELL_CARGO_TARGET = "ci" # Manual gathering of coverage to catch invocation of the `nu` binary. # This is relevant for tests using the `nu!` macro from `nu-test-support` diff --git a/src/config_files.rs b/src/config_files.rs index 3793e4e570a8..729740106fae 100644 --- a/src/config_files.rs +++ b/src/config_files.rs @@ -212,7 +212,7 @@ pub(crate) fn setup_config( .and_then(|id| stack.get_var(id, Span::unknown()).ok()) { if var.as_record().is_ok() { - println!("warning: use `let-env config = ...` instead of `let config = ...`"); + println!("warning: use `$env.config = ...` instead of `let config = ...`"); } } } diff --git a/src/tests/test_engine.rs b/src/tests/test_engine.rs index 7c88e57ef827..03de1515d9e0 100644 --- a/src/tests/test_engine.rs +++ b/src/tests/test_engine.rs @@ -187,20 +187,20 @@ fn let_sees_in_variable2() -> TestResult { #[test] fn def_env() -> TestResult { run_test( - r#"def-env bob [] { let-env BAR = "BAZ" }; bob; $env.BAR"#, + r#"def-env bob [] { $env.BAR = "BAZ" }; bob; $env.BAR"#, "BAZ", ) } #[test] fn not_def_env() -> TestResult { - fail_test(r#"def bob [] { let-env BAR = "BAZ" }; bob; $env.BAR"#, "") + fail_test(r#"def bob [] { $env.BAR = "BAZ" }; bob; $env.BAR"#, "") } #[test] fn def_env_hiding_something() -> TestResult { fail_test( - r#"let-env FOO = "foo"; def-env bob [] { hide-env FOO }; bob; $env.FOO"#, + r#"$env.FOO = "foo"; def-env bob [] { hide-env FOO }; bob; $env.FOO"#, "", ) } @@ -208,7 +208,7 @@ fn def_env_hiding_something() -> TestResult { #[test] fn def_env_then_hide() -> TestResult { fail_test( - r#"def-env bob [] { let-env BOB = "bob" }; def-env un-bob [] { hide-env BOB }; bob; un-bob; $env.BOB"#, + r#"def-env bob [] { $env.BOB = "bob" }; def-env un-bob [] { hide-env BOB }; bob; un-bob; $env.BOB"#, "", ) } @@ -216,14 +216,14 @@ fn def_env_then_hide() -> TestResult { #[test] fn export_def_env() -> TestResult { run_test( - r#"module foo { export def-env bob [] { let-env BAR = "BAZ" } }; use foo bob; bob; $env.BAR"#, + r#"module foo { export def-env bob [] { $env.BAR = "BAZ" } }; use foo bob; bob; $env.BAR"#, "BAZ", ) } #[test] -fn dynamic_let_env() -> TestResult { - run_test(r#"let x = "FOO"; let-env $x = "BAZ"; $env.FOO"#, "BAZ") +fn dynamic_load_env() -> TestResult { + run_test(r#"let x = "FOO"; load-env {$x: "BAZ"}; $env.FOO"#, "BAZ") } #[test] diff --git a/src/tests/test_hiding.rs b/src/tests/test_hiding.rs index c6d8f613f5e1..81484cc51e8c 100644 --- a/src/tests/test_hiding.rs +++ b/src/tests/test_hiding.rs @@ -20,7 +20,7 @@ fn hides_alias() -> TestResult { #[test] fn hides_env() -> TestResult { fail_test( - r#"let-env myfoosymbol = "myfoosymbol"; hide-env myfoosymbol; $env.myfoosymbol"#, + r#"$env.myfoosymbol = "myfoosymbol"; hide-env myfoosymbol; $env.myfoosymbol"#, "", ) } @@ -47,7 +47,7 @@ fn hides_alias_then_redefines() -> TestResult { #[test] fn hides_env_then_redefines() -> TestResult { run_test( - r#"let-env myfoosymbol = "myfoosymbol"; hide-env myfoosymbol; let-env myfoosymbol = "bar"; $env.myfoosymbol"#, + r#"$env.myfoosymbol = "myfoosymbol"; hide-env myfoosymbol; $env.myfoosymbol = "bar"; $env.myfoosymbol"#, "bar", ) } @@ -119,7 +119,7 @@ fn hides_alias_in_scope_4() -> TestResult { #[test] fn hides_env_in_scope_1() -> TestResult { fail_test( - r#"let-env myfoosymbol = "myfoosymbol"; do { hide-env myfoosymbol; $env.myfoosymbol }"#, + r#"$env.myfoosymbol = "myfoosymbol"; do { hide-env myfoosymbol; $env.myfoosymbol }"#, "not_found", ) } @@ -127,7 +127,7 @@ fn hides_env_in_scope_1() -> TestResult { #[test] fn hides_env_in_scope_2() -> TestResult { run_test( - r#"let-env myfoosymbol = "myfoosymbol"; do { let-env myfoosymbol = "bar"; hide-env myfoosymbol; $env.myfoosymbol }"#, + r#"$env.myfoosymbol = "myfoosymbol"; do { $env.myfoosymbol = "bar"; hide-env myfoosymbol; $env.myfoosymbol }"#, "myfoosymbol", ) } @@ -135,7 +135,7 @@ fn hides_env_in_scope_2() -> TestResult { #[test] fn hides_env_in_scope_3() -> TestResult { fail_test( - r#"let-env myfoosymbol = "myfoosymbol"; do { hide-env myfoosymbol; let-env myfoosymbol = "bar"; hide-env myfoosymbol; $env.myfoosymbol }"#, + r#"$env.myfoosymbol = "myfoosymbol"; do { hide-env myfoosymbol; $env.myfoosymbol = "bar"; hide-env myfoosymbol; $env.myfoosymbol }"#, "", ) } @@ -143,7 +143,7 @@ fn hides_env_in_scope_3() -> TestResult { #[test] fn hides_env_in_scope_4() -> TestResult { fail_test( - r#"let-env myfoosymbol = "myfoosymbol"; do { let-env myfoosymbol = "bar"; hide-env myfoosymbol; hide-env myfoosymbol; $env.myfoosymbol }"#, + r#"$env.myfoosymbol = "myfoosymbol"; do { $env.myfoosymbol = "bar"; hide-env myfoosymbol; hide-env myfoosymbol; $env.myfoosymbol }"#, "", ) } @@ -169,7 +169,7 @@ fn hide_alias_twice_not_allowed() -> TestResult { #[test] fn hide_env_twice_not_allowed() -> TestResult { fail_test( - r#"let-env myfoosymbol = "myfoosymbol"; hide-env myfoosymbol; hide-env myfoosymbol"#, + r#"$env.myfoosymbol = "myfoosymbol"; hide-env myfoosymbol; hide-env myfoosymbol"#, "", ) } @@ -177,7 +177,7 @@ fn hide_env_twice_not_allowed() -> TestResult { #[test] fn hide_env_twice_allowed() -> TestResult { fail_test( - r#"let-env myfoosymbol = "myfoosymbol"; hide-env myfoosymbol; hide-env -i myfoosymbol; $env.myfoosymbol"#, + r#"$env.myfoosymbol = "myfoosymbol"; hide-env myfoosymbol; hide-env -i myfoosymbol; $env.myfoosymbol"#, "", ) } @@ -185,7 +185,7 @@ fn hide_env_twice_allowed() -> TestResult { #[test] fn hides_def_runs_env() -> TestResult { run_test( - r#"let-env myfoosymbol = "bar"; def myfoosymbol [] { "myfoosymbol" }; hide myfoosymbol; $env.myfoosymbol"#, + r#"$env.myfoosymbol = "bar"; def myfoosymbol [] { "myfoosymbol" }; hide myfoosymbol; $env.myfoosymbol"#, "bar", ) } @@ -305,7 +305,7 @@ fn hides_alias_import_then_reimports() -> TestResult { #[test] fn hides_env_import_1() -> TestResult { fail_test( - r#"module myspammodule { export-env { let-env myfoosymbol = "myfoosymbol" } }; use myspammodule; hide-env myfoosymbol; $env.myfoosymbol"#, + r#"module myspammodule { export-env { $env.myfoosymbol = "myfoosymbol" } }; use myspammodule; hide-env myfoosymbol; $env.myfoosymbol"#, "", ) } @@ -313,7 +313,7 @@ fn hides_env_import_1() -> TestResult { #[test] fn hides_def_runs_env_import() -> TestResult { run_test( - r#"module myspammodule { export-env { let-env myfoosymbol = "myfoosymbol" }; export def myfoosymbol [] { "bar" } }; use myspammodule myfoosymbol; hide myfoosymbol; $env.myfoosymbol"#, + r#"module myspammodule { export-env { $env.myfoosymbol = "myfoosymbol" }; export def myfoosymbol [] { "bar" } }; use myspammodule myfoosymbol; hide myfoosymbol; $env.myfoosymbol"#, "myfoosymbol", ) } @@ -321,7 +321,7 @@ fn hides_def_runs_env_import() -> TestResult { #[test] fn hides_def_and_env_import_1() -> TestResult { fail_test( - r#"module myspammodule { export-env { let-env myfoosymbol = "myfoosymbol" }; export def myfoosymbol [] { "bar" } }; use myspammodule myfoosymbol; hide myfoosymbol; hide-env myfoosymbol; $env.myfoosymbol"#, + r#"module myspammodule { export-env { $env.myfoosymbol = "myfoosymbol" }; export def myfoosymbol [] { "bar" } }; use myspammodule myfoosymbol; hide myfoosymbol; hide-env myfoosymbol; $env.myfoosymbol"#, "", ) } @@ -337,7 +337,7 @@ fn use_def_import_after_hide() -> TestResult { #[test] fn use_env_import_after_hide() -> TestResult { run_test( - r#"module myspammodule { export-env { let-env myfoosymbol = "myfoosymbol" } }; use myspammodule; hide-env myfoosymbol; use myspammodule; $env.myfoosymbol"#, + r#"module myspammodule { export-env { $env.myfoosymbol = "myfoosymbol" } }; use myspammodule; hide-env myfoosymbol; use myspammodule; $env.myfoosymbol"#, "myfoosymbol", ) } @@ -353,7 +353,7 @@ fn hide_shadowed_decl() -> TestResult { #[test] fn hide_shadowed_env() -> TestResult { run_test( - r#"module myspammodule { export-env { let-env myfoosymbol = "bar" } }; let-env myfoosymbol = "myfoosymbol"; do { use myspammodule; hide-env myfoosymbol; $env.myfoosymbol }"#, + r#"module myspammodule { export-env { $env.myfoosymbol = "bar" } }; $env.myfoosymbol = "myfoosymbol"; do { use myspammodule; hide-env myfoosymbol; $env.myfoosymbol }"#, "myfoosymbol", ) } @@ -369,7 +369,7 @@ fn hides_all_decls_within_scope() -> TestResult { #[test] fn hides_all_envs_within_scope() -> TestResult { fail_test( - r#"module myspammodule { export-env { let-env myfoosymbol = "bar" } }; let-env myfoosymbol = "myfoosymbol"; use myspammodule; hide-env myfoosymbol; $env.myfoosymbol"#, + r#"module myspammodule { export-env { $env.myfoosymbol = "bar" } }; $env.myfoosymbol = "myfoosymbol"; use myspammodule; hide-env myfoosymbol; $env.myfoosymbol"#, "", ) } diff --git a/src/tests/test_modules.rs b/src/tests/test_modules.rs index 20e279d333af..5481b93e8fa3 100644 --- a/src/tests/test_modules.rs +++ b/src/tests/test_modules.rs @@ -43,7 +43,7 @@ fn module_def_imports_5() -> TestResult { #[test] fn module_env_imports_1() -> TestResult { run_test( - r#"module foo { export-env { let-env a = '1' } }; use foo; $env.a"#, + r#"module foo { export-env { $env.a = '1' } }; use foo; $env.a"#, "1", ) } @@ -51,7 +51,7 @@ fn module_env_imports_1() -> TestResult { #[test] fn module_env_imports_2() -> TestResult { run_test( - r#"module foo { export-env { let-env a = '1'; let-env b = '2' } }; use foo; $env.b"#, + r#"module foo { export-env { $env.a = '1'; $env.b = '2' } }; use foo; $env.b"#, "2", ) } @@ -59,7 +59,7 @@ fn module_env_imports_2() -> TestResult { #[test] fn module_env_imports_3() -> TestResult { run_test( - r#"module foo { export-env { let-env a = '1' }; export-env { let-env b = '2' }; export-env {let-env c = '3'} }; use foo; $env.c"#, + r#"module foo { export-env { $env.a = '1' }; export-env { $env.b = '2' }; export-env {$env.c = '3'} }; use foo; $env.c"#, "3", ) } @@ -67,7 +67,7 @@ fn module_env_imports_3() -> TestResult { #[test] fn module_def_and_env_imports_1() -> TestResult { run_test( - r#"module spam { export-env { let-env foo = "foo" }; export def foo [] { "bar" } }; use spam; $env.foo"#, + r#"module spam { export-env { $env.foo = "foo" }; export def foo [] { "bar" } }; use spam; $env.foo"#, "foo", ) } @@ -75,7 +75,7 @@ fn module_def_and_env_imports_1() -> TestResult { #[test] fn module_def_and_env_imports_2() -> TestResult { run_test( - r#"module spam { export-env { let-env foo = "foo" }; export def foo [] { "bar" } }; use spam foo; foo"#, + r#"module spam { export-env { $env.foo = "foo" }; export def foo [] { "bar" } }; use spam foo; foo"#, "bar", ) } @@ -91,7 +91,7 @@ fn module_def_import_uses_internal_command() -> TestResult { #[test] fn module_env_import_uses_internal_command() -> TestResult { run_test( - r#"module foo { def b [] { "2" }; export-env { let-env a = (b) } }; use foo; $env.a"#, + r#"module foo { def b [] { "2" }; export-env { $env.a = (b) } }; use foo; $env.a"#, "2", ) } diff --git a/src/tests/test_parser.rs b/src/tests/test_parser.rs index 2d9740689168..97e5f1c2e58c 100644 --- a/src/tests/test_parser.rs +++ b/src/tests/test_parser.rs @@ -222,10 +222,10 @@ fn equals_separates_long_flag() -> TestResult { } #[test] -fn let_env_expressions() -> TestResult { +fn assign_expressions() -> TestResult { let env = HashMap::from([("VENV_OLD_PATH", "Foobar"), ("Path", "Quux")]); run_test_with_env( - r#"let-env Path = if ($env | columns | "VENV_OLD_PATH" in $in) { $env.VENV_OLD_PATH } else { $env.Path }; echo $env.Path"#, + r#"$env.Path = (if ($env | columns | "VENV_OLD_PATH" in $in) { $env.VENV_OLD_PATH } else { $env.Path }); echo $env.Path"#, "Foobar", &env, ) diff --git a/tests/hooks/mod.rs b/tests/hooks/mod.rs index 622a3483b2a3..e4736903dc64 100644 --- a/tests/hooks/mod.rs +++ b/tests/hooks/mod.rs @@ -11,7 +11,7 @@ fn env_change_hook_code_list(name: &str, code_list: &[&str]) -> String { } format!( - r#"let-env config = {{ + r#"$env.config = {{ hooks: {{ env_change: {{ {name} : [ @@ -25,7 +25,7 @@ fn env_change_hook_code_list(name: &str, code_list: &[&str]) -> String { fn env_change_hook(name: &str, code: &str) -> String { format!( - r#"let-env config = {{ + r#"$env.config = {{ hooks: {{ env_change: {{ {name} : {code} @@ -37,7 +37,7 @@ fn env_change_hook(name: &str, code: &str) -> String { fn env_change_hook_code(name: &str, code: &str) -> String { format!( - r#"let-env config = {{ + r#"$env.config = {{ hooks: {{ env_change: {{ {name} : {{ @@ -51,7 +51,7 @@ fn env_change_hook_code(name: &str, code: &str) -> String { fn env_change_hook_code_condition(name: &str, condition: &str, code: &str) -> String { format!( - r#"let-env config = {{ + r#"$env.config = {{ hooks: {{ env_change: {{ {name} : {{ @@ -66,7 +66,7 @@ fn env_change_hook_code_condition(name: &str, condition: &str, code: &str) -> St fn pre_prompt_hook(code: &str) -> String { format!( - r#"let-env config = {{ + r#"$env.config = {{ hooks: {{ pre_prompt: {code} }} @@ -76,7 +76,7 @@ fn pre_prompt_hook(code: &str) -> String { fn pre_prompt_hook_code(code: &str) -> String { format!( - r#"let-env config = {{ + r#"$env.config = {{ hooks: {{ pre_prompt: {{ code: {code} @@ -88,7 +88,7 @@ fn pre_prompt_hook_code(code: &str) -> String { fn pre_execution_hook(code: &str) -> String { format!( - r#"let-env config = {{ + r#"$env.config = {{ hooks: {{ pre_execution: {code} }} @@ -98,7 +98,7 @@ fn pre_execution_hook(code: &str) -> String { fn pre_execution_hook_code(code: &str) -> String { format!( - r#"let-env config = {{ + r#"$env.config = {{ hooks: {{ pre_execution: {{ code: {code} @@ -112,7 +112,7 @@ fn pre_execution_hook_code(code: &str) -> String { fn env_change_define_command() { let inp = &[ &env_change_hook_code("FOO", r#"'def foo [] { "got foo!" }'"#), - "let-env FOO = 1", + "$env.FOO = 1", "foo", ]; @@ -126,7 +126,7 @@ fn env_change_define_command() { fn env_change_define_variable() { let inp = &[ &env_change_hook_code("FOO", r#"'let x = "spam"'"#), - "let-env FOO = 1", + "$env.FOO = 1", "$x", ]; @@ -139,8 +139,8 @@ fn env_change_define_variable() { #[test] fn env_change_define_env_var() { let inp = &[ - &env_change_hook_code("FOO", r#"'let-env SPAM = "spam"'"#), - "let-env FOO = 1", + &env_change_hook_code("FOO", r#"'$env.SPAM = "spam"'"#), + "$env.FOO = 1", "$env.SPAM", ]; @@ -154,7 +154,7 @@ fn env_change_define_env_var() { fn env_change_define_alias() { let inp = &[ &env_change_hook_code("FOO", r#"'alias spam = echo "spam"'"#), - "let-env FOO = 1", + "$env.FOO = 1", "spam", ]; @@ -167,8 +167,8 @@ fn env_change_define_alias() { #[test] fn env_change_simple_block_preserve_env_var() { let inp = &[ - &env_change_hook("FOO", r#"{|| let-env SPAM = "spam" }"#), - "let-env FOO = 1", + &env_change_hook("FOO", r#"{|| $env.SPAM = "spam" }"#), + "$env.FOO = 1", "$env.SPAM", ]; @@ -184,11 +184,11 @@ fn env_change_simple_block_list_shadow_env_var() { &env_change_hook( "FOO", r#"[ - {|| let-env SPAM = "foo" } - {|| let-env SPAM = "spam" } + {|| $env.SPAM = "foo" } + {|| $env.SPAM = "spam" } ]"#, ), - "let-env FOO = 1", + "$env.FOO = 1", "$env.SPAM", ]; @@ -201,8 +201,8 @@ fn env_change_simple_block_list_shadow_env_var() { #[test] fn env_change_block_preserve_env_var() { let inp = &[ - &env_change_hook_code("FOO", r#"{|| let-env SPAM = "spam" }"#), - "let-env FOO = 1", + &env_change_hook_code("FOO", r#"{|| $env.SPAM = "spam" }"#), + "$env.FOO = 1", "$env.SPAM", ]; @@ -227,10 +227,7 @@ fn pre_prompt_define_command() { #[test] fn pre_prompt_simple_block_preserve_env_var() { - let inp = &[ - &pre_prompt_hook(r#"{|| let-env SPAM = "spam" }"#), - "$env.SPAM", - ]; + let inp = &[&pre_prompt_hook(r#"{|| $env.SPAM = "spam" }"#), "$env.SPAM"]; let actual_repl = nu!(cwd: "tests/hooks", nu_repl_code(inp)); @@ -243,8 +240,8 @@ fn pre_prompt_simple_block_list_shadow_env_var() { let inp = &[ &pre_prompt_hook( r#"[ - {|| let-env SPAM = "foo" } - {|| let-env SPAM = "spam" } + {|| $env.SPAM = "foo" } + {|| $env.SPAM = "spam" } ]"#, ), "$env.SPAM", @@ -259,7 +256,7 @@ fn pre_prompt_simple_block_list_shadow_env_var() { #[test] fn pre_prompt_block_preserve_env_var() { let inp = &[ - &pre_prompt_hook_code(r#"{|| let-env SPAM = "spam" }"#), + &pre_prompt_hook_code(r#"{|| $env.SPAM = "spam" }"#), "$env.SPAM", ]; @@ -285,7 +282,7 @@ fn pre_execution_define_command() { #[test] fn pre_execution_simple_block_preserve_env_var() { let inp = &[ - &pre_execution_hook(r#"{|| let-env SPAM = "spam" }"#), + &pre_execution_hook(r#"{|| $env.SPAM = "spam" }"#), "$env.SPAM", ]; @@ -300,8 +297,8 @@ fn pre_execution_simple_block_list_shadow_env_var() { let inp = &[ &pre_execution_hook( r#"[ - {|| let-env SPAM = "foo" } - {|| let-env SPAM = "spam" } + {|| $env.SPAM = "foo" } + {|| $env.SPAM = "spam" } ]"#, ), "$env.SPAM", @@ -316,7 +313,7 @@ fn pre_execution_simple_block_list_shadow_env_var() { #[test] fn pre_execution_block_preserve_env_var() { let inp = &[ - &pre_execution_hook_code(r#"{|| let-env SPAM = "spam" }"#), + &pre_execution_hook_code(r#"{|| $env.SPAM = "spam" }"#), "$env.SPAM", ]; @@ -329,7 +326,7 @@ fn pre_execution_block_preserve_env_var() { #[test] fn pre_execution_commandline() { let inp = &[ - &pre_execution_hook_code(r#"{|| let-env repl_commandline = (commandline) }"#), + &pre_execution_hook_code(r#"{|| $env.repl_commandline = (commandline) }"#), "$env.repl_commandline", ]; @@ -349,7 +346,7 @@ fn env_change_shadow_command() { r#"'def foo [] { "got foo!" }'"#, ], ), - "let-env FOO = 1", + "$env.FOO = 1", "foo", ]; @@ -363,7 +360,7 @@ fn env_change_shadow_command() { fn env_change_block_dont_preserve_command() { let inp = &[ &env_change_hook_code("FOO", r#"{|| def foo [] { "foo" } }"#), - "let-env FOO = 1", + "$env.FOO = 1", "foo", ]; @@ -396,14 +393,14 @@ fn env_change_block_condition_pwd() { #[test] fn env_change_block_condition_correct_args() { let inp = &[ - r#"let-env FOO = 1"#, + r#"$env.FOO = 1"#, &env_change_hook_code_condition( "FOO", r#"{|before, after| $before == 1 and $after == 2}"#, - r#"{|before, after| let-env SPAM = ($before == 1 and $after == 2) }"#, + r#"{|before, after| $env.SPAM = ($before == 1 and $after == 2) }"#, ), "", - r#"let-env FOO = 2"#, + r#"$env.FOO = 2"#, "$env.SPAM", ]; @@ -416,8 +413,8 @@ fn env_change_block_condition_correct_args() { #[test] fn env_change_dont_panic_with_many_args() { let inp = &[ - &env_change_hook_code("FOO", r#"{ |a, b, c| let-env SPAM = 'spam' }"#), - "let-env FOO = 1", + &env_change_hook_code("FOO", r#"{ |a, b, c| $env.SPAM = 'spam' }"#), + "$env.FOO = 1", "", ]; @@ -430,14 +427,14 @@ fn env_change_dont_panic_with_many_args() { #[test] fn err_hook_wrong_env_type_1() { let inp = &[ - r#"let-env config = { + r#"$env.config = { hooks: { env_change: { FOO : 1 } } }"#, - "let-env FOO = 1", + "$env.FOO = 1", "", ]; @@ -451,7 +448,7 @@ fn err_hook_wrong_env_type_1() { #[test] fn err_hook_wrong_env_type_2() { let inp = &[ - r#"let-env config = { + r#"$env.config = { hooks: { env_change: "print spam" } @@ -468,7 +465,7 @@ fn err_hook_wrong_env_type_2() { #[test] fn err_hook_wrong_env_type_3() { let inp = &[ - r#"let-env config = { + r#"$env.config = { hooks: { env_change: { FOO : { @@ -477,7 +474,7 @@ fn err_hook_wrong_env_type_3() { } } }"#, - "let-env FOO = 1", + "$env.FOO = 1", "", ]; @@ -490,7 +487,7 @@ fn err_hook_wrong_env_type_3() { #[test] fn err_hook_non_boolean_condition_output() { let inp = &[ - r#"let-env config = { + r#"$env.config = { hooks: { env_change: { FOO : { @@ -500,7 +497,7 @@ fn err_hook_non_boolean_condition_output() { } } }"#, - "let-env FOO = 1", + "$env.FOO = 1", "", ]; @@ -513,7 +510,7 @@ fn err_hook_non_boolean_condition_output() { #[test] fn err_hook_non_condition_not_a_block() { let inp = &[ - r#"let-env config = { + r#"$env.config = { hooks: { env_change: { FOO : { @@ -523,7 +520,7 @@ fn err_hook_non_condition_not_a_block() { } } }"#, - "let-env FOO = 1", + "$env.FOO = 1", "", ]; @@ -536,7 +533,7 @@ fn err_hook_non_condition_not_a_block() { #[test] fn err_hook_parse_error() { let inp = &[ - r#"let-env config = { + r#"$env.config = { hooks: { env_change: { FOO : { @@ -545,7 +542,7 @@ fn err_hook_parse_error() { } } }"#, - "let-env FOO = 1", + "$env.FOO = 1", "", ]; diff --git a/tests/modules/mod.rs b/tests/modules/mod.rs index 217b0c755aeb..dc54ef46c0c7 100644 --- a/tests/modules/mod.rs +++ b/tests/modules/mod.rs @@ -306,7 +306,7 @@ fn module_import_env_1() { .with_files(vec![FileWithContentToBeTrimmed( "spam.nu", r#" - export-env { let-env FOO_HELPER = "foo" } + export-env { $env.FOO_HELPER = "foo" } "#, )]); @@ -331,7 +331,7 @@ fn module_import_env_2() { .with_files(vec![FileWithContentToBeTrimmed( "spam.nu", r#" - export-env { let-env FOO = "foo" } + export-env { $env.FOO = "foo" } "#, )]); diff --git a/tests/overlays/mod.rs b/tests/overlays/mod.rs index 25c35f82cdfa..472cd54f1c60 100644 --- a/tests/overlays/mod.rs +++ b/tests/overlays/mod.rs @@ -132,7 +132,7 @@ fn prefixed_overlay_keeps_custom_decl() { #[test] fn add_overlay_env() { let inp = &[ - r#"module spam { export-env { let-env FOO = "foo" } }"#, + r#"module spam { export-env { $env.FOO = "foo" } }"#, r#"overlay use spam"#, r#"$env.FOO"#, ]; @@ -147,7 +147,7 @@ fn add_overlay_env() { #[test] fn add_prefixed_overlay_env_no_prefix() { let inp = &[ - r#"module spam { export-env { let-env FOO = "foo" } }"#, + r#"module spam { export-env { $env.FOO = "foo" } }"#, r#"overlay use --prefix spam"#, r#"$env.FOO"#, ]; @@ -294,9 +294,9 @@ fn update_overlay_from_module() { #[test] fn update_overlay_from_module_env() { let inp = &[ - r#"module spam { export-env { let-env FOO = "foo" } }"#, + r#"module spam { export-env { $env.FOO = "foo" } }"#, r#"overlay use spam"#, - r#"module spam { export-env { let-env FOO = "bar" } }"#, + r#"module spam { export-env { $env.FOO = "bar" } }"#, r#"overlay use spam"#, r#"$env.FOO"#, ]; @@ -311,9 +311,9 @@ fn update_overlay_from_module_env() { #[test] fn overlay_use_do_not_eval_twice() { let inp = &[ - r#"module spam { export-env { let-env FOO = "foo" } }"#, + r#"module spam { export-env { $env.FOO = "foo" } }"#, r#"overlay use spam"#, - r#"let-env FOO = "bar""#, + r#"$env.FOO = "bar""#, r#"overlay hide spam"#, r#"overlay use spam"#, r#"$env.FOO"#, @@ -383,7 +383,7 @@ fn hide_overlay_scoped() { #[test] fn hide_overlay_env() { let inp = &[ - r#"module spam { export-env { let-env FOO = "foo" } }"#, + r#"module spam { export-env { $env.FOO = "foo" } }"#, r#"overlay use spam"#, r#"overlay hide spam"#, r#"$env.FOO"#, @@ -399,7 +399,7 @@ fn hide_overlay_env() { #[test] fn hide_overlay_scoped_env() { let inp = &[ - r#"module spam { export-env { let-env FOO = "foo" } }"#, + r#"module spam { export-env { $env.FOO = "foo" } }"#, r#"overlay use spam"#, r#"do { overlay hide spam }"#, r#"$env.FOO"#, @@ -495,7 +495,7 @@ fn hide_overlay_discard_alias() { fn hide_overlay_discard_env() { let inp = &[ r#"overlay use samples/spam.nu"#, - r#"let-env BAGR = 'bagr'"#, + r#"$env.BAGR = 'bagr'"#, r#"overlay hide spam"#, r#"$env.BAGR"#, ]; @@ -543,7 +543,7 @@ fn hide_overlay_keep_alias() { fn hide_overlay_dont_keep_env() { let inp = &[ r#"overlay use samples/spam.nu"#, - r#"let-env BAGR = 'bagr'"#, + r#"$env.BAGR = 'bagr'"#, r#"overlay hide --keep-custom spam"#, r#"$env.BAGR"#, ]; @@ -597,7 +597,7 @@ fn hide_overlay_dont_keep_overwritten_alias() { fn hide_overlay_dont_keep_overwritten_env() { let inp = &[ r#"overlay use samples/spam.nu"#, - r#"let-env BAZ = 'bagr'"#, + r#"$env.BAZ = 'bagr'"#, r#"overlay hide --keep-custom spam"#, r#"$env.BAZ"#, ]; @@ -649,7 +649,7 @@ fn hide_overlay_keep_alias_in_latest_overlay() { fn hide_overlay_dont_keep_env_in_latest_overlay() { let inp = &[ r#"overlay use samples/spam.nu"#, - r#"let-env BAGR = 'bagr'"#, + r#"$env.BAGR = 'bagr'"#, r#"module eggs { }"#, r#"overlay use eggs"#, r#"overlay hide --keep-custom spam"#, @@ -847,7 +847,7 @@ fn overlay_hide_and_add_renamed_overlay() { #[test] fn overlay_use_export_env() { let inp = &[ - r#"module spam { export-env { let-env FOO = 'foo' } }"#, + r#"module spam { export-env { $env.FOO = 'foo' } }"#, r#"overlay use spam"#, r#"$env.FOO"#, ]; @@ -862,7 +862,7 @@ fn overlay_use_export_env() { #[test] fn overlay_use_export_env_hide() { let inp = &[ - r#"let-env FOO = 'foo'"#, + r#"$env.FOO = 'foo'"#, r#"module spam { export-env { hide-env FOO } }"#, r#"overlay use spam"#, r#"$env.FOO"#, @@ -970,9 +970,9 @@ fn overlay_use_find_scoped_module() { fn overlay_preserve_hidden_env_1() { let inp = &[ r#"overlay new spam"#, - r#"let-env FOO = 'foo'"#, + r#"$env.FOO = 'foo'"#, r#"overlay new eggs"#, - r#"let-env FOO = 'bar'"#, + r#"$env.FOO = 'bar'"#, r#"hide-env FOO"#, r#"overlay use eggs"#, r#"$env.FOO"#, @@ -989,10 +989,10 @@ fn overlay_preserve_hidden_env_1() { fn overlay_preserve_hidden_env_2() { let inp = &[ r#"overlay new spam"#, - r#"let-env FOO = 'foo'"#, + r#"$env.FOO = 'foo'"#, r#"overlay hide spam"#, r#"overlay new eggs"#, - r#"let-env FOO = 'bar'"#, + r#"$env.FOO = 'bar'"#, r#"hide-env FOO"#, r#"overlay hide eggs"#, r#"overlay use spam"#, @@ -1011,11 +1011,11 @@ fn overlay_preserve_hidden_env_2() { fn overlay_reset_hidden_env() { let inp = &[ r#"overlay new spam"#, - r#"let-env FOO = 'foo'"#, + r#"$env.FOO = 'foo'"#, r#"overlay new eggs"#, - r#"let-env FOO = 'bar'"#, + r#"$env.FOO = 'bar'"#, r#"hide-env FOO"#, - r#"module eggs { export-env { let-env FOO = 'bar' } }"#, + r#"module eggs { export-env { $env.FOO = 'bar' } }"#, r#"overlay use eggs"#, r#"$env.FOO"#, ]; @@ -1135,13 +1135,13 @@ fn overlay_use_and_restore_older_env_vars() { r#"module spam { export-env { let old_baz = $env.BAZ; - let-env BAZ = $old_baz + 'baz' + $env.BAZ = $old_baz + 'baz' } }"#, - r#"let-env BAZ = 'baz'"#, + r#"$env.BAZ = 'baz'"#, r#"overlay use spam"#, r#"overlay hide spam"#, - r#"let-env BAZ = 'new-baz'"#, + r#"$env.BAZ = 'new-baz'"#, r#"overlay use --reload spam"#, r#"$env.BAZ"#, ]; @@ -1160,13 +1160,13 @@ fn overlay_use_and_reload() { export def foo [] { 'foo' }; export alias fooalias = echo 'foo'; export-env { - let-env FOO = 'foo' + $env.FOO = 'foo' } }"#, r#"overlay use spam"#, r#"def foo [] { 'newfoo' }"#, r#"alias fooalias = echo 'newfoo'"#, - r#"let-env FOO = 'newfoo'"#, + r#"$env.FOO = 'newfoo'"#, r#"overlay use --reload spam"#, r#"$'(foo)(fooalias)($env.FOO)'"#, ]; @@ -1184,7 +1184,7 @@ fn overlay_use_and_reolad_keep_custom() { r#"overlay new spam"#, r#"def foo [] { 'newfoo' }"#, r#"alias fooalias = echo 'newfoo'"#, - r#"let-env FOO = 'newfoo'"#, + r#"$env.FOO = 'newfoo'"#, r#"overlay use --reload spam"#, r#"$'(foo)(fooalias)($env.FOO)'"#, ]; @@ -1225,7 +1225,7 @@ fn overlay_use_main_prefix() { #[test] fn overlay_use_main_def_env() { let inp = &[ - r#"module spam { export def-env main [] { let-env SPAM = "spam" } }"#, + r#"module spam { export def-env main [] { $env.SPAM = "spam" } }"#, r#"overlay use spam"#, r#"spam"#, r#"$env.SPAM"#, diff --git a/tests/overlays/samples/spam.nu b/tests/overlays/samples/spam.nu index 38301078f8f5..0316378a7933 100644 --- a/tests/overlays/samples/spam.nu +++ b/tests/overlays/samples/spam.nu @@ -2,4 +2,4 @@ export def foo [] { "foo" } export alias bar = echo "bar" -export-env { let-env BAZ = "baz" } +export-env { $env.BAZ = "baz" } diff --git a/tests/parsing/mod.rs b/tests/parsing/mod.rs index d31847ddb692..88529bf927c6 100644 --- a/tests/parsing/mod.rs +++ b/tests/parsing/mod.rs @@ -79,7 +79,7 @@ fn parse_file_relative_to_parsed_file_simple() { r#" use ../lol_shell.nu - let-env LOL = (lol_shell ls) + $env.LOL = (lol_shell ls) "#, )]) .with_files(vec![FileWithContentToBeTrimmed( @@ -115,7 +115,7 @@ fn parse_file_relative_to_parsed_file() { use ../lol_shell.nu overlay use ../../lol/lol_shell.nu - let-env LOL = $'($env.FOO) (lol_shell ls) (ls)' + $env.LOL = $'($env.FOO) (lol_shell ls) (ls)' "#, )]) .with_files(vec![FileWithContentToBeTrimmed( @@ -127,7 +127,7 @@ fn parse_file_relative_to_parsed_file() { .with_files(vec![FileWithContentToBeTrimmed( "foo.nu", r#" - let-env FOO = 'foo' + $env.FOO = 'foo' "#, )]); @@ -157,13 +157,13 @@ fn parse_file_relative_to_parsed_file_dont_use_cwd_1() { .with_files(vec![FileWithContentToBeTrimmed( "lol/foo.nu", r#" - let-env FOO = 'good' + $env.FOO = 'good' "#, )]) .with_files(vec![FileWithContentToBeTrimmed( "foo.nu", r#" - let-env FOO = 'bad' + $env.FOO = 'bad' "#, )]); @@ -193,7 +193,7 @@ fn parse_file_relative_to_parsed_file_dont_use_cwd_2() { .with_files(vec![FileWithContentToBeTrimmed( "foo.nu", r#" - let-env FOO = 'bad' + $env.FOO = 'bad' "#, )]); diff --git a/tests/shell/environment/env.rs b/tests/shell/environment/env.rs index 20f607399af6..bd372679b924 100644 --- a/tests/shell/environment/env.rs +++ b/tests/shell/environment/env.rs @@ -87,8 +87,8 @@ fn env_assignment() { } #[test] -fn let_env_file_pwd_env_var_fails() { - let actual = nu!(cwd: ".", r#"let-env FILE_PWD = 'foo'"#); +fn mutate_env_file_pwd_env_var_fails() { + let actual = nu!(cwd: ".", r#"$env.FILE_PWD = 'foo'"#); assert!(actual.err.contains("automatic_env_var_set_manually")); } @@ -163,7 +163,7 @@ fn passes_env_from_local_cfg_to_external_process() { #[test] fn hides_env_in_block() { let inp = &[ - "let-env foo = 'foo'", + "$env.foo = 'foo'", "hide-env foo", "let b = {|| $env.foo }", "do $b", diff --git a/tests/shell/mod.rs b/tests/shell/mod.rs index 56e3e316e0bf..9f7973850c9a 100644 --- a/tests/shell/mod.rs +++ b/tests/shell/mod.rs @@ -68,12 +68,12 @@ fn nu_lib_dirs_repl() { .with_files(vec![FileWithContentToBeTrimmed( "scripts/foo.nu", r#" - let-env FOO = "foo" + $env.FOO = "foo" "#, )]); let inp_lines = &[ - r#"let-env NU_LIB_DIRS = [ ('scripts' | path expand) ]"#, + r#"$env.NU_LIB_DIRS = [ ('scripts' | path expand) ]"#, r#"source-env foo.nu"#, r#"$env.FOO"#, ]; @@ -93,7 +93,7 @@ fn nu_lib_dirs_script() { .with_files(vec![FileWithContentToBeTrimmed( "scripts/foo.nu", r#" - let-env FOO = "foo" + $env.FOO = "foo" "#, )]) .with_files(vec![FileWithContentToBeTrimmed( @@ -104,7 +104,7 @@ fn nu_lib_dirs_script() { )]); let inp_lines = &[ - r#"let-env NU_LIB_DIRS = [ ('scripts' | path expand) ]"#, + r#"$env.NU_LIB_DIRS = [ ('scripts' | path expand) ]"#, r#"source-env main.nu"#, r#"$env.FOO"#, ]; @@ -124,12 +124,12 @@ fn nu_lib_dirs_relative_repl() { .with_files(vec![FileWithContentToBeTrimmed( "scripts/foo.nu", r#" - let-env FOO = "foo" + $env.FOO = "foo" "#, )]); let inp_lines = &[ - r#"let-env NU_LIB_DIRS = [ 'scripts' ]"#, + r#"$env.NU_LIB_DIRS = [ 'scripts' ]"#, r#"source-env foo.nu"#, r#"$env.FOO"#, ]; @@ -150,7 +150,7 @@ fn const_nu_lib_dirs_relative() { .with_files(vec![FileWithContentToBeTrimmed( "scripts/foo.nu", r#" - let-env FOO = "foo" + $env.FOO = "foo" "#, )]) .with_files(vec![FileWithContentToBeTrimmed( @@ -183,12 +183,12 @@ fn nu_lib_dirs_relative_script() { .with_files(vec![FileWithContentToBeTrimmed( "foo.nu", r#" - let-env FOO = "foo" + $env.FOO = "foo" "#, )]); let inp_lines = &[ - r#"let-env NU_LIB_DIRS = [ 'scripts' ]"#, + r#"$env.NU_LIB_DIRS = [ 'scripts' ]"#, r#"source-env scripts/main.nu"#, r#"$env.FOO"#, ]; diff --git a/tests/shell/pipeline/commands/internal.rs b/tests/shell/pipeline/commands/internal.rs index 589a5c9630bf..e76bf711e779 100644 --- a/tests/shell/pipeline/commands/internal.rs +++ b/tests/shell/pipeline/commands/internal.rs @@ -368,11 +368,11 @@ fn let_doesnt_leak() { } #[test] -fn let_env_variable() { +fn mutate_env_variable() { let actual = nu!( cwd: ".", r#" - let-env TESTENVVAR = "hello world" + $env.TESTENVVAR = "hello world" echo $env.TESTENVVAR "# ); @@ -381,11 +381,11 @@ fn let_env_variable() { } #[test] -fn let_env_hides_variable() { +fn mutate_env_hides_variable() { let actual = nu!( cwd: ".", r#" - let-env TESTENVVAR = "hello world" + $env.TESTENVVAR = "hello world" print $env.TESTENVVAR hide-env TESTENVVAR print $env.TESTENVVAR @@ -397,11 +397,11 @@ fn let_env_hides_variable() { } #[test] -fn let_env_hides_variable_in_parent_scope() { +fn mutate_env_hides_variable_in_parent_scope() { let actual = nu!( cwd: ".", r#" - let-env TESTENVVAR = "hello world" + $env.TESTENVVAR = "hello world" print $env.TESTENVVAR do { hide-env TESTENVVAR @@ -420,7 +420,7 @@ fn unlet_env_variable() { let actual = nu!( cwd: ".", r#" - let-env TEST_VAR = "hello world" + $env.TEST_VAR = "hello world" hide-env TEST_VAR echo $env.TEST_VAR "# @@ -446,10 +446,10 @@ fn unlet_variable_in_parent_scope() { let actual = nu!( cwd: ".", r#" - let-env DEBUG = "1" + $env.DEBUG = "1" print $env.DEBUG do { - let-env DEBUG = "2" + $env.DEBUG = "2" print $env.DEBUG hide-env DEBUG print $env.DEBUG @@ -462,11 +462,11 @@ fn unlet_variable_in_parent_scope() { } #[test] -fn let_env_doesnt_leak() { +fn mutate_env_doesnt_leak() { let actual = nu!( cwd: ".", r#" - do { let-env xyz = "my message" }; echo $env.xyz + do { $env.xyz = "my message" }; echo $env.xyz "# ); @@ -474,11 +474,11 @@ fn let_env_doesnt_leak() { } #[test] -fn proper_shadow_let_env_aliases() { +fn proper_shadow_mutate_env_aliases() { let actual = nu!( cwd: ".", r#" - let-env DEBUG = "true"; print $env.DEBUG | table; do { let-env DEBUG = "false"; print $env.DEBUG } | table; print $env.DEBUG + $env.DEBUG = "true"; print $env.DEBUG | table; do { $env.DEBUG = "false"; print $env.DEBUG } | table; print $env.DEBUG "# ); assert_eq!(actual.out, "truefalsetrue"); @@ -527,7 +527,7 @@ fn proper_shadow_load_env_aliases() { let actual = nu!( cwd: ".", r#" - let-env DEBUG = "true"; print $env.DEBUG | table; do { echo {DEBUG: "false"} | load-env; print $env.DEBUG } | table; print $env.DEBUG + $env.DEBUG = "true"; print $env.DEBUG | table; do { echo {DEBUG: "false"} | load-env; print $env.DEBUG } | table; print $env.DEBUG "# ); assert_eq!(actual.out, "truefalsetrue"); @@ -540,7 +540,7 @@ fn load_env_can_hide_var_envs() { let actual = nu!( cwd: ".", r#" - let-env DEBUG = "1" + $env.DEBUG = "1" echo $env.DEBUG load-env [[name, value]; [DEBUG null]] echo $env.DEBUG @@ -558,7 +558,7 @@ fn load_env_can_hide_var_envs_in_parent_scope() { let actual = nu!( cwd: ".", r#" - let-env DEBUG = "1" + $env.DEBUG = "1" echo $env.DEBUG do { load-env [[name, value]; [DEBUG null]] diff --git a/toolkit.nu b/toolkit.nu index b4577662f80b..bb164ea9e3b3 100644 --- a/toolkit.nu +++ b/toolkit.nu @@ -232,7 +232,7 @@ export def "check pr" [ --fast: bool # use the "nextext" `cargo` subcommand to speed up the tests (see [`cargo-nextest`](https://nexte.st/) and [`nextest-rs/nextest`](https://github.com/nextest-rs/nextest)) --features: list # the list of features to check the current PR on ] { - let-env NU_TEST_LOCALE_OVERRIDE = 'en_US.utf8'; + $env.NU_TEST_LOCALE_OVERRIDE = 'en_US.utf8'; try { fmt --check --verbose } catch { @@ -436,7 +436,7 @@ def compute-coverage [] { # - https://github.com/andythigpen/nvim-coverage (probably needs some additional config) export def cov [] { let start = (date now) - let-env NUSHELL_CARGO_TARGET = "ci" + $env.NUSHELL_CARGO_TARGET = "ci" compute-coverage