@@ -177,27 +177,28 @@ fn run_command_with_output(cmd: &mut Command) -> anyhow::Result<process::Output>
177
177
. spawn ( )
178
178
. with_context ( || format ! ( "failed to spawn process for cmd: {:?}" , cmd) ) ?;
179
179
180
- let mut stdout = Vec :: new ( ) ;
181
- let mut stderr = Vec :: new ( ) ;
182
- let mut stdout_writer = std:: io:: LineWriter :: new ( std:: io:: stdout ( ) ) ;
183
- let mut stderr_writer = std:: io:: LineWriter :: new ( std:: io:: stderr ( ) ) ;
184
- read2:: read2 (
180
+ let mut stdout_writer = std:: io:: LineWriter :: new ( std:: io:: stdout ( ) . lock ( ) ) ;
181
+ let mut stderr_writer = std:: io:: LineWriter :: new ( std:: io:: stderr ( ) . lock ( ) ) ;
182
+
183
+ let mut stdout_written = 0 ;
184
+ let mut stderr_written = 0 ;
185
+ let ( stdout, stderr) = read2:: read2 (
185
186
child. stdout . take ( ) . unwrap ( ) ,
186
187
child. stderr . take ( ) . unwrap ( ) ,
187
188
& mut |is_stdout, buffer, _is_done| {
188
189
// Send output if trace logging is enabled
189
190
if log:: log_enabled!( target: "raw_cargo_messages" , log:: Level :: Trace ) {
190
191
use std:: io:: Write ;
191
192
if is_stdout {
192
- stdout_writer. write_all ( & buffer[ stdout . len ( ) ..] ) . unwrap ( ) ;
193
+ stdout_writer. write_all ( & buffer[ stdout_written ..] ) . unwrap ( ) ;
193
194
} else {
194
- stderr_writer. write_all ( & buffer[ stderr . len ( ) ..] ) . unwrap ( ) ;
195
+ stderr_writer. write_all ( & buffer[ stderr_written ..] ) . unwrap ( ) ;
195
196
}
196
197
}
197
198
if is_stdout {
198
- stdout = buffer. clone ( ) ;
199
+ stdout_written = buffer. len ( ) ;
199
200
} else {
200
- stderr = buffer. clone ( ) ;
201
+ stderr_written = buffer. len ( ) ;
201
202
}
202
203
} ,
203
204
) ?;
0 commit comments