about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2020-07-28 03:42:22 +0000
committerbors <bors@rust-lang.org>2020-07-28 03:42:22 +0000
commit1454bbd4fdac9b7272b93fe82860613dccc0afad (patch)
tree6fc6dc984f4a6155330961d5667cb6050f8a61df
parentac48e62db85e6db4bbe026490381ab205f4a614d (diff)
parente7089a97e79fb550dcd76da47c614b2701963327 (diff)
downloadrust-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.rs50
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);
+        }
+    }
 }