mirror of
https://github.com/nushell/nushell
synced 2025-01-27 12:25:19 +00:00
Increment SHLVL before run_repl() (#14732)
# Description A follow-on to #14727: * Instead of using `is-interactive` as the trigger for incrementing `SHLVL`, this change puts the increment logic just before `run_repl()` is called. * Tests are changed to use `-e` * Moves the `confirm_stdin_is_terminal()` call immediately **after** the `prerun_cmd` (which executes `--execute (-e) <commandstring>`. The fact that it was **before** that call seems to be a bug, since the error message says *"or provide arguments to invoke a script"* even if `--execute` was used. This change enables REPL testing using `--execute (-e)`. * Added a test to ensure `-c` does *not* increment SHLVL. # User-Facing Changes `$env.SHLVL` runs before the REPL is started, rather than when `is-interactive` # Tests + Formatting - 🟢 `toolkit fmt` - 🟢 `toolkit clippy` - 🟢 `toolkit test` - 🟢 `toolkit test stdlib` # After Submitting N/A
This commit is contained in:
parent
6325bc5e54
commit
d702c4605a
3 changed files with 53 additions and 35 deletions
|
@ -63,8 +63,6 @@ pub fn evaluate_repl(
|
||||||
let config = engine_state.get_config();
|
let config = engine_state.get_config();
|
||||||
let use_color = config.use_ansi_coloring.get(engine_state);
|
let use_color = config.use_ansi_coloring.get(engine_state);
|
||||||
|
|
||||||
confirm_stdin_is_terminal()?;
|
|
||||||
|
|
||||||
let mut entry_num = 0;
|
let mut entry_num = 0;
|
||||||
|
|
||||||
// Let's grab the shell_integration configs
|
// Let's grab the shell_integration configs
|
||||||
|
@ -104,6 +102,8 @@ pub fn evaluate_repl(
|
||||||
engine_state.merge_env(&mut unique_stack)?;
|
engine_state.merge_env(&mut unique_stack)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
confirm_stdin_is_terminal()?;
|
||||||
|
|
||||||
let hostname = System::host_name();
|
let hostname = System::host_name();
|
||||||
if shell_integration_osc2 {
|
if shell_integration_osc2 {
|
||||||
run_shell_integration_osc2(None, engine_state, &mut unique_stack, use_color);
|
run_shell_integration_osc2(None, engine_state, &mut unique_stack, use_color);
|
||||||
|
|
59
src/main.rs
59
src/main.rs
|
@ -323,36 +323,6 @@ fn main() -> Result<()> {
|
||||||
"NU_VERSION".to_string(),
|
"NU_VERSION".to_string(),
|
||||||
Value::string(env!("CARGO_PKG_VERSION"), Span::unknown()),
|
Value::string(env!("CARGO_PKG_VERSION"), Span::unknown()),
|
||||||
);
|
);
|
||||||
// Add SHLVL if interactive
|
|
||||||
if engine_state.is_interactive {
|
|
||||||
engine_state.add_env_var("PROMPT_INDICATOR".to_string(), Value::test_string("> "));
|
|
||||||
engine_state.add_env_var(
|
|
||||||
"PROMPT_INDICATOR_VI_NORMAL".to_string(),
|
|
||||||
Value::test_string("> "),
|
|
||||||
);
|
|
||||||
engine_state.add_env_var(
|
|
||||||
"PROMPT_INDICATOR_VI_INSERT".to_string(),
|
|
||||||
Value::test_string(": "),
|
|
||||||
);
|
|
||||||
engine_state.add_env_var(
|
|
||||||
"PROMPT_MULTILINE_INDICATOR".to_string(),
|
|
||||||
Value::test_string("::: "),
|
|
||||||
);
|
|
||||||
engine_state.add_env_var(
|
|
||||||
"TRANSIENT_PROMPT_MULTILINE_INDICATOR".to_string(),
|
|
||||||
Value::test_string(""),
|
|
||||||
);
|
|
||||||
engine_state.add_env_var(
|
|
||||||
"TRANSIENT_PROMPT_COMMAND_RIGHT".to_string(),
|
|
||||||
Value::test_string(""),
|
|
||||||
);
|
|
||||||
let mut shlvl = engine_state
|
|
||||||
.get_env_var("SHLVL")
|
|
||||||
.map(|x| x.as_str().unwrap_or("0").parse::<i64>().unwrap_or(0))
|
|
||||||
.unwrap_or(0);
|
|
||||||
shlvl += 1;
|
|
||||||
engine_state.add_env_var("SHLVL".to_string(), Value::int(shlvl, Span::unknown()));
|
|
||||||
}
|
|
||||||
|
|
||||||
if parsed_nu_cli_args.no_std_lib.is_none() {
|
if parsed_nu_cli_args.no_std_lib.is_none() {
|
||||||
load_standard_library(&mut engine_state)?;
|
load_standard_library(&mut engine_state)?;
|
||||||
|
@ -510,6 +480,35 @@ fn main() -> Result<()> {
|
||||||
input,
|
input,
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
// Environment variables that apply only when in REPL
|
||||||
|
engine_state.add_env_var("PROMPT_INDICATOR".to_string(), Value::test_string("> "));
|
||||||
|
engine_state.add_env_var(
|
||||||
|
"PROMPT_INDICATOR_VI_NORMAL".to_string(),
|
||||||
|
Value::test_string("> "),
|
||||||
|
);
|
||||||
|
engine_state.add_env_var(
|
||||||
|
"PROMPT_INDICATOR_VI_INSERT".to_string(),
|
||||||
|
Value::test_string(": "),
|
||||||
|
);
|
||||||
|
engine_state.add_env_var(
|
||||||
|
"PROMPT_MULTILINE_INDICATOR".to_string(),
|
||||||
|
Value::test_string("::: "),
|
||||||
|
);
|
||||||
|
engine_state.add_env_var(
|
||||||
|
"TRANSIENT_PROMPT_MULTILINE_INDICATOR".to_string(),
|
||||||
|
Value::test_string(""),
|
||||||
|
);
|
||||||
|
engine_state.add_env_var(
|
||||||
|
"TRANSIENT_PROMPT_COMMAND_RIGHT".to_string(),
|
||||||
|
Value::test_string(""),
|
||||||
|
);
|
||||||
|
let mut shlvl = engine_state
|
||||||
|
.get_env_var("SHLVL")
|
||||||
|
.map(|x| x.as_str().unwrap_or("0").parse::<i64>().unwrap_or(0))
|
||||||
|
.unwrap_or(0);
|
||||||
|
shlvl += 1;
|
||||||
|
engine_state.add_env_var("SHLVL".to_string(), Value::int(shlvl, Span::unknown()));
|
||||||
|
|
||||||
run_repl(&mut engine_state, parsed_nu_cli_args, entire_start_time)?
|
run_repl(&mut engine_state, parsed_nu_cli_args, entire_start_time)?
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -231,17 +231,36 @@ fn std_log_env_vars_have_defaults() {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn env_shlvl() {
|
fn env_shlvl_commandstring_does_not_increment() {
|
||||||
let actual = nu!("
|
let actual = nu!("
|
||||||
$env.SHLVL = 5
|
$env.SHLVL = 5
|
||||||
nu -i -c 'print $env.SHLVL'
|
nu -c 'print $env.SHLVL; exit'
|
||||||
|
");
|
||||||
|
|
||||||
|
assert_eq!(actual.out, "5");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Note: Do not use -i / --interactive in tests.
|
||||||
|
// -i attempts to acquire a terminal, and if more than one
|
||||||
|
// test tries to obtain a terminal at the same time, the
|
||||||
|
// test run will likely hang, at least for some users.
|
||||||
|
// Instead, use -e / --execute with an `exit` to test REPL
|
||||||
|
// functionality as demonstrated below.
|
||||||
|
#[test]
|
||||||
|
fn env_shlvl_in_repl() {
|
||||||
|
let actual = nu!("
|
||||||
|
$env.SHLVL = 5
|
||||||
|
nu --no-std-lib -n -e 'print $env.SHLVL; exit'
|
||||||
");
|
");
|
||||||
|
|
||||||
assert_eq!(actual.out, "6");
|
assert_eq!(actual.out, "6");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn env_shlvl_in_exec_repl() {
|
||||||
let actual = nu!("
|
let actual = nu!("
|
||||||
$env.SHLVL = 29
|
$env.SHLVL = 29
|
||||||
nu -i -c \"exec nu -i -c 'print $env.SHLVL'\"
|
nu -c \"exec nu --no-std-lib -n -e 'print $env.SHLVL; exit'\"
|
||||||
");
|
");
|
||||||
|
|
||||||
assert_eq!(actual.out, "30");
|
assert_eq!(actual.out, "30");
|
||||||
|
|
Loading…
Reference in a new issue