@@ -456,42 +456,56 @@ impl CargoActor {
456
456
// simply skip a line if it doesn't parse, which just ignores any
457
457
// erroneous output.
458
458
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
+ } ;
461
490
let output = streaming_output (
462
491
self . stdout ,
463
492
self . stderr ,
464
493
& 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 ;
488
496
}
489
497
} ,
490
498
& 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
+ }
493
502
} ,
494
503
) ;
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) ;
495
509
match output {
496
510
Ok ( _) => Ok ( ( read_at_least_one_message, error) ) ,
497
511
Err ( e) => Err ( io:: Error :: new ( e. kind ( ) , format ! ( "{e:?}: {error}" ) ) ) ,
0 commit comments