@@ -12,7 +12,6 @@ use std::ffi::OsStr;
1212use std:: io:: BufReader ;
1313use std:: io:: prelude:: * ;
1414use std:: path:: { Path , PathBuf } ;
15- use std:: process:: Stdio ;
1615use std:: { env, fs, str} ;
1716
1817use serde_derive:: Deserialize ;
@@ -2507,7 +2506,6 @@ pub fn stream_cargo(
25072506 #[ cfg( feature = "tracing" ) ]
25082507 let _run_span = crate :: trace_cmd!( cmd) ;
25092508
2510- let cargo = cmd. as_command_mut ( ) ;
25112509 // Instruct Cargo to give us json messages on stdout, critically leaving
25122510 // stderr as piped so we can get those pretty colors.
25132511 let mut message_format = if builder. config . json_output {
@@ -2519,27 +2517,24 @@ pub fn stream_cargo(
25192517 message_format. push_str ( ",json-diagnostic-" ) ;
25202518 message_format. push_str ( s) ;
25212519 }
2522- cargo . arg ( "--message-format" ) . arg ( message_format) . stdout ( Stdio :: piped ( ) ) ;
2520+ cmd . arg ( "--message-format" ) . arg ( message_format) ;
25232521
25242522 for arg in tail_args {
2525- cargo . arg ( arg) ;
2523+ cmd . arg ( arg) ;
25262524 }
25272525
2528- builder. verbose ( || println ! ( "running: {cargo :?}" ) ) ;
2526+ builder. verbose ( || println ! ( "running: {cmd :?}" ) ) ;
25292527
2530- if builder. config . dry_run ( ) {
2531- return true ;
2532- }
2528+ let streaming_command = cmd. stream_capture_stdout ( & builder. config . exec_ctx ) ;
25332529
2534- let mut child = match cargo. spawn ( ) {
2535- Ok ( child) => child,
2536- Err ( e) => panic ! ( "failed to execute command: {cargo:?}\n ERROR: {e}" ) ,
2530+ let Some ( mut streaming_command) = streaming_command else {
2531+ return true ;
25372532 } ;
25382533
25392534 // Spawn Cargo slurping up its JSON output. We'll start building up the
25402535 // `deps` array of all files it generated along with a `toplevel` array of
25412536 // files we need to probe for later.
2542- let stdout = BufReader :: new ( child . stdout . take ( ) . unwrap ( ) ) ;
2537+ let stdout = BufReader :: new ( streaming_command . stdout . take ( ) . unwrap ( ) ) ;
25432538 for line in stdout. lines ( ) {
25442539 let line = t ! ( line) ;
25452540 match serde_json:: from_str :: < CargoMessage < ' _ > > ( & line) {
@@ -2556,13 +2551,14 @@ pub fn stream_cargo(
25562551 }
25572552
25582553 // Make sure Cargo actually succeeded after we read all of its stdout.
2559- let status = t ! ( child . wait( ) ) ;
2554+ let status = t ! ( streaming_command . wait( ) ) ;
25602555 if builder. is_verbose ( ) && !status. success ( ) {
25612556 eprintln ! (
2562- "command did not execute successfully: {cargo :?}\n \
2557+ "command did not execute successfully: {cmd :?}\n \
25632558 expected success, got: {status}"
25642559 ) ;
25652560 }
2561+
25662562 status. success ( )
25672563}
25682564
0 commit comments