From 9759068e6280c8958d8ef769337d015794fb605f Mon Sep 17 00:00:00 2001 From: Kamal Marhubi Date: Tue, 31 May 2016 15:15:33 +0200 Subject: [PATCH 1/1] print_diff: Don't print color codes if output is not a tty On unix, `term::stdout()` just reads the `TERM` environment variable to decide what features are available. It does not check if the output file descriptor is in fact a tty. This resulted in printing escape codes when redirecting output. --- Cargo.lock | 3 +++ Cargo.toml | 7 +++++++ src/rustfmt_diff.rs | 26 ++++++++++++++++++++++---- 3 files changed, 32 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index fc8070979d6..1835836ba35 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -6,6 +6,8 @@ dependencies = [ "env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", "getopts 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", "itertools 0.4.15 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", "multimap 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "regex 0.1.71 (registry+https://github.com/rust-lang/crates.io-index)", @@ -15,6 +17,7 @@ dependencies = [ "term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", "toml 0.1.30 (registry+https://github.com/rust-lang/crates.io-index)", "unicode-segmentation 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 9d8ad68ed8a..d00f651aad1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,3 +27,10 @@ env_logger = "0.3" getopts = "0.2" itertools = "0.4.15" multimap = "0.3" + +[target.'cfg(unix)'.dependencies] +libc = "0.2.11" + +[target.'cfg(windows)'.dependencies] +kernel32-sys = "0.2.2" +winapi = "0.2.7" diff --git a/src/rustfmt_diff.rs b/src/rustfmt_diff.rs index fe521029cb5..d5129bd1bca 100644 --- a/src/rustfmt_diff.rs +++ b/src/rustfmt_diff.rs @@ -88,10 +88,28 @@ pub fn make_diff(expected: &str, actual: &str, context_size: usize) -> Vec(diff: Vec, get_section_title: F) where F: Fn(u32) -> String { - if let Some(t) = term::stdout() { - print_diff_fancy(diff, get_section_title, t); - } else { - print_diff_basic(diff, get_section_title); + match term::stdout() { + Some(_) if isatty() => print_diff_fancy(diff, get_section_title, term::stdout().unwrap()), + _ => print_diff_basic(diff, get_section_title), + } + + // isatty shamelessly adapted from cargo. + #[cfg(unix)] + fn isatty() -> bool { + extern crate libc; + + unsafe { libc::isatty(libc::STDOUT_FILENO) != 0 } + } + #[cfg(windows)] + fn isatty() -> bool { + extern crate kernel32; + extern crate winapi; + + unsafe { + let handle = kernel32::GetStdHandle(winapi::winbase::STD_OUTPUT_HANDLE); + let mut out = 0; + kernel32::GetConsoleMode(handle, &mut out) != 0 + } } } -- 2.44.0