mirror of
https://github.com/nushell/nushell.git
synced 2025-08-11 00:14:31 +02:00
Update config directly at assignment (#13332)
# Description Allows `Stack` to have a modified local `Config`, which is updated immediately when `$env.config` is assigned to. This means that even within a script, commands that come after `$env.config` changes will always see those changes in `Stack::get_config()`. Also fixed a lot of cases where `engine_state.get_config()` was used even when `Stack` was available. Closes #13324. # User-Facing Changes - Config changes apply immediately after the assignment is executed, rather than whenever config is read by a command that needs it. - Potentially slower performance when executing a lot of lines that change `$env.config` one after another. Recommended to get `$env.config` into a `mut` variable first and do modifications, then assign it back. - Much faster performance when executing a script that made modifications to `$env.config`, as the changes are only parsed once. # Tests + Formatting All passing. # After Submitting - [ ] release notes
This commit is contained in:
@ -1,6 +1,6 @@
|
||||
use crate::eval_ir_block;
|
||||
#[allow(deprecated)]
|
||||
use crate::{current_dir, get_config, get_full_help};
|
||||
use crate::{current_dir, get_full_help};
|
||||
use nu_path::{expand_path_with, AbsolutePathBuf};
|
||||
use nu_protocol::{
|
||||
ast::{
|
||||
@ -14,7 +14,7 @@ use nu_protocol::{
|
||||
Spanned, Type, Value, VarId, ENV_VARIABLE_ID,
|
||||
};
|
||||
use nu_utils::IgnoreCaseExt;
|
||||
use std::{borrow::Cow, fs::OpenOptions, path::PathBuf};
|
||||
use std::{fs::OpenOptions, path::PathBuf, sync::Arc};
|
||||
|
||||
pub fn eval_call<D: DebugContext>(
|
||||
engine_state: &EngineState,
|
||||
@ -196,6 +196,9 @@ pub fn redirect_env(engine_state: &EngineState, caller_stack: &mut Stack, callee
|
||||
for (var, value) in callee_stack.get_stack_env_vars() {
|
||||
caller_stack.add_env_var(var, value);
|
||||
}
|
||||
|
||||
// set config to callee config, to capture any updates to that
|
||||
caller_stack.config = callee_stack.config.clone();
|
||||
}
|
||||
|
||||
fn eval_external(
|
||||
@ -652,8 +655,8 @@ impl Eval for EvalRuntime {
|
||||
|
||||
type MutState = Stack;
|
||||
|
||||
fn get_config<'a>(engine_state: Self::State<'a>, stack: &mut Stack) -> Cow<'a, Config> {
|
||||
Cow::Owned(get_config(engine_state, stack))
|
||||
fn get_config(engine_state: Self::State<'_>, stack: &mut Stack) -> Arc<Config> {
|
||||
stack.get_config(engine_state)
|
||||
}
|
||||
|
||||
fn eval_filepath(
|
||||
@ -843,7 +846,14 @@ impl Eval for EvalRuntime {
|
||||
});
|
||||
}
|
||||
|
||||
let is_config = original_key == "config";
|
||||
|
||||
stack.add_env_var(original_key, value);
|
||||
|
||||
// Trigger the update to config, if we modified that.
|
||||
if is_config {
|
||||
stack.update_config(engine_state)?;
|
||||
}
|
||||
} else {
|
||||
lhs.upsert_data_at_cell_path(&cell_path.tail, rhs)?;
|
||||
stack.add_var(*var_id, lhs);
|
||||
|
Reference in New Issue
Block a user