diff options
| author | bors <bors@rust-lang.org> | 2020-07-28 03:42:22 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-07-28 03:42:22 +0000 |
| commit | 1454bbd4fdac9b7272b93fe82860613dccc0afad (patch) | |
| tree | 6fc6dc984f4a6155330961d5667cb6050f8a61df | |
| parent | ac48e62db85e6db4bbe026490381ab205f4a614d (diff) | |
| parent | e7089a97e79fb550dcd76da47c614b2701963327 (diff) | |
| download | rust-1454bbd4fdac9b7272b93fe82860613dccc0afad.tar.gz rust-1454bbd4fdac9b7272b93fe82860613dccc0afad.zip | |
Auto merge of #74841 - infinity0:fix-exec, r=Mark-Simulacrum
rustbuild: use Display for exit status instead of Debug, see #74832 for justification
| -rw-r--r-- | src/bootstrap/bin/rustc.rs | 50 |
1 files changed, 24 insertions, 26 deletions
diff --git a/src/bootstrap/bin/rustc.rs b/src/bootstrap/bin/rustc.rs index af75faf698e..d6649d0521c 100644 --- a/src/bootstrap/bin/rustc.rs +++ b/src/bootstrap/bin/rustc.rs @@ -16,7 +16,6 @@ //! never get replaced. use std::env; -use std::io; use std::path::PathBuf; use std::process::Command; use std::str::FromStr; @@ -147,22 +146,15 @@ fn main() { eprintln!("libdir: {:?}", libdir); } - if let Some(mut on_fail) = on_fail { - let e = match cmd.status() { - Ok(s) if s.success() => std::process::exit(0), - e => e, - }; - println!("\nDid not run successfully: {:?}\n{:?}\n-------------", e, cmd); - status_code(&mut on_fail).expect("could not run the backup command"); - std::process::exit(1); - } + let start = Instant::now(); + let status = { + let errmsg = format!("\nFailed to run:\n{:?}\n-------------", cmd); + cmd.status().expect(&errmsg) + }; if env::var_os("RUSTC_PRINT_STEP_TIMINGS").is_some() { if let Some(crate_name) = crate_name { - let start = Instant::now(); - let status = cmd.status().unwrap_or_else(|_| panic!("\n\n failed to run {:?}", cmd)); let dur = start.elapsed(); - let is_test = args.iter().any(|a| a == "--test"); eprintln!( "[RUSTC-TIMING] {} test:{} {}.{:03}", @@ -171,21 +163,27 @@ fn main() { dur.as_secs(), dur.subsec_millis() ); - - match status.code() { - Some(i) => std::process::exit(i), - None => { - eprintln!("rustc exited with {}", status); - std::process::exit(0xfe); - } - } } } - let code = status_code(&mut cmd).unwrap_or_else(|_| panic!("\n\n failed to run {:?}", cmd)); - std::process::exit(code); -} + if status.success() { + std::process::exit(0); + // note: everything below here is unreachable. do not put code that + // should run on success, after this block. + } + println!("\nDid not run successfully: {}\n{:?}\n-------------", status, cmd); + + if let Some(mut on_fail) = on_fail { + on_fail.status().expect("Could not run the on_fail command"); + } -fn status_code(cmd: &mut Command) -> io::Result<i32> { - cmd.status().map(|status| status.code().unwrap()) + // Preserve the exit code. In case of signal, exit with 0xfe since it's + // awkward to preserve this status in a cross-platform way. + match status.code() { + Some(i) => std::process::exit(i), + None => { + eprintln!("rustc exited with {}", status); + std::process::exit(0xfe); + } + } } |
