diff --git a/crates/nu-command/src/core_commands/for_.rs b/crates/nu-command/src/core_commands/for_.rs index 3889d9ec7..c56fd1fca 100644 --- a/crates/nu-command/src/core_commands/for_.rs +++ b/crates/nu-command/src/core_commands/for_.rs @@ -118,7 +118,10 @@ impl Command for For { return Err(err); } Ok(pipeline) => { - let _ = pipeline.print(&engine_state, stack, false, false)?; + let exit_code = pipeline.print(&engine_state, stack, false, false)?; + if exit_code != 0 { + break; + } } } } @@ -157,7 +160,10 @@ impl Command for For { return Err(err); } Ok(pipeline) => { - let _ = pipeline.print(&engine_state, stack, false, false)?; + let exit_code = pipeline.print(&engine_state, stack, false, false)?; + if exit_code != 0 { + break; + } } } } diff --git a/crates/nu-command/src/core_commands/loop_.rs b/crates/nu-command/src/core_commands/loop_.rs index 3ca8188f7..1b4befd87 100644 --- a/crates/nu-command/src/core_commands/loop_.rs +++ b/crates/nu-command/src/core_commands/loop_.rs @@ -69,7 +69,10 @@ impl Command for Loop { return Err(err); } Ok(pipeline) => { - let _ = pipeline.print(engine_state, stack, false, false)?; + let exit_code = pipeline.print(engine_state, stack, false, false)?; + if exit_code != 0 { + break; + } } } } diff --git a/crates/nu-command/src/core_commands/while_.rs b/crates/nu-command/src/core_commands/while_.rs index eb4237a85..57b4da9b4 100644 --- a/crates/nu-command/src/core_commands/while_.rs +++ b/crates/nu-command/src/core_commands/while_.rs @@ -77,7 +77,11 @@ impl Command for While { return Err(err); } Ok(pipeline) => { - let _ = pipeline.print(engine_state, stack, false, false)?; + let exit_code = + pipeline.print(engine_state, stack, false, false)?; + if exit_code != 0 { + break; + } } } } else { diff --git a/crates/nu-command/tests/commands/for_.rs b/crates/nu-command/tests/commands/for_.rs index 0e480db35..2a6e3ca83 100644 --- a/crates/nu-command/tests/commands/for_.rs +++ b/crates/nu-command/tests/commands/for_.rs @@ -14,3 +14,18 @@ fn for_auto_print_in_each_iteration() { // that's ok, our main concern is it auto print value in each iteration. assert_eq!(actual.out, "11"); } + +#[test] +fn for_break_on_external_failed() { + let actual = nu!( + cwd: ".", + r#" + for i in 1..2 { + echo 1; + nu --testbin fail + }"# + ); + // Note: nu! macro auto repalce "\n" and "\r\n" with "" + // so our output will be `1` + assert_eq!(actual.out, "1"); +} diff --git a/crates/nu-command/tests/commands/loop_.rs b/crates/nu-command/tests/commands/loop_.rs index fef9ce78a..c61ad6cf7 100644 --- a/crates/nu-command/tests/commands/loop_.rs +++ b/crates/nu-command/tests/commands/loop_.rs @@ -20,3 +20,24 @@ fn loop_auto_print_in_each_iteration() { // that's ok, our main concern is it auto print value in each iteration. assert_eq!(actual.out, "111"); } + +#[test] +fn loop_break_on_external_failed() { + let actual = nu!( + cwd: ".", + r#" + mut total = 0; + loop { + if $total == 3 { + break; + } else { + $total += 1; + } + echo 1; + nu --testbin fail; + }"# + ); + // Note: nu! macro auto repalce "\n" and "\r\n" with "" + // so our output will be `1`. + assert_eq!(actual.out, "1"); +} diff --git a/crates/nu-command/tests/commands/while_.rs b/crates/nu-command/tests/commands/while_.rs index 77b430ec5..66556f45e 100644 --- a/crates/nu-command/tests/commands/while_.rs +++ b/crates/nu-command/tests/commands/while_.rs @@ -21,3 +21,14 @@ fn while_auto_print_in_each_iteration() { // that's ok, our main concern is it auto print value in each iteration. assert_eq!(actual.out, "11"); } + +#[test] +fn while_break_on_external_failed() { + let actual = nu!( + cwd: ".", + "mut total = 0; while $total < 2 { $total = $total + 1; echo 1; nu --testbin fail }" + ); + // Note: nu! macro auto repalce "\n" and "\r\n" with "" + // so our output will be `1` + assert_eq!(actual.out, "1"); +}