Skip to content

Commit 0de9e43

Browse files
committed
Emit stdout, too
1 parent be6861c commit 0de9e43

File tree

5 files changed

+138
-15
lines changed

5 files changed

+138
-15
lines changed

src/dependencies.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ impl<'a> BuildManager<'a> {
244244
command: Command::new(format!("{what:?}")),
245245
errors: vec![],
246246
stderr: b"previous build failed".to_vec(),
247+
stdout: vec![],
247248
});
248249
}
249250
let mut lock = self.cache.write().unwrap();
@@ -254,6 +255,7 @@ impl<'a> BuildManager<'a> {
254255
command: Command::new(format!("{what:?}")),
255256
errors: vec![],
256257
stderr: b"previous build failed".to_vec(),
258+
stdout: vec![],
257259
});
258260
}
259261
entry.get().clone()
@@ -280,6 +282,7 @@ impl<'a> BuildManager<'a> {
280282
command: Command::new(format!("{what:?}")),
281283
errors: vec![],
282284
stderr: format!("{e:?}").into_bytes(),
285+
stdout: vec![],
283286
});
284287
Err(())
285288
}
@@ -299,6 +302,7 @@ impl<'a> BuildManager<'a> {
299302
command: Command::new(what.description()),
300303
errors: vec![],
301304
stderr: vec![],
305+
stdout: vec![],
302306
}),
303307
);
304308
res
@@ -309,6 +313,7 @@ impl<'a> BuildManager<'a> {
309313
command: Command::new(what.description()),
310314
errors: vec![],
311315
stderr: b"previous build failed".to_vec(),
316+
stdout: vec![],
312317
})
313318
})
314319
}

src/lib.rs

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,8 @@ pub struct Errored {
205205
errors: Vec<Error>,
206206
/// The full stderr of the test run.
207207
stderr: Vec<u8>,
208+
/// The full stdout of the test run.
209+
stdout: Vec<u8>,
208210
}
209211

210212
struct TestRun {
@@ -290,6 +292,7 @@ pub fn run_tests_generic(
290292
.unwrap(),
291293
)],
292294
stderr: vec![],
295+
stdout: vec![],
293296
}),
294297
status,
295298
})?;
@@ -332,10 +335,11 @@ pub fn run_tests_generic(
332335
command,
333336
errors,
334337
stderr,
338+
stdout,
335339
},
336340
) in &failures
337341
{
338-
let _guard = status.failed_test(command, stderr);
342+
let _guard = status.failed_test(command, stderr, stdout);
339343
failure_emitter.test_failure(status, errors);
340344
}
341345

@@ -434,6 +438,7 @@ fn parse_comments(file_contents: &[u8]) -> Result<Comments, Errored> {
434438
command: Command::new("parse comments"),
435439
errors,
436440
stderr: vec![],
441+
stdout: vec![],
437442
}),
438443
}
439444
}
@@ -480,6 +485,7 @@ fn build_aux(
480485
command: Command::new(format!("reading aux file `{}`", aux_file.display())),
481486
errors: vec![],
482487
stderr: err.to_string().into_bytes(),
488+
stdout: vec![],
483489
})?;
484490
let comments = parse_comments(&file_contents)?;
485491
assert_eq!(
@@ -541,6 +547,7 @@ fn build_aux(
541547
command: aux_cmd,
542548
errors: vec![error],
543549
stderr: rustc_stderr::process(aux_file, &output.stderr).rendered,
550+
stdout: output.stdout,
544551
});
545552
}
546553

@@ -605,14 +612,17 @@ impl dyn TestStatus {
605612
"test panicked: stderr:\n{stderr}\nstdout:\n{stdout}",
606613
))],
607614
stderr: vec![],
615+
stdout: vec![],
608616
});
609617
}
610618
}
611619
}
612620
check_test_result(
613-
cmd, *mode, path, config, revision, comments, status, stdout, &stderr,
621+
cmd, *mode, path, config, revision, comments, status, &stdout, &stderr,
622+
)?;
623+
run_rustfix(
624+
&stderr, &stdout, path, comments, revision, config, *mode, extra_args,
614625
)?;
615-
run_rustfix(&stderr, path, comments, revision, config, *mode, extra_args)?;
616626
Ok(TestOk::Ok)
617627
}
618628

@@ -659,6 +669,7 @@ fn build_aux_files(
659669
)),
660670
errors: vec![],
661671
stderr: err.to_string().into_bytes(),
672+
stdout: vec![],
662673
})?,
663674
&std::env::current_dir().unwrap(),
664675
)
@@ -671,6 +682,7 @@ fn build_aux_files(
671682
command,
672683
errors,
673684
stderr,
685+
stdout,
674686
}| Errored {
675687
command,
676688
errors: vec![Error::Aux {
@@ -679,6 +691,7 @@ fn build_aux_files(
679691
line,
680692
}],
681693
stderr,
694+
stdout,
682695
},
683696
)?,
684697
);
@@ -727,12 +740,14 @@ fn run_test_binary(
727740
command: exe,
728741
errors,
729742
stderr: vec![],
743+
stdout: vec![],
730744
})
731745
}
732746
}
733747

734748
fn run_rustfix(
735749
stderr: &[u8],
750+
stdout: &[u8],
736751
path: &Path,
737752
comments: &Comments,
738753
revision: &str,
@@ -786,6 +801,7 @@ fn run_rustfix(
786801
command: Command::new(format!("rustfix {}", path.display())),
787802
errors: vec![Error::Rustfix(err)],
788803
stderr: stderr.into(),
804+
stdout: stdout.into(),
789805
})?;
790806

791807
let edition = comments.edition(revision, config)?;
@@ -849,6 +865,7 @@ fn run_rustfix(
849865
command: Command::new(format!("checking {}", path.display())),
850866
errors,
851867
stderr: vec![],
868+
stdout: vec![],
852869
});
853870
}
854871

@@ -877,6 +894,7 @@ fn run_rustfix(
877894
status: output.status,
878895
}],
879896
stderr: rustc_stderr::process(&rustfix_path, &output.stderr).rendered,
897+
stdout: output.stdout,
880898
})
881899
}
882900
}
@@ -897,7 +915,7 @@ fn check_test_result(
897915
revision: &str,
898916
comments: &Comments,
899917
status: ExitStatus,
900-
stdout: Vec<u8>,
918+
stdout: &[u8],
901919
stderr: &[u8],
902920
) -> Result<(), Errored> {
903921
let mut errors = vec![];
@@ -930,6 +948,7 @@ fn check_test_result(
930948
command,
931949
errors,
932950
stderr: diagnostics.rendered,
951+
stdout: stdout.into(),
933952
})
934953
}
935954
}

src/parser.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ impl Comments {
6464
lines: errors,
6565
}],
6666
stderr: vec![],
67+
stdout: vec![],
6768
})
6869
}
6970
}

src/status_emitter.rs

Lines changed: 37 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,12 @@ pub trait TestStatus: Send + Sync + RefUnwindSafe {
5151

5252
/// Invoked before each failed test prints its errors along with a drop guard that can
5353
/// gets invoked afterwards.
54-
fn failed_test<'a>(&'a self, cmd: &'a Command, stderr: &'a [u8]) -> Box<dyn Debug + 'a>;
54+
fn failed_test<'a>(
55+
&'a self,
56+
cmd: &'a Command,
57+
stderr: &'a [u8],
58+
stdout: &'a [u8],
59+
) -> Box<dyn Debug + 'a>;
5560

5661
/// Change the status of the test while it is running to supply some kind of progress
5762
fn update_status(&self, msg: String);
@@ -223,7 +228,12 @@ impl TestStatus for TextTest {
223228
self.text.sender.send(Msg::Status(self.msg(), msg)).unwrap();
224229
}
225230

226-
fn failed_test<'a>(&self, cmd: &Command, stderr: &'a [u8]) -> Box<dyn Debug + 'a> {
231+
fn failed_test<'a>(
232+
&self,
233+
cmd: &Command,
234+
stderr: &'a [u8],
235+
stdout: &'a [u8],
236+
) -> Box<dyn Debug + 'a> {
227237
println!();
228238
let path = self.path.display().to_string();
229239
print!("{}", path.underline().bold());
@@ -239,16 +249,22 @@ impl TestStatus for TextTest {
239249
println!();
240250

241251
#[derive(Debug)]
242-
struct Guard<'a>(&'a [u8]);
252+
struct Guard<'a> {
253+
stderr: &'a [u8],
254+
stdout: &'a [u8],
255+
}
243256
impl<'a> Drop for Guard<'a> {
244257
fn drop(&mut self) {
245258
println!("full stderr:");
246-
std::io::stdout().write_all(self.0).unwrap();
259+
std::io::stdout().write_all(self.stderr).unwrap();
260+
println!();
261+
println!("full stdout:");
262+
std::io::stdout().write_all(self.stdout).unwrap();
247263
println!();
248264
println!();
249265
}
250266
}
251-
Box::new(Guard(stderr))
267+
Box::new(Guard { stderr, stdout })
252268
}
253269

254270
fn path(&self) -> &Path {
@@ -746,7 +762,7 @@ impl<const GROUP: bool> TestStatus for PathAndRev<GROUP> {
746762
})
747763
}
748764

749-
fn failed_test(&self, _cmd: &Command, _stderr: &[u8]) -> Box<dyn Debug> {
765+
fn failed_test(&self, _cmd: &Command, _stderr: &[u8], _stdout: &[u8]) -> Box<dyn Debug> {
750766
if GROUP {
751767
Box::new(github_actions::group(format_args!(
752768
"{}:{}",
@@ -841,10 +857,15 @@ impl<T: TestStatus, U: TestStatus> TestStatus for (T, U) {
841857
self.1.done(result);
842858
}
843859

844-
fn failed_test<'a>(&'a self, cmd: &'a Command, stderr: &'a [u8]) -> Box<dyn Debug + 'a> {
860+
fn failed_test<'a>(
861+
&'a self,
862+
cmd: &'a Command,
863+
stderr: &'a [u8],
864+
stdout: &'a [u8],
865+
) -> Box<dyn Debug + 'a> {
845866
Box::new((
846-
self.0.failed_test(cmd, stderr),
847-
self.1.failed_test(cmd, stderr),
867+
self.0.failed_test(cmd, stderr, stdout),
868+
self.1.failed_test(cmd, stderr, stdout),
848869
))
849870
}
850871

@@ -909,8 +930,13 @@ impl<T: TestStatus + ?Sized> TestStatus for Box<T> {
909930
(**self).for_revision(revision)
910931
}
911932

912-
fn failed_test<'a>(&'a self, cmd: &'a Command, stderr: &'a [u8]) -> Box<dyn Debug + 'a> {
913-
(**self).failed_test(cmd, stderr)
933+
fn failed_test<'a>(
934+
&'a self,
935+
cmd: &'a Command,
936+
stderr: &'a [u8],
937+
stdout: &'a [u8],
938+
) -> Box<dyn Debug + 'a> {
939+
(**self).failed_test(cmd, stderr, stdout)
914940
}
915941

916942
fn update_status(&self, msg: String) {

0 commit comments

Comments
 (0)