@@ -9,7 +9,7 @@ use std::{
99 hash:: Hasher ,
1010 io:: { self , Read , Write } ,
1111 path:: Path ,
12- process:: { Child , ChildStderr , Command , Stdio } ,
12+ process:: { Child , ChildStderr , Command , Output , Stdio } ,
1313 sync:: {
1414 atomic:: { AtomicBool , Ordering } ,
1515 Arc ,
@@ -348,24 +348,45 @@ pub(crate) fn run(cmd: &mut Command, cargo_output: &CargoOutput) -> Result<(), E
348348 wait_on_child ( cmd, & mut child, cargo_output)
349349}
350350
351- pub ( crate ) fn run_output ( cmd : & mut Command , cargo_output : & CargoOutput ) -> Result < Vec < u8 > , Error > {
351+ pub ( crate ) fn spawn_and_wait_for_output (
352+ cmd : & mut Command ,
353+ cargo_output : & CargoOutput ,
354+ ) -> Result < Output , Error > {
352355 // We specifically need the output to be captured, so override default
353356 let mut captured_cargo_output = cargo_output. clone ( ) ;
354357 captured_cargo_output. output = OutputKind :: Capture ;
355- let mut child = spawn ( cmd, & captured_cargo_output) ?;
358+ spawn ( cmd, & captured_cargo_output) ?
359+ . wait_with_output ( )
360+ . map_err ( |e| {
361+ Error :: new (
362+ ErrorKind :: ToolExecError ,
363+ format ! ( "failed to wait on spawned child process `{cmd:?}`: {e}" ) ,
364+ )
365+ } )
366+ }
367+
368+ pub ( crate ) fn run_output ( cmd : & mut Command , cargo_output : & CargoOutput ) -> Result < Vec < u8 > , Error > {
369+ let Output {
370+ status,
371+ stdout,
372+ stderr,
373+ } = spawn_and_wait_for_output ( cmd, cargo_output) ?;
356374
357- let mut stdout = vec ! [ ] ;
358- child
359- . stdout
360- . take ( )
361- . unwrap ( )
362- . read_to_end ( & mut stdout)
363- . unwrap ( ) ;
375+ stderr
376+ . split ( |& b| b == b'\n' )
377+ . filter ( |part| !part. is_empty ( ) )
378+ . for_each ( write_warning) ;
364379
365- // Don't care about this output, use the normal settings
366- wait_on_child ( cmd, & mut child, cargo_output) ?;
380+ cargo_output. print_debug ( & status) ;
367381
368- Ok ( stdout)
382+ if status. success ( ) {
383+ Ok ( stdout)
384+ } else {
385+ Err ( Error :: new (
386+ ErrorKind :: ToolExecError ,
387+ format ! ( "command did not execute successfully (status code {status}): {cmd:?}" ) ,
388+ ) )
389+ }
369390}
370391
371392pub ( crate ) fn spawn ( cmd : & mut Command , cargo_output : & CargoOutput ) -> Result < Child , Error > {
0 commit comments