diff --git a/src/cargo/core/shell.rs b/src/cargo/core/shell.rs index 918b59fbc..48c3f68dc 100644 --- a/src/cargo/core/shell.rs +++ b/src/cargo/core/shell.rs @@ -222,10 +222,7 @@ impl Shell { /// Prints an amber 'warning' message. pub fn warn(&mut self, message: T) -> CargoResult<()> { - match self.verbosity { - Verbosity::Quiet => Ok(()), - _ => self.print(&"warning", Some(&message), &WARN, false), - } + self.print(&"warning", Some(&message), &WARN, false) } /// Prints a cyan 'note' message. @@ -407,16 +404,22 @@ impl Shell { } /// Prints the passed in [`Report`] to stderr - pub fn print_report(&mut self, report: Report<'_>) -> std::io::Result<()> { + pub fn print_report(&mut self, report: Report<'_>, force: bool) -> CargoResult<()> { + if !force && matches!(self.verbosity, Verbosity::Quiet) { + return Ok(()); + } + + if self.needs_clear { + self.err_erase_line(); + } let term_width = self .err_width() .diagnostic_terminal_width() .unwrap_or(annotate_snippets::renderer::DEFAULT_TERM_WIDTH); - writeln!( - self.err(), - "{}", - Renderer::styled().term_width(term_width).render(report) - ) + let rendered = Renderer::styled().term_width(term_width).render(report); + self.err().write_all(rendered.as_bytes())?; + self.err().write_all("\n".as_bytes())?; + Ok(()) } } diff --git a/src/cargo/util/lints.rs b/src/cargo/util/lints.rs index 06ea6f470..0763be70e 100644 --- a/src/cargo/util/lints.rs +++ b/src/cargo/util/lints.rs @@ -171,7 +171,7 @@ fn verify_feature_enabled( } *error_count += 1; - gctx.shell().print_report(&report)?; + gctx.shell().print_report(&report, true)?; } Ok(()) } @@ -339,6 +339,15 @@ impl LintLevel { LintLevel::Forbid => Level::ERROR, } } + + fn force(self) -> bool { + match self { + Self::Allow => false, + Self::Warn => true, + Self::Deny => true, + Self::Forbid => true, + } + } } impl From for LintLevel { @@ -459,7 +468,7 @@ pub fn check_im_a_teapot( ) .element(Level::NOTE.message(&emitted_reason))]; - gctx.shell().print_report(report)?; + gctx.shell().print_report(report, lint_level.force())?; } Ok(()) } @@ -568,7 +577,7 @@ fn output_unknown_lints( ); } - gctx.shell().print_report(&report)?; + gctx.shell().print_report(&report, lint_level.force())?; } Ok(()) diff --git a/src/cargo/util/toml/mod.rs b/src/cargo/util/toml/mod.rs index 9848ef7b4..6d4cb7516 100644 --- a/src/cargo/util/toml/mod.rs +++ b/src/cargo/util/toml/mod.rs @@ -1930,7 +1930,7 @@ fn missing_dep_diagnostic( group.element(snippet) }; - if let Err(err) = gctx.shell().print_report(&[group]) { + if let Err(err) = gctx.shell().print_report(&[group], true) { return Err(err.into()); } Err(AlreadyPrintedError::new(anyhow!("").into()).into()) @@ -2798,7 +2798,7 @@ fn emit_diagnostic( .annotation(AnnotationKind::Primary.span(span)), ); - if let Err(err) = gctx.shell().print_report(&[group]) { + if let Err(err) = gctx.shell().print_report(&[group], true) { return err.into(); } return AlreadyPrintedError::new(e.into()).into();