From 5194984812bf38d73094da36e1932f503958effc Mon Sep 17 00:00:00 2001 From: Nick Cameron Date: Fri, 20 Apr 2018 14:02:44 +1200 Subject: [PATCH] Add a verbose-diff option And don't print end of line characters by default in diffs cc #2536 --- src/bin/main.rs | 9 +++++++++ src/config/config_type.rs | 3 ++- src/config/mod.rs | 1 + src/filemap.rs | 4 ++-- src/rustfmt_diff.rs | 23 +++++++++++++++-------- tests/lib.rs | 4 ++-- 6 files changed, 31 insertions(+), 13 deletions(-) diff --git a/src/bin/main.rs b/src/bin/main.rs index abc313ab8ed1..024c41370a54 100644 --- a/src/bin/main.rs +++ b/src/bin/main.rs @@ -93,6 +93,7 @@ enum Operation { struct CliOptions { skip_children: Option, verbose: bool, + verbose_diff: bool, write_mode: Option, color: Option, file_lines: FileLines, // Default is all lines in all files. @@ -104,6 +105,8 @@ impl CliOptions { fn from_matches(matches: &Matches) -> FmtResult { let mut options = CliOptions::default(); options.verbose = matches.opt_present("verbose"); + options.verbose_diff = matches.opt_present("verbose-diff"); + let unstable_features = matches.opt_present("unstable-features"); let rust_nightly = option_env!("CFG_RELEASE_CHANNEL") .map(|c| c == "nightly") @@ -150,6 +153,7 @@ impl CliOptions { fn apply_to(self, config: &mut Config) { config.set().verbose(self.verbose); + config.set().verbose_diff(self.verbose_diff); config.set().file_lines(self.file_lines); config.set().unstable_features(self.unstable_features); if let Some(skip_children) = self.skip_children { @@ -227,6 +231,11 @@ fn make_opts() -> Options { "Format specified line ranges. See README for more detail on the JSON format.", "JSON", ); + opts.optflag( + "", + "verbose-diff", + "Emit a more verbose diff, indicating the end of lines.", + ); opts.optflag("h", "help", "Show this message"); opts.optflag("", "skip-children", "Don't reformat child modules"); opts.optflag( diff --git a/src/config/config_type.rs b/src/config/config_type.rs index 0c38b6d28ad1..5fc032869556 100644 --- a/src/config/config_type.rs +++ b/src/config/config_type.rs @@ -356,7 +356,8 @@ macro_rules! create_config { } pub fn is_hidden_option(name: &str) -> bool { - const HIDE_OPTIONS: [&str; 3] = ["verbose", "file_lines", "width_heuristics"]; + const HIDE_OPTIONS: [&str; 4] = + ["verbose", "verbose_diff", "file_lines", "width_heuristics"]; HIDE_OPTIONS.contains(&name) } diff --git a/src/config/mod.rs b/src/config/mod.rs index 274a40a2ae7d..f81bbfccd1e1 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -143,6 +143,7 @@ create_config! { // Not user-facing verbose: bool, false, false, "Use verbose output"; + verbose_diff: bool, false, false, "Emit verbose diffs"; file_lines: FileLines, FileLines::all(), false, "Lines to format; this is not supported in rustfmt.toml, and can only be specified \ via the --file-lines option"; diff --git a/src/filemap.rs b/src/filemap.rs index 6d2f5da44de3..54bfe7996b1f 100644 --- a/src/filemap.rs +++ b/src/filemap.rs @@ -159,7 +159,7 @@ where print_diff( mismatch, |line_num| format!("Diff in {} at line {}:", filename.display(), line_num), - config.color(), + config, ); return Ok(has_diff); } @@ -186,7 +186,7 @@ where print_diff( mismatch, |line_num| format!("Diff in {} at line {}:", filename.display(), line_num), - config.color(), + config, ); return Ok(has_diff); } diff --git a/src/rustfmt_diff.rs b/src/rustfmt_diff.rs index d5c97b95560d..426f7da96a23 100644 --- a/src/rustfmt_diff.rs +++ b/src/rustfmt_diff.rs @@ -8,7 +8,7 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -use config::Color; +use config::{Color, Config}; use diff; use std::collections::VecDeque; use std::io; @@ -149,10 +149,13 @@ pub fn make_diff(expected: &str, actual: &str, context_size: usize) -> Vec(diff: Vec, get_section_title: F, color: Color) +pub fn print_diff(diff: Vec, get_section_title: F, config: &Config) where F: Fn(u32) -> String, { + let color = config.color(); + let line_terminator = if config.verbose_diff() { "⏎" } else { "" }; + let mut writer = OutputWriter::new(color); for mismatch in diff { @@ -161,13 +164,17 @@ where for line in mismatch.lines { match line { - DiffLine::Context(ref str) => writer.writeln(&format!(" {}⏎", str), None), - DiffLine::Expected(ref str) => { - writer.writeln(&format!("+{}⏎", str), Some(term::color::GREEN)) - } - DiffLine::Resulting(ref str) => { - writer.writeln(&format!("-{}⏎", str), Some(term::color::RED)) + DiffLine::Context(ref str) => { + writer.writeln(&format!(" {}{}", str, line_terminator), None) } + DiffLine::Expected(ref str) => writer.writeln( + &format!("+{}{}", str, line_terminator), + Some(term::color::GREEN), + ), + DiffLine::Resulting(ref str) => writer.writeln( + &format!("-{}{}", str, line_terminator), + Some(term::color::RED), + ), } } } diff --git a/tests/lib.rs b/tests/lib.rs index b9b51853a2d7..7e2947929dea 100644 --- a/tests/lib.rs +++ b/tests/lib.rs @@ -337,7 +337,7 @@ fn print_mismatches_default_message(result: HashMap>) { for (file_name, diff) in result { let mismatch_msg_formatter = |line_num| format!("\nMismatch at {}:{}:", file_name.display(), line_num); - print_diff(diff, &mismatch_msg_formatter, Color::Auto); + print_diff(diff, &mismatch_msg_formatter, &Default::default()); } if let Some(mut t) = term::stdout() { @@ -350,7 +350,7 @@ fn print_mismatches String>( mismatch_msg_formatter: T, ) { for (_file_name, diff) in result { - print_diff(diff, &mismatch_msg_formatter, Color::Auto); + print_diff(diff, &mismatch_msg_formatter, &Default::default()); } if let Some(mut t) = term::stdout() {