]> git.lizzy.rs Git - rust.git/commitdiff
print_diff: Don't print color codes if output is not a tty
authorKamal Marhubi <kamal@marhubi.com>
Tue, 31 May 2016 13:15:33 +0000 (15:15 +0200)
committerKamal Marhubi <kamal@marhubi.com>
Tue, 31 May 2016 13:15:33 +0000 (15:15 +0200)
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
Cargo.toml
src/rustfmt_diff.rs

index fc8070979d6f63488ed42f7341f769d3482bdcd9..1835836ba35580fdedb573e99336672a00836302 100644 (file)
@@ -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]]
index 9d8ad68ed8aba3f40cbddd746b9485f2080bdb3b..d00f651aad1eac3b2dda37c5db53206fa43e24d1 100644 (file)
@@ -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"
index fe521029cb5a75f3d5a1a17769357fd6ba4d5d7d..d5129bd1bca5bbf9df79846368369bea90d357cd 100644 (file)
@@ -88,10 +88,28 @@ pub fn make_diff(expected: &str, actual: &str, context_size: usize) -> Vec<Misma
 pub fn print_diff<F>(diff: Vec<Mismatch>, 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
+        }
     }
 }