@@ -78,23 +78,19 @@ impl CmdChildren {
7878 let handle = self . 0 . pop ( ) . unwrap ( ) ;
7979 match handle {
8080 CmdChild :: Proc {
81- mut child,
82- mut stderr,
83- ..
81+ mut child, stderr, ..
8482 } => {
8583 if let Some ( stdout) = child. stdout . take ( ) {
8684 f ( Box :: new ( stdout) ) ;
8785 let _ = child. kill ( ) ;
8886 }
89- CmdChild :: log_stderr_output ( & mut stderr) ;
87+ let _ = CmdChild :: log_stderr_output ( stderr) . join ( ) ;
9088 }
9189 CmdChild :: ThreadFn { .. } => {
9290 panic ! ( "should not wait pipe on thread" ) ;
9391 }
94- CmdChild :: SyncFn {
95- mut stderr, stdout, ..
96- } => {
97- CmdChild :: log_stderr_output ( & mut stderr) ;
92+ CmdChild :: SyncFn { stderr, stdout, .. } => {
93+ let _ = CmdChild :: log_stderr_output ( stderr) . join ( ) ;
9894 if let Some ( stdout) = stdout {
9995 f ( Box :: new ( stdout) ) ;
10096 }
@@ -139,14 +135,14 @@ impl CmdChild {
139135 match self {
140136 CmdChild :: Proc {
141137 mut child,
142- mut stderr,
138+ stderr,
143139 cmd,
144140 ignore_error,
145141 } => {
146- Self :: log_stderr_output ( & mut stderr) ;
142+ let polling_stderr = Self :: log_stderr_output ( stderr) ;
147143 Self :: print_stdout_output ( & mut child. stdout ) ;
148144 let status = child. wait ( ) ?;
149- Self :: log_stderr_output ( & mut stderr ) ;
145+ let _ = polling_stderr . join ( ) ;
150146 Self :: print_stdout_output ( & mut child. stdout ) ;
151147 if !ignore_error && !status. success ( ) && ( is_last || pipefail) {
152148 return Err ( Self :: status_to_io_error (
@@ -158,13 +154,13 @@ impl CmdChild {
158154 CmdChild :: ThreadFn {
159155 child,
160156 cmd,
161- mut stderr,
157+ stderr,
162158 ignore_error,
163159 ..
164160 } => {
165- Self :: log_stderr_output ( & mut stderr) ;
161+ let polling_stderr = Self :: log_stderr_output ( stderr) ;
166162 let status = child. join ( ) ;
167- Self :: log_stderr_output ( & mut stderr ) ;
163+ let _ = polling_stderr . join ( ) ;
168164 if ignore_error {
169165 return Ok ( ( ) ) ;
170166 }
@@ -183,11 +179,9 @@ impl CmdChild {
183179 }
184180 }
185181 CmdChild :: SyncFn {
186- mut stdout,
187- mut stderr,
188- ..
182+ mut stdout, stderr, ..
189183 } => {
190- Self :: log_stderr_output ( & mut stderr) ;
184+ let _ = Self :: log_stderr_output ( stderr) . join ( ) ;
191185 Self :: print_stdout_output ( & mut stdout) ;
192186 }
193187 }
@@ -199,12 +193,12 @@ impl CmdChild {
199193 CmdChild :: Proc {
200194 child,
201195 cmd,
202- mut stderr,
196+ stderr,
203197 ignore_error,
204198 } => {
205- Self :: log_stderr_output ( & mut stderr) ;
199+ let polling_stderr = Self :: log_stderr_output ( stderr) ;
206200 let output = child. wait_with_output ( ) ?;
207- Self :: log_stderr_output ( & mut stderr ) ;
201+ let _ = polling_stderr . join ( ) ;
208202 if !ignore_error && !output. status . success ( ) {
209203 return Err ( Self :: status_to_io_error (
210204 output. status ,
@@ -217,10 +211,8 @@ impl CmdChild {
217211 CmdChild :: ThreadFn { cmd, .. } => {
218212 panic ! ( "{} thread should not be waited for output" , cmd) ;
219213 }
220- CmdChild :: SyncFn {
221- stdout, mut stderr, ..
222- } => {
223- Self :: log_stderr_output ( & mut stderr) ;
214+ CmdChild :: SyncFn { stdout, stderr, .. } => {
215+ let _ = Self :: log_stderr_output ( stderr) . join ( ) ;
224216 if let Some ( mut out) = stdout {
225217 let mut buf = vec ! [ ] ;
226218 out. read_to_end ( & mut buf) ?;
@@ -240,13 +232,15 @@ impl CmdChild {
240232 }
241233 }
242234
243- fn log_stderr_output ( stderr : & mut Option < impl Read > ) {
244- if let Some ( stderr) = stderr {
245- BufReader :: new ( stderr)
246- . lines ( )
247- . filter_map ( |line| line. ok ( ) )
248- . for_each ( |line| info ! ( "{}" , line) ) ;
249- }
235+ fn log_stderr_output ( stderr : Option < PipeReader > ) -> JoinHandle < ( ) > {
236+ std:: thread:: spawn ( move || {
237+ if let Some ( stderr) = stderr {
238+ BufReader :: new ( stderr)
239+ . lines ( )
240+ . filter_map ( |line| line. ok ( ) )
241+ . for_each ( |line| info ! ( "{}" , line) )
242+ }
243+ } )
250244 }
251245
252246 fn status_to_io_error ( status : ExitStatus , command : & str ) -> Error {
0 commit comments