Skip to content

Commit c015d0d

Browse files
committed
switch to termcolor
1 parent 3248ab7 commit c015d0d

File tree

4 files changed

+78
-47
lines changed

4 files changed

+78
-47
lines changed

src/bootstrap/Cargo.lock

+10-10
Original file line numberDiff line numberDiff line change
@@ -67,11 +67,11 @@ dependencies = [
6767
"sha2",
6868
"sysinfo",
6969
"tar",
70+
"termcolor",
7071
"toml",
7172
"walkdir",
7273
"winapi",
7374
"xz2",
74-
"yansi-term",
7575
]
7676

7777
[[package]]
@@ -649,6 +649,15 @@ dependencies = [
649649
"xattr",
650650
]
651651

652+
[[package]]
653+
name = "termcolor"
654+
version = "1.2.0"
655+
source = "registry+https://github.com/rust-lang/crates.io-index"
656+
checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6"
657+
dependencies = [
658+
"winapi-util",
659+
]
660+
652661
[[package]]
653662
name = "thread_local"
654663
version = "1.1.4"
@@ -813,12 +822,3 @@ name = "yansi"
813822
version = "0.5.1"
814823
source = "registry+https://github.com/rust-lang/crates.io-index"
815824
checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec"
816-
817-
[[package]]
818-
name = "yansi-term"
819-
version = "0.1.2"
820-
source = "registry+https://github.com/rust-lang/crates.io-index"
821-
checksum = "fe5c30ade05e61656247b2e334a031dfd0cc466fadef865bdcdea8d537951bf1"
822-
dependencies = [
823-
"winapi",
824-
]

src/bootstrap/Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -47,13 +47,13 @@ serde_derive = "1.0.137"
4747
serde_json = "1.0.2"
4848
sha2 = "0.10"
4949
tar = "0.4"
50+
termcolor = "1.2.0"
5051
toml = "0.5"
5152
ignore = "0.4.10"
5253
opener = "0.5"
5354
once_cell = "1.7.2"
5455
xz2 = "0.1"
5556
walkdir = "2"
56-
yansi-term = "0.1.2"
5757

5858
# Dependencies needed by the build-metrics feature
5959
sysinfo = { version = "0.26.0", optional = true }

src/bootstrap/lib.rs

+19-11
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ pub use crate::builder::PathSet;
8989
use crate::cache::{Interned, INTERNER};
9090
pub use crate::config::Config;
9191
pub use crate::flags::Subcommand;
92-
use yansi_term::Color;
92+
use termcolor::{ColorChoice, StandardStream, WriteColor};
9393

9494
const LLVM_TOOLS: &[&str] = &[
9595
"llvm-cov", // used to generate coverage report
@@ -1577,21 +1577,29 @@ to download LLVM rather than building it.
15771577
self.config.ninja_in_file
15781578
}
15791579

1580-
pub fn color_for_stdout(&self, color: Color, message: &str) -> String {
1581-
self.color_for_inner(color, message, self.config.stdout_is_tty)
1580+
pub fn colored_stdout<R, F: FnOnce(&mut dyn WriteColor) -> R>(&self, f: F) -> R {
1581+
self.colored_stream_inner(StandardStream::stdout, self.config.stdout_is_tty, f)
15821582
}
15831583

1584-
pub fn color_for_stderr(&self, color: Color, message: &str) -> String {
1585-
self.color_for_inner(color, message, self.config.stderr_is_tty)
1584+
pub fn colored_stderr<R, F: FnOnce(&mut dyn WriteColor) -> R>(&self, f: F) -> R {
1585+
self.colored_stream_inner(StandardStream::stderr, self.config.stderr_is_tty, f)
15861586
}
15871587

1588-
fn color_for_inner(&self, color: Color, message: &str, is_tty: bool) -> String {
1589-
let use_color = match self.config.color {
1590-
flags::Color::Always => true,
1591-
flags::Color::Never => false,
1592-
flags::Color::Auto => is_tty,
1588+
fn colored_stream_inner<R, F, C>(&self, constructor: C, is_tty: bool, f: F) -> R
1589+
where
1590+
C: Fn(ColorChoice) -> StandardStream,
1591+
F: FnOnce(&mut dyn WriteColor) -> R,
1592+
{
1593+
let choice = match self.config.color {
1594+
flags::Color::Always => ColorChoice::Always,
1595+
flags::Color::Never => ColorChoice::Never,
1596+
flags::Color::Auto if !is_tty => ColorChoice::Never,
1597+
flags::Color::Auto => ColorChoice::Auto,
15931598
};
1594-
if use_color { color.paint(message).to_string() } else { message.to_string() }
1599+
let mut stream = constructor(choice);
1600+
let result = f(&mut stream);
1601+
stream.reset().unwrap();
1602+
result
15951603
}
15961604
}
15971605

src/bootstrap/render_tests.rs

+48-25
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use crate::builder::Builder;
1010
use std::io::{BufRead, BufReader, Write};
1111
use std::process::{ChildStdout, Command, Stdio};
1212
use std::time::Duration;
13-
use yansi_term::Color;
13+
use termcolor::{Color, ColorSpec, WriteColor};
1414

1515
const TERSE_TESTS_PER_LINE: usize = 88;
1616

@@ -139,16 +139,12 @@ impl<'a> Renderer<'a> {
139139
}
140140

141141
fn render_test_outcome_verbose(&self, outcome: Outcome<'_>, test: &TestOutcome) {
142+
print!("test {} ... ", test.name);
143+
self.builder.colored_stdout(|stdout| outcome.write_long(stdout)).unwrap();
142144
if let Some(exec_time) = test.exec_time {
143-
println!(
144-
"test {} ... {} (in {:.2?})",
145-
test.name,
146-
outcome.long(self.builder),
147-
Duration::from_secs_f64(exec_time)
148-
);
149-
} else {
150-
println!("test {} ... {}", test.name, outcome.long(self.builder));
145+
print!(" ({exec_time:.2?})");
151146
}
147+
println!();
152148
}
153149

154150
fn render_test_outcome_terse(&mut self, outcome: Outcome<'_>, _: &TestOutcome) {
@@ -163,7 +159,7 @@ impl<'a> Renderer<'a> {
163159
}
164160

165161
self.terse_tests_in_line += 1;
166-
print!("{}", outcome.short(self.builder));
162+
self.builder.colored_stdout(|stdout| outcome.write_short(stdout)).unwrap();
167163
let _ = std::io::stdout().flush();
168164
}
169165

@@ -208,10 +204,11 @@ impl<'a> Renderer<'a> {
208204
}
209205
}
210206

207+
print!("\ntest result: ");
208+
self.builder.colored_stdout(|stdout| outcome.write_long(stdout)).unwrap();
211209
println!(
212-
"\ntest result: {}. {} passed; {} failed; {} ignored; {} measured; \
213-
{} filtered out; finished in {:.2?}\n",
214-
outcome.long(self.builder),
210+
". {} passed; {} failed; {} ignored; {} measured; {} filtered out; \
211+
finished in {:.2?}\n",
215212
suite.passed,
216213
suite.failed,
217214
suite.ignored,
@@ -276,25 +273,51 @@ enum Outcome<'a> {
276273
}
277274

278275
impl Outcome<'_> {
279-
fn short(&self, builder: &Builder<'_>) -> String {
276+
fn write_short(&self, writer: &mut dyn WriteColor) -> Result<(), std::io::Error> {
280277
match self {
281-
Outcome::Ok => builder.color_for_stdout(Color::Green, "."),
282-
Outcome::BenchOk => builder.color_for_stdout(Color::Cyan, "b"),
283-
Outcome::Failed => builder.color_for_stdout(Color::Red, "F"),
284-
Outcome::Ignored { .. } => builder.color_for_stdout(Color::Yellow, "i"),
278+
Outcome::Ok => {
279+
writer.set_color(&ColorSpec::new().set_fg(Some(Color::Green)))?;
280+
write!(writer, ".")?;
281+
}
282+
Outcome::BenchOk => {
283+
writer.set_color(&ColorSpec::new().set_fg(Some(Color::Cyan)))?;
284+
write!(writer, "b")?;
285+
}
286+
Outcome::Failed => {
287+
writer.set_color(&ColorSpec::new().set_fg(Some(Color::Red)))?;
288+
write!(writer, "F")?;
289+
}
290+
Outcome::Ignored { .. } => {
291+
writer.set_color(&ColorSpec::new().set_fg(Some(Color::Yellow)))?;
292+
write!(writer, "i")?;
293+
}
285294
}
295+
writer.reset()
286296
}
287297

288-
fn long(&self, builder: &Builder<'_>) -> String {
298+
fn write_long(&self, writer: &mut dyn WriteColor) -> Result<(), std::io::Error> {
289299
match self {
290-
Outcome::Ok => builder.color_for_stdout(Color::Green, "ok"),
291-
Outcome::BenchOk => builder.color_for_stdout(Color::Cyan, "benchmarked"),
292-
Outcome::Failed => builder.color_for_stdout(Color::Red, "FAILED"),
293-
Outcome::Ignored { reason: None } => builder.color_for_stdout(Color::Yellow, "ignored"),
294-
Outcome::Ignored { reason: Some(reason) } => {
295-
builder.color_for_stdout(Color::Yellow, &format!("ignored, {reason}"))
300+
Outcome::Ok => {
301+
writer.set_color(&ColorSpec::new().set_fg(Some(Color::Green)))?;
302+
write!(writer, "ok")?;
303+
}
304+
Outcome::BenchOk => {
305+
writer.set_color(&ColorSpec::new().set_fg(Some(Color::Cyan)))?;
306+
write!(writer, "benchmarked")?;
307+
}
308+
Outcome::Failed => {
309+
writer.set_color(&ColorSpec::new().set_fg(Some(Color::Red)))?;
310+
write!(writer, "FAILED")?;
311+
}
312+
Outcome::Ignored { reason } => {
313+
writer.set_color(&ColorSpec::new().set_fg(Some(Color::Yellow)))?;
314+
write!(writer, "ignored")?;
315+
if let Some(reason) = reason {
316+
write!(writer, ", {reason}")?;
317+
}
296318
}
297319
}
320+
writer.reset()
298321
}
299322
}
300323

0 commit comments

Comments
 (0)