Read exit status before failing in failed read from stdout pipe (#1723)

This commit is contained in:
Jason Gedge 2020-05-06 21:42:01 -04:00 committed by GitHub
parent 7ce8026916
commit 27fdef5479
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -339,16 +339,27 @@ fn spawn(
} }
} }
}, },
Err(_) => { Err(e) => {
// If there's an exit status, it makes sense that we may error when
// trying to read from its stdout pipe (likely been closed). In that
// case, don't emit an error.
let should_error = match child.wait() {
Ok(exit_status) => !exit_status.success(),
Err(_) => true,
};
if should_error {
let _ = stdout_read_tx.send(Ok(Value { let _ = stdout_read_tx.send(Ok(Value {
value: UntaggedValue::Error(ShellError::labeled_error( value: UntaggedValue::Error(ShellError::labeled_error(
"Unable to read from stdout.", format!("Unable to read from stdout ({})", e),
"unable to read from stdout", "unable to read from stdout",
&stdout_name_tag, &stdout_name_tag,
)), )),
tag: stdout_name_tag.clone(), tag: stdout_name_tag.clone(),
})); }));
break; }
return Ok(());
} }
} }
} }
@ -358,10 +369,7 @@ fn spawn(
// than what other shells will do. // than what other shells will do.
let external_failed = match child.wait() { let external_failed = match child.wait() {
Err(_) => true, Err(_) => true,
Ok(exit_status) => match exit_status.code() { Ok(exit_status) => !exit_status.success(),
Some(e) if e != 0 => true,
_ => false,
},
}; };
if external_failed { if external_failed {