]> git.lizzy.rs Git - rust.git/blobdiff - src/rustfmt_diff.rs
Remove BlockIndentStyle::Inherit
[rust.git] / src / rustfmt_diff.rs
index 9f529276df1e8b6803a0cc9ea24d915f9d3136a0..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,8 +88,38 @@ 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 {
         let title = get_section_title(mismatch.line_number);
         writeln!(t, "{}", title).unwrap();
@@ -112,3 +143,26 @@ 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);
+                }
+            }
+        }
+    }
+}