]> git.lizzy.rs Git - rust.git/blobdiff - src/rustfmt_diff.rs
Remove BlockIndentStyle::Inherit
[rust.git] / src / rustfmt_diff.rs
index 4bb858a6b3079049ddb11b931e5e4df9e3c46cd3..23cb3f21bf2d4dd743f71fe0129f86401cc2cfcb 100644 (file)
@@ -1,6 +1,7 @@
 use std::collections::VecDeque;
 use diff;
 use term;
+use std::io;
 
 #[derive(Debug, PartialEq)]
 pub enum DiffLine {
@@ -87,16 +88,46 @@ 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
 {
-    let mut t = term::stdout().unwrap();
+    match term::stdout() {
+        Some(ref t) if isatty() && t.supports_color() => {
+            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
+        }
+    }
+}
+
+fn print_diff_fancy<F>(diff: Vec<Mismatch>,
+                       get_section_title: F,
+                       mut t: Box<term::Terminal<Output = io::Stdout>>)
+    where F: Fn(u32) -> String
+{
     for mismatch in diff {
-        t.fg(term::color::BRIGHT_WHITE).unwrap();
         let title = get_section_title(mismatch.line_number);
         writeln!(t, "{}", title).unwrap();
 
         for line in mismatch.lines {
             match line {
                 DiffLine::Context(ref str) => {
-                    t.fg(term::color::WHITE).unwrap();
+                    t.reset().unwrap();
                     writeln!(t, " {}⏎", str).unwrap();
                 }
                 DiffLine::Expected(ref str) => {
@@ -109,6 +140,29 @@ pub fn print_diff<F>(diff: Vec<Mismatch>, get_section_title: F)
                 }
             }
         }
+        t.reset().unwrap();
+    }
+}
+
+pub fn print_diff_basic<F>(diff: Vec<Mismatch>, get_section_title: F)
+    where F: Fn(u32) -> String
+{
+    for mismatch in diff {
+        let title = get_section_title(mismatch.line_number);
+        println!("{}", title);
+
+        for line in mismatch.lines {
+            match line {
+                DiffLine::Context(ref str) => {
+                    println!(" {}⏎", str);
+                }
+                DiffLine::Expected(ref str) => {
+                    println!("+{}⏎", str);
+                }
+                DiffLine::Resulting(ref str) => {
+                    println!("-{}⏎", str);
+                }
+            }
+        }
     }
-    t.reset().unwrap();
 }