Skip to content

Commit b963a57

Browse files
committed
Auto merge of rust-lang#112541 - ozkanonur:gtfx, r=clubby789
implement stdout streaming in `render_tests::Renderer` This way, we can show the test dot characters on the console immediately, without having to wait for the entire line to finish. cc `@GuillaumeGomez`
2 parents cb882fa + 6c966dc commit b963a57

File tree

2 files changed

+31
-9
lines changed

2 files changed

+31
-9
lines changed

src/bootstrap/render_tests.rs

+28-6
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
//! to reimplement all the rendering logic in this module because of that.
88
99
use crate::builder::Builder;
10-
use std::io::{BufRead, BufReader, Write};
10+
use std::io::{BufRead, BufReader, Read, Write};
1111
use std::process::{ChildStdout, Command, Stdio};
1212
use std::time::Duration;
1313
use termcolor::{Color, ColorSpec, WriteColor};
@@ -20,15 +20,15 @@ pub(crate) fn add_flags_and_try_run_tests(builder: &Builder<'_>, cmd: &mut Comma
2020
}
2121
cmd.args(&["-Z", "unstable-options", "--format", "json"]);
2222

23-
try_run_tests(builder, cmd)
23+
try_run_tests(builder, cmd, false)
2424
}
2525

26-
pub(crate) fn try_run_tests(builder: &Builder<'_>, cmd: &mut Command) -> bool {
26+
pub(crate) fn try_run_tests(builder: &Builder<'_>, cmd: &mut Command, stream: bool) -> bool {
2727
if builder.config.dry_run() {
2828
return true;
2929
}
3030

31-
if !run_tests(builder, cmd) {
31+
if !run_tests(builder, cmd, stream) {
3232
if builder.fail_fast {
3333
crate::detail_exit_macro!(1);
3434
} else {
@@ -41,7 +41,7 @@ pub(crate) fn try_run_tests(builder: &Builder<'_>, cmd: &mut Command) -> bool {
4141
}
4242
}
4343

44-
fn run_tests(builder: &Builder<'_>, cmd: &mut Command) -> bool {
44+
fn run_tests(builder: &Builder<'_>, cmd: &mut Command, stream: bool) -> bool {
4545
cmd.stdout(Stdio::piped());
4646

4747
builder.verbose(&format!("running: {cmd:?}"));
@@ -50,7 +50,12 @@ fn run_tests(builder: &Builder<'_>, cmd: &mut Command) -> bool {
5050

5151
// This runs until the stdout of the child is closed, which means the child exited. We don't
5252
// run this on another thread since the builder is not Sync.
53-
Renderer::new(process.stdout.take().unwrap(), builder).render_all();
53+
let renderer = Renderer::new(process.stdout.take().unwrap(), builder);
54+
if stream {
55+
renderer.stream_all();
56+
} else {
57+
renderer.render_all();
58+
}
5459

5560
let result = process.wait_with_output().unwrap();
5661
if !result.status.success() && builder.is_verbose() {
@@ -112,6 +117,23 @@ impl<'a> Renderer<'a> {
112117
}
113118
}
114119

120+
/// Renders the stdout characters one by one
121+
fn stream_all(mut self) {
122+
let mut buffer = [0; 1];
123+
loop {
124+
match self.stdout.read(&mut buffer) {
125+
Ok(0) => break,
126+
Ok(_) => {
127+
let mut stdout = std::io::stdout();
128+
stdout.write_all(&buffer).unwrap();
129+
let _ = stdout.flush();
130+
}
131+
Err(err) if err.kind() == std::io::ErrorKind::UnexpectedEof => break,
132+
Err(err) => panic!("failed to read output of test runner: {err}"),
133+
}
134+
}
135+
}
136+
115137
fn render_test_outcome(&mut self, outcome: Outcome<'_>, test: &TestOutcome) {
116138
self.executed_tests += 1;
117139

src/bootstrap/test.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -1035,7 +1035,7 @@ impl Step for RustdocGUI {
10351035
}
10361036

10371037
let _time = util::timeit(&builder);
1038-
crate::render_tests::try_run_tests(builder, &mut cmd);
1038+
crate::render_tests::try_run_tests(builder, &mut cmd, true);
10391039
}
10401040
}
10411041

@@ -1732,7 +1732,7 @@ note: if you're sure you want to do this, please open an issue as to why. In the
17321732
suite, mode, &compiler.host, target
17331733
));
17341734
let _time = util::timeit(&builder);
1735-
crate::render_tests::try_run_tests(builder, &mut cmd);
1735+
crate::render_tests::try_run_tests(builder, &mut cmd, false);
17361736

17371737
if let Some(compare_mode) = compare_mode {
17381738
cmd.arg("--compare-mode").arg(compare_mode);
@@ -1755,7 +1755,7 @@ note: if you're sure you want to do this, please open an issue as to why. In the
17551755
suite, mode, compare_mode, &compiler.host, target
17561756
));
17571757
let _time = util::timeit(&builder);
1758-
crate::render_tests::try_run_tests(builder, &mut cmd);
1758+
crate::render_tests::try_run_tests(builder, &mut cmd, false);
17591759
}
17601760
}
17611761
}

0 commit comments

Comments
 (0)