diff --git a/crates/ruff/src/message/text.rs b/crates/ruff/src/message/text.rs index 9f0a75db46..d467926a67 100644 --- a/crates/ruff/src/message/text.rs +++ b/crates/ruff/src/message/text.rs @@ -19,8 +19,11 @@ use crate::registry::AsRule; bitflags! { #[derive(Default)] struct EmitterFlags: u8 { + /// Whether to show the fix status of a diagnostic. const SHOW_FIX_STATUS = 0b0000_0001; - const SHOW_FIX = 0b0000_0010; + /// Whether to show the diff of a fix, for diagnostics that have a fix. + const SHOW_FIX_DIFF = 0b0000_0010; + /// Whether to show the source code of a diagnostic. const SHOW_SOURCE = 0b0000_0100; } } @@ -39,8 +42,8 @@ impl TextEmitter { } #[must_use] - pub fn with_show_fix(mut self, show_fix: bool) -> Self { - self.flags.set(EmitterFlags::SHOW_FIX, show_fix); + pub fn with_show_fix_diff(mut self, show_fix_diff: bool) -> Self { + self.flags.set(EmitterFlags::SHOW_FIX_DIFF, show_fix_diff); self } @@ -105,7 +108,7 @@ impl Emitter for TextEmitter { writeln!(writer, "{}", MessageCodeFrame { message })?; } - if self.flags.contains(EmitterFlags::SHOW_FIX) { + if self.flags.contains(EmitterFlags::SHOW_FIX_DIFF) { if let Some(diff) = Diff::from_message(message) { writeln!(writer, "{diff}")?; } diff --git a/crates/ruff/src/test.rs b/crates/ruff/src/test.rs index 9c6010965e..989272cf78 100644 --- a/crates/ruff/src/test.rs +++ b/crates/ruff/src/test.rs @@ -193,7 +193,7 @@ pub(crate) fn print_messages(messages: &[Message]) -> String { TextEmitter::default() .with_show_fix_status(true) - .with_show_fix(true) + .with_show_fix_diff(true) .with_show_source(true) .emit( &mut output, diff --git a/crates/ruff_cli/src/args.rs b/crates/ruff_cli/src/args.rs index fee99706a4..09662c8272 100644 --- a/crates/ruff_cli/src/args.rs +++ b/crates/ruff_cli/src/args.rs @@ -392,8 +392,9 @@ impl CheckArgs { add_noqa: self.add_noqa, config: self.config, diff: self.diff, - exit_zero: self.exit_zero, + ecosystem_ci: self.ecosystem_ci, exit_non_zero_on_fix: self.exit_non_zero_on_fix, + exit_zero: self.exit_zero, files: self.files, ignore_noqa: self.ignore_noqa, isolated: self.isolated, @@ -457,8 +458,9 @@ pub struct Arguments { pub add_noqa: bool, pub config: Option, pub diff: bool, - pub exit_zero: bool, + pub ecosystem_ci: bool, pub exit_non_zero_on_fix: bool, + pub exit_zero: bool, pub files: Vec, pub ignore_noqa: bool, pub isolated: bool, diff --git a/crates/ruff_cli/src/commands/run.rs b/crates/ruff_cli/src/commands/run.rs index d3e42651a8..f8047b01d7 100644 --- a/crates/ruff_cli/src/commands/run.rs +++ b/crates/ruff_cli/src/commands/run.rs @@ -254,7 +254,6 @@ mod test { LogLevel::Default, FixMode::None, Flags::SHOW_VIOLATIONS, - false, ); let mut writer: Vec = Vec::new(); // Mute the terminal color codes diff --git a/crates/ruff_cli/src/lib.rs b/crates/ruff_cli/src/lib.rs index b57a646ed7..077f7d87fe 100644 --- a/crates/ruff_cli/src/lib.rs +++ b/crates/ruff_cli/src/lib.rs @@ -155,13 +155,6 @@ fn format(files: &[PathBuf]) -> Result { } fn check(args: CheckArgs, log_level: LogLevel) -> Result { - let ecosystem_ci = args.ecosystem_ci; - if ecosystem_ci { - warn_user_once!( - "The formatting of fixes emitted by this option is a work-in-progress, subject to \ - change at any time, and intended for use with the ecosystem ci scripts only." - ); - } let (cli, overrides) = args.partition(); // Construct the "default" settings. These are used when no `pyproject.toml` @@ -219,11 +212,18 @@ fn check(args: CheckArgs, log_level: LogLevel) -> Result { printer_flags |= PrinterFlags::SHOW_VIOLATIONS; } if show_fixes { - printer_flags |= PrinterFlags::SHOW_FIXES; + printer_flags |= PrinterFlags::SHOW_FIX_SUMMARY; } if show_source { printer_flags |= PrinterFlags::SHOW_SOURCE; } + if cli.ecosystem_ci { + warn_user_once!( + "The formatting of fixes emitted by this option is a work-in-progress, subject to \ + change at any time, and intended only for internal use." + ); + printer_flags |= PrinterFlags::SHOW_FIX_DIFF; + } #[cfg(debug_assertions)] if cache { @@ -248,7 +248,7 @@ fn check(args: CheckArgs, log_level: LogLevel) -> Result { return Ok(ExitStatus::Success); } - let printer = Printer::new(format, log_level, autofix, printer_flags, ecosystem_ci); + let printer = Printer::new(format, log_level, autofix, printer_flags); if cli.watch { if format != SerializationFormat::Text { diff --git a/crates/ruff_cli/src/printer.rs b/crates/ruff_cli/src/printer.rs index 9233bf19c1..81d4c95f4e 100644 --- a/crates/ruff_cli/src/printer.rs +++ b/crates/ruff_cli/src/printer.rs @@ -28,9 +28,14 @@ use crate::diagnostics::Diagnostics; bitflags! { #[derive(Default, Debug, Copy, Clone)] pub(crate) struct Flags: u8 { + /// Whether to show violations when emitting diagnostics. const SHOW_VIOLATIONS = 0b0000_0001; - const SHOW_FIXES = 0b0000_0010; - const SHOW_SOURCE = 0b000_0100; + /// Whether to show the source code when emitting diagnostics. + const SHOW_SOURCE = 0b000_0010; + /// Whether to show a summary of the fixed violations when emitting diagnostics. + const SHOW_FIX_SUMMARY = 0b0000_0100; + /// Whether to show a diff of each fixed violation when emitting diagnostics. + const SHOW_FIX_DIFF = 0b0000_1000; } } @@ -70,8 +75,6 @@ pub(crate) struct Printer { log_level: LogLevel, autofix_level: flags::FixMode, flags: Flags, - /// Dev-only argument to show fixes - ecosystem_ci: bool, } impl Printer { @@ -80,14 +83,12 @@ impl Printer { log_level: LogLevel, autofix_level: flags::FixMode, flags: Flags, - ecosystem_ci: bool, ) -> Self { Self { format, log_level, autofix_level, flags, - ecosystem_ci, } } @@ -165,10 +166,10 @@ impl Printer { self.format, SerializationFormat::Text | SerializationFormat::Grouped ) { - if self.flags.contains(Flags::SHOW_FIXES) { + if self.flags.contains(Flags::SHOW_FIX_SUMMARY) { if !diagnostics.fixed.is_empty() { writeln!(writer)?; - print_fixed(writer, &diagnostics.fixed)?; + print_fix_summary(writer, &diagnostics.fixed)?; writeln!(writer)?; } } @@ -187,18 +188,16 @@ impl Printer { JunitEmitter::default().emit(writer, &diagnostics.messages, &context)?; } SerializationFormat::Text => { - let show_fixes = self.ecosystem_ci && self.flags.contains(Flags::SHOW_FIXES); - TextEmitter::default() .with_show_fix_status(show_fix_status(self.autofix_level)) - .with_show_fix(show_fixes) + .with_show_fix_diff(self.flags.contains(Flags::SHOW_FIX_DIFF)) .with_show_source(self.flags.contains(Flags::SHOW_SOURCE)) .emit(writer, &diagnostics.messages, &context)?; - if self.flags.contains(Flags::SHOW_FIXES) { + if self.flags.contains(Flags::SHOW_FIX_SUMMARY) { if !diagnostics.fixed.is_empty() { writeln!(writer)?; - print_fixed(writer, &diagnostics.fixed)?; + print_fix_summary(writer, &diagnostics.fixed)?; writeln!(writer)?; } } @@ -211,10 +210,10 @@ impl Printer { .with_show_fix_status(show_fix_status(self.autofix_level)) .emit(writer, &diagnostics.messages, &context)?; - if self.flags.contains(Flags::SHOW_FIXES) { + if self.flags.contains(Flags::SHOW_FIX_SUMMARY) { if !diagnostics.fixed.is_empty() { writeln!(writer)?; - print_fixed(writer, &diagnostics.fixed)?; + print_fix_summary(writer, &diagnostics.fixed)?; writeln!(writer)?; } } @@ -392,7 +391,7 @@ const fn show_fix_status(autofix_level: flags::FixMode) -> bool { !matches!(autofix_level, flags::FixMode::Apply) } -fn print_fixed(stdout: &mut T, fixed: &FxHashMap) -> Result<()> { +fn print_fix_summary(stdout: &mut T, fixed: &FxHashMap) -> Result<()> { let total = fixed .values() .map(|table| table.values().sum::())