@@ -456,42 +456,56 @@ impl CargoActor {
456456 // simply skip a line if it doesn't parse, which just ignores any
457457 // erroneous output.
458458
459- let mut error = String :: new ( ) ;
460- let mut read_at_least_one_message = false ;
459+ let mut stdout_errors = String :: new ( ) ;
460+ let mut stderr_errors = String :: new ( ) ;
461+ let mut read_at_least_one_stdout_message = false ;
462+ let mut read_at_least_one_stderr_message = false ;
463+ let process_line = |line : & str , error : & mut String | {
464+ // Try to deserialize a message from Cargo or Rustc.
465+ let mut deserializer = serde_json:: Deserializer :: from_str ( line) ;
466+ deserializer. disable_recursion_limit ( ) ;
467+ if let Ok ( message) = JsonMessage :: deserialize ( & mut deserializer) {
468+ match message {
469+ // Skip certain kinds of messages to only spend time on what's useful
470+ JsonMessage :: Cargo ( message) => match message {
471+ cargo_metadata:: Message :: CompilerArtifact ( artifact) if !artifact. fresh => {
472+ self . sender . send ( CargoMessage :: CompilerArtifact ( artifact) ) . unwrap ( ) ;
473+ }
474+ cargo_metadata:: Message :: CompilerMessage ( msg) => {
475+ self . sender . send ( CargoMessage :: Diagnostic ( msg. message ) ) . unwrap ( ) ;
476+ }
477+ _ => ( ) ,
478+ } ,
479+ JsonMessage :: Rustc ( message) => {
480+ self . sender . send ( CargoMessage :: Diagnostic ( message) ) . unwrap ( ) ;
481+ }
482+ }
483+ return true ;
484+ }
485+
486+ error. push_str ( line) ;
487+ error. push ( '\n' ) ;
488+ return false ;
489+ } ;
461490 let output = streaming_output (
462491 self . stdout ,
463492 self . stderr ,
464493 & mut |line| {
465- read_at_least_one_message = true ;
466-
467- // Try to deserialize a message from Cargo or Rustc.
468- let mut deserializer = serde_json:: Deserializer :: from_str ( line) ;
469- deserializer. disable_recursion_limit ( ) ;
470- if let Ok ( message) = JsonMessage :: deserialize ( & mut deserializer) {
471- match message {
472- // Skip certain kinds of messages to only spend time on what's useful
473- JsonMessage :: Cargo ( message) => match message {
474- cargo_metadata:: Message :: CompilerArtifact ( artifact)
475- if !artifact. fresh =>
476- {
477- self . sender . send ( CargoMessage :: CompilerArtifact ( artifact) ) . unwrap ( ) ;
478- }
479- cargo_metadata:: Message :: CompilerMessage ( msg) => {
480- self . sender . send ( CargoMessage :: Diagnostic ( msg. message ) ) . unwrap ( ) ;
481- }
482- _ => ( ) ,
483- } ,
484- JsonMessage :: Rustc ( message) => {
485- self . sender . send ( CargoMessage :: Diagnostic ( message) ) . unwrap ( ) ;
486- }
487- }
494+ if process_line ( line, & mut stdout_errors) {
495+ read_at_least_one_stdout_message = true ;
488496 }
489497 } ,
490498 & mut |line| {
491- error. push_str ( line) ;
492- error. push ( '\n' ) ;
499+ if process_line ( line, & mut stderr_errors) {
500+ read_at_least_one_stderr_message = true ;
501+ }
493502 } ,
494503 ) ;
504+
505+ let read_at_least_one_message =
506+ read_at_least_one_stdout_message || read_at_least_one_stderr_message;
507+ let mut error = stdout_errors;
508+ error. push_str ( & stderr_errors) ;
495509 match output {
496510 Ok ( _) => Ok ( ( read_at_least_one_message, error) ) ,
497511 Err ( e) => Err ( io:: Error :: new ( e. kind ( ) , format ! ( "{e:?}: {error}" ) ) ) ,
0 commit comments