@@ -12,7 +12,6 @@ use std::ffi::OsStr;
12
12
use std:: io:: BufReader ;
13
13
use std:: io:: prelude:: * ;
14
14
use std:: path:: { Path , PathBuf } ;
15
- use std:: process:: Stdio ;
16
15
use std:: { env, fs, str} ;
17
16
18
17
use serde_derive:: Deserialize ;
@@ -2507,7 +2506,6 @@ pub fn stream_cargo(
2507
2506
#[ cfg( feature = "tracing" ) ]
2508
2507
let _run_span = crate :: trace_cmd!( cmd) ;
2509
2508
2510
- let cargo = cmd. as_command_mut ( ) ;
2511
2509
// Instruct Cargo to give us json messages on stdout, critically leaving
2512
2510
// stderr as piped so we can get those pretty colors.
2513
2511
let mut message_format = if builder. config . json_output {
@@ -2519,27 +2517,24 @@ pub fn stream_cargo(
2519
2517
message_format. push_str ( ",json-diagnostic-" ) ;
2520
2518
message_format. push_str ( s) ;
2521
2519
}
2522
- cargo . arg ( "--message-format" ) . arg ( message_format) . stdout ( Stdio :: piped ( ) ) ;
2520
+ cmd . arg ( "--message-format" ) . arg ( message_format) ;
2523
2521
2524
2522
for arg in tail_args {
2525
- cargo . arg ( arg) ;
2523
+ cmd . arg ( arg) ;
2526
2524
}
2527
2525
2528
- builder. verbose ( || println ! ( "running: {cargo :?}" ) ) ;
2526
+ builder. verbose ( || println ! ( "running: {cmd :?}" ) ) ;
2529
2527
2530
- if builder. config . dry_run ( ) {
2531
- return true ;
2532
- }
2528
+ let streaming_command = cmd. stream_capture_stdout ( & builder. config . exec_ctx ) ;
2533
2529
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 ;
2537
2532
} ;
2538
2533
2539
2534
// Spawn Cargo slurping up its JSON output. We'll start building up the
2540
2535
// `deps` array of all files it generated along with a `toplevel` array of
2541
2536
// 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 ( ) ) ;
2543
2538
for line in stdout. lines ( ) {
2544
2539
let line = t ! ( line) ;
2545
2540
match serde_json:: from_str :: < CargoMessage < ' _ > > ( & line) {
@@ -2556,13 +2551,14 @@ pub fn stream_cargo(
2556
2551
}
2557
2552
2558
2553
// 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( ) ) ;
2560
2555
if builder. is_verbose ( ) && !status. success ( ) {
2561
2556
eprintln ! (
2562
- "command did not execute successfully: {cargo :?}\n \
2557
+ "command did not execute successfully: {cmd :?}\n \
2563
2558
expected success, got: {status}"
2564
2559
) ;
2565
2560
}
2561
+
2566
2562
status. success ( )
2567
2563
}
2568
2564
0 commit comments