mirror of
https://github.com/nushell/nushell
synced 2024-12-25 12:33:17 +00:00
Fix return setting last exit code (#14120)
# Description Fixes #14113 and #14112. # Tests + Formatting Added a test.
This commit is contained in:
parent
28b6db115a
commit
e911ff4d67
5 changed files with 16 additions and 7 deletions
|
@ -221,7 +221,7 @@ pub fn eval_source(
|
||||||
report_shell_error(engine_state, &err);
|
report_shell_error(engine_state, &err);
|
||||||
let code = err.exit_code();
|
let code = err.exit_code();
|
||||||
stack.set_last_error(&err);
|
stack.set_last_error(&err);
|
||||||
code
|
code.unwrap_or(0)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -32,3 +32,9 @@ fn return_works_in_script_with_def_main() {
|
||||||
);
|
);
|
||||||
assert!(actual.err.is_empty());
|
assert!(actual.err.is_empty());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_does_not_set_last_exit_code() {
|
||||||
|
let actual = nu!("hide-env LAST_EXIT_CODE; do --env { return 42 }; $env.LAST_EXIT_CODE?");
|
||||||
|
assert!(matches!(actual.out.as_str(), ""));
|
||||||
|
}
|
||||||
|
|
|
@ -287,8 +287,8 @@ impl Stack {
|
||||||
pub fn set_last_error(&mut self, error: &ShellError) {
|
pub fn set_last_error(&mut self, error: &ShellError) {
|
||||||
if let Some(code) = error.external_exit_code() {
|
if let Some(code) = error.external_exit_code() {
|
||||||
self.set_last_exit_code(code.item, code.span);
|
self.set_last_exit_code(code.item, code.span);
|
||||||
} else {
|
} else if let Some(code) = error.exit_code() {
|
||||||
self.set_last_exit_code(1, Span::unknown());
|
self.set_last_exit_code(code, Span::unknown());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1470,8 +1470,11 @@ impl ShellError {
|
||||||
Some(Spanned { item, span })
|
Some(Spanned { item, span })
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn exit_code(&self) -> i32 {
|
pub fn exit_code(&self) -> Option<i32> {
|
||||||
self.external_exit_code().map(|e| e.item).unwrap_or(1)
|
match self {
|
||||||
|
Self::Return { .. } | Self::Break { .. } | Self::Continue { .. } => None,
|
||||||
|
_ => self.external_exit_code().map(|e| e.item).or(Some(1)),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn into_value(self, span: Span) -> Value {
|
pub fn into_value(self, span: Span) -> Value {
|
||||||
|
|
|
@ -104,7 +104,7 @@ pub(crate) fn run_commands(
|
||||||
|
|
||||||
if let Err(err) = result {
|
if let Err(err) = result {
|
||||||
report_shell_error(engine_state, &err);
|
report_shell_error(engine_state, &err);
|
||||||
std::process::exit(err.exit_code());
|
std::process::exit(err.exit_code().unwrap_or(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -178,7 +178,7 @@ pub(crate) fn run_file(
|
||||||
|
|
||||||
if let Err(err) = result {
|
if let Err(err) = result {
|
||||||
report_shell_error(engine_state, &err);
|
report_shell_error(engine_state, &err);
|
||||||
std::process::exit(err.exit_code());
|
std::process::exit(err.exit_code().unwrap_or(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue