@@ -6,8 +6,10 @@ use std::fmt;
6
6
use std:: process:: { self , Command } ;
7
7
8
8
pub mod api;
9
+ mod read2;
9
10
pub mod self_profile;
10
11
12
+ use process:: Stdio ;
11
13
pub use self_profile:: { QueryData , SelfProfile } ;
12
14
13
15
#[ derive( Debug , Copy , Clone , PartialEq , PartialOrd , Deserialize ) ]
@@ -135,20 +137,47 @@ pub fn run_command(cmd: &mut Command) -> anyhow::Result<()> {
135
137
136
138
pub fn command_output ( cmd : & mut Command ) -> anyhow:: Result < process:: Output > {
137
139
log:: trace!( "running: {:?}" , cmd) ;
138
- let output = cmd. output ( ) ?;
139
- if !output. status . success ( ) {
140
+ let mut child = cmd. stdout ( Stdio :: piped ( ) ) . stderr ( Stdio :: piped ( ) ) . spawn ( ) ?;
141
+
142
+ let mut stdout = Vec :: new ( ) ;
143
+ let mut stderr = Vec :: new ( ) ;
144
+ let mut stdout_writer = std:: io:: LineWriter :: new ( std:: io:: stdout ( ) ) ;
145
+ let mut stderr_writer = std:: io:: LineWriter :: new ( std:: io:: stderr ( ) ) ;
146
+ read2:: read2 (
147
+ child. stdout . take ( ) . unwrap ( ) ,
148
+ child. stderr . take ( ) . unwrap ( ) ,
149
+ & mut |is_stdout, buffer, _is_done| {
150
+ // Send output if trace logging is enabled
151
+ if log:: log_enabled!( target: "collector_raw_cargo" , log:: level:: Trace ) {
152
+ use std:: io:: Write ;
153
+ if is_stdout {
154
+ stdout_writer. write_all ( & buffer[ stdout. len ( ) ..] ) . unwrap ( ) ;
155
+ } else {
156
+ stderr_writer. write_all ( & buffer[ stderr. len ( ) ..] ) . unwrap ( ) ;
157
+ }
158
+ }
159
+ if is_stdout {
160
+ stdout = buffer. clone ( ) ;
161
+ } else {
162
+ stderr = buffer. clone ( ) ;
163
+ }
164
+ } ,
165
+ ) ?;
166
+
167
+ let status = child. wait ( ) ?;
168
+ if !status. success ( ) {
140
169
return Err ( anyhow:: anyhow!(
141
170
"expected success, got {}\n \n stderr={}\n \n stdout={}" ,
142
- output . status,
143
- String :: from_utf8_lossy( & output . stderr) ,
144
- String :: from_utf8_lossy( & output . stdout)
171
+ status,
172
+ String :: from_utf8_lossy( & stderr) ,
173
+ String :: from_utf8_lossy( & stdout)
145
174
) ) ;
146
- } else {
147
- // log::trace!(
148
- // "stderr={}\n\nstdout={}",
149
- // String::from_utf8_lossy(&output.stderr),
150
- // String::from_utf8_lossy(&output.stdout),
151
- // );
152
175
}
176
+
177
+ let output = process:: Output {
178
+ status,
179
+ stdout : stdout,
180
+ stderr : stderr,
181
+ } ;
153
182
Ok ( output)
154
183
}
0 commit comments