Skip to content

Commit 529f6ec

Browse files
authored
Load experimental options before command context is loaded (nushell#16690)
1 parent a1b6a08 commit 529f6ec

File tree

3 files changed

+29
-21
lines changed

3 files changed

+29
-21
lines changed

crates/nu-cmd-lang/src/default_context.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ use crate::*;
22
use nu_protocol::engine::{EngineState, StateWorkingSet};
33

44
pub fn create_default_context() -> EngineState {
5-
let mut engine_state = EngineState::new();
5+
let engine_state = EngineState::new();
6+
add_default_context(engine_state)
7+
}
68

9+
pub fn add_default_context(mut engine_state: EngineState) -> EngineState {
710
let delta = {
811
let mut working_set = StateWorkingSet::new(&engine_state);
912

src/command_context.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use nu_protocol::engine::EngineState;
22

3-
pub(crate) fn get_engine_state() -> EngineState {
4-
let engine_state = nu_cmd_lang::create_default_context();
3+
pub(crate) fn add_command_context(engine_state: EngineState) -> EngineState {
4+
let engine_state = nu_cmd_lang::add_default_context(engine_state);
55
#[cfg(feature = "plugin")]
66
let engine_state = nu_cmd_plugin::add_plugin_command_context(engine_state);
77
let engine_state = nu_command::add_shell_command_context(engine_state);
@@ -27,7 +27,7 @@ mod tests {
2727
}
2828
}
2929

30-
let ctx = get_engine_state();
30+
let ctx = add_command_context(EngineState::new());
3131
let decls = ctx.get_decls_sorted(true);
3232
let mut failures = Vec::new();
3333

@@ -77,7 +77,7 @@ mod tests {
7777
}
7878
}
7979

80-
let ctx = get_engine_state();
80+
let ctx = add_command_context(EngineState::new());
8181
let decls = ctx.get_decls_sorted(true);
8282
let mut failures = Vec::new();
8383

@@ -108,7 +108,7 @@ mod tests {
108108

109109
#[test]
110110
fn signature_name_matches_command_name() {
111-
let ctx = get_engine_state();
111+
let ctx = add_command_context(EngineState::new());
112112
let decls = ctx.get_decls_sorted(true);
113113
let mut failures = Vec::new();
114114

@@ -134,7 +134,7 @@ mod tests {
134134

135135
#[test]
136136
fn commands_declare_input_output_types() {
137-
let ctx = get_engine_state();
137+
let ctx = add_command_context(EngineState::new());
138138
let decls = ctx.get_decls_sorted(true);
139139
let mut failures = Vec::new();
140140

@@ -164,7 +164,7 @@ mod tests {
164164

165165
#[test]
166166
fn no_search_term_duplicates() {
167-
let ctx = get_engine_state();
167+
let ctx = add_command_context(EngineState::new());
168168
let decls = ctx.get_decls_sorted(true);
169169
let mut failures = Vec::new();
170170

@@ -190,7 +190,7 @@ mod tests {
190190

191191
#[test]
192192
fn description_end_period() {
193-
let ctx = get_engine_state();
193+
let ctx = add_command_context(EngineState::new());
194194
let decls = ctx.get_decls_sorted(true);
195195
let mut failures = Vec::new();
196196

@@ -213,7 +213,7 @@ mod tests {
213213

214214
#[test]
215215
fn description_start_uppercase() {
216-
let ctx = get_engine_state();
216+
let ctx = add_command_context(EngineState::new());
217217
let decls = ctx.get_decls_sorted(true);
218218
let mut failures = Vec::new();
219219

src/main.rs

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ use nu_lsp::LanguageServer;
2424
use nu_path::canonicalize_with;
2525
use nu_protocol::{
2626
ByteStream, Config, IntoValue, PipelineData, ShellError, Span, Spanned, Type, Value,
27-
engine::Stack, record, report_shell_error,
27+
engine::{EngineState, Stack},
28+
record, report_shell_error,
2829
};
2930
use nu_std::load_standard_library;
3031
use nu_utils::perf;
@@ -63,7 +64,20 @@ fn main() -> Result<()> {
6364
miette_hook(x);
6465
}));
6566

66-
let mut engine_state = command_context::get_engine_state();
67+
let mut engine_state = EngineState::new();
68+
69+
// Parse commandline args very early and load experimental options to allow loading different
70+
// commands based on experimental options.
71+
let (args_to_nushell, script_name, args_to_script) = gather_commandline_args();
72+
let parsed_nu_cli_args = parse_commandline_args(&args_to_nushell.join(" "), &mut engine_state)
73+
.unwrap_or_else(|err| {
74+
report_shell_error(&engine_state, &err);
75+
std::process::exit(1)
76+
});
77+
78+
experimental_options::load(&engine_state, &parsed_nu_cli_args, !script_name.is_empty());
79+
80+
let mut engine_state = command_context::add_command_context(engine_state);
6781

6882
// Provide `version` the features of this nu binary
6983
let cargo_features = env!("NU_FEATURES").split(",").map(Cow::Borrowed).collect();
@@ -195,15 +209,6 @@ fn main() -> Result<()> {
195209
#[cfg(feature = "sqlite")]
196210
db.last_insert_rowid();
197211

198-
let (args_to_nushell, script_name, args_to_script) = gather_commandline_args();
199-
let parsed_nu_cli_args = parse_commandline_args(&args_to_nushell.join(" "), &mut engine_state)
200-
.unwrap_or_else(|err| {
201-
report_shell_error(&engine_state, &err);
202-
std::process::exit(1)
203-
});
204-
205-
experimental_options::load(&engine_state, &parsed_nu_cli_args, !script_name.is_empty());
206-
207212
// keep this condition in sync with the branches at the end
208213
engine_state.is_interactive = parsed_nu_cli_args.interactive_shell.is_some()
209214
|| (parsed_nu_cli_args.testbin.is_none()

0 commit comments

Comments
 (0)