mirror of
https://github.com/nushell/nushell.git
synced 2025-04-25 13:48:19 +02:00
check external failed in let assignment (#8164)
# Description Fixes: #8136 # User-Facing Changes The following command ``` let VAR = ^cat non-existing-file; echo "failed" ``` will no longer output `failed` message # Tests + Formatting Don't forget to add tests that cover your changes. Make sure you've run and fixed any issues with these commands: - `cargo fmt --all -- --check` to check standard code formatting (`cargo fmt --all` applies these changes) - `cargo clippy --workspace -- -D warnings -D clippy::unwrap_used -A clippy::needless_collect` to check that you're using the standard code style - `cargo test --workspace` to check that all tests pass # After Submitting If your PR had any user-facing changes, update [the documentation](https://github.com/nushell/nushell.github.io) after the PR is merged, if necessary. This will help us keep the docs up to date. --------- Co-authored-by: Reilly Wood <reilly.wood@icloud.com>
This commit is contained in:
parent
2659c359e9
commit
c7966e81c2
@ -60,20 +60,23 @@ impl Command for Let {
|
|||||||
.as_keyword()
|
.as_keyword()
|
||||||
.expect("internal error: missing keyword");
|
.expect("internal error: missing keyword");
|
||||||
|
|
||||||
let rhs = eval_expression_with_input(
|
let (rhs, external_failed) = eval_expression_with_input(
|
||||||
engine_state,
|
engine_state,
|
||||||
stack,
|
stack,
|
||||||
keyword_expr,
|
keyword_expr,
|
||||||
input,
|
input,
|
||||||
call.redirect_stdout,
|
call.redirect_stdout,
|
||||||
call.redirect_stderr,
|
call.redirect_stderr,
|
||||||
)?
|
)?;
|
||||||
.0;
|
if external_failed {
|
||||||
|
// rhs must be a PipelineData::ExternalStream and it's failed
|
||||||
|
// return the failed stream (with a non-zero exit code) so the engine knows to stop running
|
||||||
|
Ok(rhs)
|
||||||
|
} else {
|
||||||
stack.add_var(var_id, rhs.into_value(call.head));
|
stack.add_var(var_id, rhs.into_value(call.head));
|
||||||
|
|
||||||
Ok(PipelineData::empty())
|
Ok(PipelineData::empty())
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn examples(&self) -> Vec<Example> {
|
fn examples(&self) -> Vec<Example> {
|
||||||
vec![
|
vec![
|
||||||
|
@ -25,3 +25,13 @@ fn let_doesnt_mutate() {
|
|||||||
|
|
||||||
assert!(actual.err.contains("immutable"));
|
assert!(actual.err.contains("immutable"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn let_with_external_failed() {
|
||||||
|
let actual = nu!(
|
||||||
|
cwd: ".",
|
||||||
|
pipeline(r#"let x = nu --testbin outcome_err "aa"; echo fail"#)
|
||||||
|
);
|
||||||
|
|
||||||
|
assert!(!actual.out.contains("fail"));
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user