forked from extern/nushell
feat: coredump (#6791)
fix issue in https://github.com/nushell/nushell/issues/5903 return Error to pipeline_data, if match error, then return error directly
This commit is contained in:
parent
8224ec49bc
commit
c9fb381d69
@ -342,6 +342,8 @@ impl ExternalCommand {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(unix)]
|
||||||
|
let commandname = self.name.item.clone();
|
||||||
let redirect_stdout = self.redirect_stdout;
|
let redirect_stdout = self.redirect_stdout;
|
||||||
let redirect_stderr = self.redirect_stderr;
|
let redirect_stderr = self.redirect_stderr;
|
||||||
let span = self.name.span;
|
let span = self.name.span;
|
||||||
@ -378,6 +380,28 @@ impl ExternalCommand {
|
|||||||
span,
|
span,
|
||||||
)),
|
)),
|
||||||
Ok(x) => {
|
Ok(x) => {
|
||||||
|
#[cfg(unix)]
|
||||||
|
{
|
||||||
|
use nu_ansi_term::{Color, Style};
|
||||||
|
use std::os::unix::process::ExitStatusExt;
|
||||||
|
if x.core_dumped() {
|
||||||
|
let style = Style::new().bold().on(Color::Red);
|
||||||
|
println!(
|
||||||
|
"{}",
|
||||||
|
style.paint(format!(
|
||||||
|
"nushell: oops, process '{commandname}' core dumped"
|
||||||
|
))
|
||||||
|
);
|
||||||
|
let _ = exit_code_tx.send(Value::Error {
|
||||||
|
error: ShellError::ExternalCommand(
|
||||||
|
"core dumped".to_string(),
|
||||||
|
format!("Child process '{commandname}' core dumped"),
|
||||||
|
head,
|
||||||
|
),
|
||||||
|
});
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
}
|
||||||
if let Some(code) = x.code() {
|
if let Some(code) = x.code() {
|
||||||
let _ = exit_code_tx.send(Value::Int {
|
let _ = exit_code_tx.send(Value::Int {
|
||||||
val: code as i64,
|
val: code as i64,
|
||||||
|
@ -445,9 +445,12 @@ impl PipelineData {
|
|||||||
// Make sure everything has finished
|
// Make sure everything has finished
|
||||||
if let Some(exit_code) = exit_code {
|
if let Some(exit_code) = exit_code {
|
||||||
let mut exit_codes: Vec<_> = exit_code.into_iter().collect();
|
let mut exit_codes: Vec<_> = exit_code.into_iter().collect();
|
||||||
if let Some(Value::Int { val, .. }) = exit_codes.pop() {
|
return match exit_codes.pop() {
|
||||||
return Ok(val);
|
#[cfg(unix)]
|
||||||
}
|
Some(Value::Error { error }) => Err(error),
|
||||||
|
Some(Value::Int { val, .. }) => Ok(val),
|
||||||
|
_ => Ok(0),
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return Ok(0);
|
return Ok(0);
|
||||||
|
Loading…
Reference in New Issue
Block a user