diff options
| author | Ximin Luo <infinity0@pwned.gg> | 2020-07-27 23:22:07 +0100 |
|---|---|---|
| committer | Ximin Luo <infinity0@pwned.gg> | 2020-07-27 23:22:07 +0100 |
| commit | e7089a97e79fb550dcd76da47c614b2701963327 (patch) | |
| tree | 7c3eb236f116d9e370da6b3931f966b3e3d3f8b0 /src | |
| parent | 3dcab2922c4eaaea11a6856fa566bdb7a6d9c1f6 (diff) | |
| download | rust-e7089a97e79fb550dcd76da47c614b2701963327.tar.gz rust-e7089a97e79fb550dcd76da47c614b2701963327.zip | |
rustbuild: refactor how the wrapper deals with exit codes
Diffstat (limited to 'src')
| -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 f0cb7be9691..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) } else { format!("Ok({})", s) }, - Err(e) => format!("Err({})", 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); + } + } } |
