From 222c30764859a5c78c11c233ae1c1521356c026b Mon Sep 17 00:00:00 2001 From: Wind Date: Tue, 3 Jun 2025 10:11:58 +0800 Subject: [PATCH] overlay new: add `--reload(-r)` flag (#15849) # Description Close: #15747 To support `reload` feature, we just need to save `caller_stack` before adding overlay, then redirect_env back after the overlay is added. # User-Facing Changes NaN # Tests + Formatting Added 1 test # After Submitting NaN --- .../src/core_commands/overlay/new.rs | 20 +++++++++++++++---- tests/overlays/mod.rs | 17 ++++++++++++++++ 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/crates/nu-cmd-lang/src/core_commands/overlay/new.rs b/crates/nu-cmd-lang/src/core_commands/overlay/new.rs index 98356971f2..fa1acbc82a 100644 --- a/crates/nu-cmd-lang/src/core_commands/overlay/new.rs +++ b/crates/nu-cmd-lang/src/core_commands/overlay/new.rs @@ -1,4 +1,4 @@ -use nu_engine::command_prelude::*; +use nu_engine::{command_prelude::*, redirect_env}; use nu_protocol::engine::CommandType; #[derive(Clone)] @@ -18,6 +18,11 @@ impl Command for OverlayNew { .input_output_types(vec![(Type::Nothing, Type::Nothing)]) .allow_variants_without_examples(true) .required("name", SyntaxShape::String, "Name of the overlay.") + .switch( + "reload", + "If the overlay already exists, reload its environment.", + Some('r'), + ) // TODO: // .switch( // "prefix", @@ -41,13 +46,20 @@ This command is a parser keyword. For details, check: fn run( &self, engine_state: &EngineState, - stack: &mut Stack, + caller_stack: &mut Stack, call: &Call, _input: PipelineData, ) -> Result { - let name_arg: Spanned = call.req(engine_state, stack, 0)?; + let name_arg: Spanned = call.req(engine_state, caller_stack, 0)?; + let reload = call.has_flag(engine_state, caller_stack, "reload")?; - stack.add_overlay(name_arg.item); + if reload { + let callee_stack = caller_stack.clone(); + caller_stack.add_overlay(name_arg.item); + redirect_env(engine_state, caller_stack, &callee_stack); + } else { + caller_stack.add_overlay(name_arg.item); + } Ok(PipelineData::empty()) } diff --git a/tests/overlays/mod.rs b/tests/overlays/mod.rs index 40fe45b1a7..8c045db7d0 100644 --- a/tests/overlays/mod.rs +++ b/tests/overlays/mod.rs @@ -1377,6 +1377,23 @@ fn alias_overlay_new() { assert_eq!(actual_repl.out, "eggs"); } +#[test] +fn overlay_new_with_reload() { + let inp = &[ + "overlay new spam", + "$env.foo = 'bar'", + "overlay hide spam", + "overlay new spam -r", + "'foo' in $env", + ]; + + let actual = nu!(&inp.join("; ")); + let actual_repl = nu!(nu_repl_code(inp)); + + assert_eq!(actual.out, "false"); + assert_eq!(actual_repl.out, "false"); +} + #[test] fn overlay_use_module_dir() { let import = "overlay use samples/spam";