summaryrefslogtreecommitdiffstats
path: root/src/tools/clippy/clippy_dev
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:57:31 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-05-30 03:57:31 +0000
commitdc0db358abe19481e475e10c32149b53370f1a1c (patch)
treeab8ce99c4b255ce46f99ef402c27916055b899ee /src/tools/clippy/clippy_dev
parentReleasing progress-linux version 1.71.1+dfsg1-2~progress7.99u1. (diff)
downloadrustc-dc0db358abe19481e475e10c32149b53370f1a1c.tar.xz
rustc-dc0db358abe19481e475e10c32149b53370f1a1c.zip
Merging upstream version 1.72.1+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/tools/clippy/clippy_dev')
-rw-r--r--src/tools/clippy/clippy_dev/src/bless.rs60
-rw-r--r--src/tools/clippy/clippy_dev/src/fmt.rs1
-rw-r--r--src/tools/clippy/clippy_dev/src/lib.rs7
-rw-r--r--src/tools/clippy/clippy_dev/src/main.rs14
-rw-r--r--src/tools/clippy/clippy_dev/src/new_lint.rs15
5 files changed, 27 insertions, 70 deletions
diff --git a/src/tools/clippy/clippy_dev/src/bless.rs b/src/tools/clippy/clippy_dev/src/bless.rs
deleted file mode 100644
index 92b2771f3..000000000
--- a/src/tools/clippy/clippy_dev/src/bless.rs
+++ /dev/null
@@ -1,60 +0,0 @@
-//! `bless` updates the reference files in the repo with changed output files
-//! from the last test run.
-
-use crate::cargo_clippy_path;
-use std::ffi::OsStr;
-use std::fs;
-use std::path::{Path, PathBuf};
-use std::sync::LazyLock;
-use walkdir::{DirEntry, WalkDir};
-
-static CLIPPY_BUILD_TIME: LazyLock<Option<std::time::SystemTime>> =
- LazyLock::new(|| cargo_clippy_path().metadata().ok()?.modified().ok());
-
-/// # Panics
-///
-/// Panics if the path to a test file is broken
-pub fn bless(ignore_timestamp: bool) {
- let extensions = ["stdout", "stderr", "fixed"].map(OsStr::new);
-
- WalkDir::new(build_dir())
- .into_iter()
- .map(Result::unwrap)
- .filter(|entry| entry.path().extension().map_or(false, |ext| extensions.contains(&ext)))
- .for_each(|entry| update_reference_file(&entry, ignore_timestamp));
-}
-
-fn update_reference_file(test_output_entry: &DirEntry, ignore_timestamp: bool) {
- let test_output_path = test_output_entry.path();
-
- let reference_file_name = test_output_entry.file_name().to_str().unwrap().replace(".stage-id", "");
- let reference_file_path = Path::new("tests")
- .join(test_output_path.strip_prefix(build_dir()).unwrap())
- .with_file_name(reference_file_name);
-
- // If the test output was not updated since the last clippy build, it may be outdated
- if !ignore_timestamp && !updated_since_clippy_build(test_output_entry).unwrap_or(true) {
- return;
- }
-
- let test_output_file = fs::read(test_output_path).expect("Unable to read test output file");
- let reference_file = fs::read(&reference_file_path).unwrap_or_default();
-
- if test_output_file != reference_file {
- // If a test run caused an output file to change, update the reference file
- println!("updating {}", reference_file_path.display());
- fs::copy(test_output_path, &reference_file_path).expect("Could not update reference file");
- }
-}
-
-fn updated_since_clippy_build(entry: &DirEntry) -> Option<bool> {
- let clippy_build_time = (*CLIPPY_BUILD_TIME)?;
- let modified = entry.metadata().ok()?.modified().ok()?;
- Some(modified >= clippy_build_time)
-}
-
-fn build_dir() -> PathBuf {
- let mut path = std::env::current_exe().unwrap();
- path.set_file_name("test");
- path
-}
diff --git a/src/tools/clippy/clippy_dev/src/fmt.rs b/src/tools/clippy/clippy_dev/src/fmt.rs
index 256231441..ee559d45d 100644
--- a/src/tools/clippy/clippy_dev/src/fmt.rs
+++ b/src/tools/clippy/clippy_dev/src/fmt.rs
@@ -35,6 +35,7 @@ struct FmtContext {
}
// the "main" function of cargo dev fmt
+#[allow(clippy::missing_panics_doc)]
pub fn run(check: bool, verbose: bool) {
fn try_run(context: &FmtContext) -> Result<bool, CliError> {
let mut success = true;
diff --git a/src/tools/clippy/clippy_dev/src/lib.rs b/src/tools/clippy/clippy_dev/src/lib.rs
index 56a269288..4624451cf 100644
--- a/src/tools/clippy/clippy_dev/src/lib.rs
+++ b/src/tools/clippy/clippy_dev/src/lib.rs
@@ -14,7 +14,6 @@ use std::io;
use std::path::PathBuf;
use std::process::{self, ExitStatus};
-pub mod bless;
pub mod dogfood;
pub mod fmt;
pub mod lint;
@@ -29,6 +28,10 @@ static CARGO_CLIPPY_EXE: &str = "cargo-clippy";
static CARGO_CLIPPY_EXE: &str = "cargo-clippy.exe";
/// Returns the path to the `cargo-clippy` binary
+///
+/// # Panics
+///
+/// Panics if the path of current executable could not be retrieved.
#[must_use]
pub fn cargo_clippy_path() -> PathBuf {
let mut path = std::env::current_exe().expect("failed to get current executable name");
@@ -61,6 +64,8 @@ pub fn clippy_project_root() -> PathBuf {
panic!("error: Can't determine root of project. Please run inside a Clippy working dir.");
}
+/// # Panics
+/// Panics if given command result was failed.
pub fn exit_if_err(status: io::Result<ExitStatus>) {
match status.expect("failed to run command").code() {
Some(0) => {},
diff --git a/src/tools/clippy/clippy_dev/src/main.rs b/src/tools/clippy/clippy_dev/src/main.rs
index e2457e5a8..43eaccdf5 100644
--- a/src/tools/clippy/clippy_dev/src/main.rs
+++ b/src/tools/clippy/clippy_dev/src/main.rs
@@ -3,15 +3,16 @@
#![warn(rust_2018_idioms, unused_lifetimes)]
use clap::{Arg, ArgAction, ArgMatches, Command};
-use clippy_dev::{bless, dogfood, fmt, lint, new_lint, serve, setup, update_lints};
+use clippy_dev::{dogfood, fmt, lint, new_lint, serve, setup, update_lints};
use indoc::indoc;
+use std::convert::Infallible;
fn main() {
let matches = get_clap_config();
match matches.subcommand() {
- Some(("bless", matches)) => {
- bless::bless(matches.get_flag("ignore-timestamp"));
+ Some(("bless", _)) => {
+ eprintln!("use `cargo bless` to automatically replace `.stderr` and `.fixed` files as tests are being run");
},
Some(("dogfood", matches)) => {
dogfood::dogfood(
@@ -34,7 +35,7 @@ fn main() {
},
Some(("new_lint", matches)) => {
match new_lint::create(
- matches.get_one::<String>("pass"),
+ matches.get_one::<String>("pass").unwrap(),
matches.get_one::<String>("name"),
matches.get_one::<String>("category").map(String::as_str),
matches.get_one::<String>("type").map(String::as_str),
@@ -175,12 +176,13 @@ fn get_clap_config() -> ArgMatches {
.help("Specify whether the lint runs during the early or late pass")
.value_parser(["early", "late"])
.conflicts_with("type")
- .required_unless_present("type"),
+ .default_value("late"),
Arg::new("name")
.short('n')
.long("name")
.help("Name of the new lint in snake case, ex: fn_too_long")
- .required(true),
+ .required(true)
+ .value_parser(|name: &str| Ok::<_, Infallible>(name.replace('-', "_"))),
Arg::new("category")
.short('c')
.long("category")
diff --git a/src/tools/clippy/clippy_dev/src/new_lint.rs b/src/tools/clippy/clippy_dev/src/new_lint.rs
index 13a277034..f11aa547b 100644
--- a/src/tools/clippy/clippy_dev/src/new_lint.rs
+++ b/src/tools/clippy/clippy_dev/src/new_lint.rs
@@ -36,8 +36,9 @@ impl<T> Context for io::Result<T> {
/// # Errors
///
/// This function errors out if the files couldn't be created or written to.
+#[allow(clippy::missing_panics_doc)]
pub fn create(
- pass: Option<&String>,
+ pass: &String,
lint_name: Option<&String>,
category: Option<&str>,
mut ty: Option<&str>,
@@ -49,7 +50,7 @@ pub fn create(
}
let lint = LintData {
- pass: pass.map_or("", String::as_str),
+ pass,
name: lint_name.expect("`name` argument is validated by clap"),
category: category.expect("`category` argument is validated by clap"),
ty,
@@ -63,6 +64,14 @@ pub fn create(
add_lint(&lint, msrv).context("Unable to add lint to clippy_lints/src/lib.rs")?;
}
+ if pass == "early" {
+ println!(
+ "\n\
+ NOTE: Use a late pass unless you need something specific from\
+ an early pass, as they lack many features and utilities"
+ );
+ }
+
Ok(())
}
@@ -87,7 +96,7 @@ fn create_test(lint: &LintData<'_>) -> io::Result<()> {
path.push("src");
fs::create_dir(&path)?;
- let header = format!("// compile-flags: --crate-name={lint_name}");
+ let header = format!("//@compile-flags: --crate-name={lint_name}");
write_file(path.join("main.rs"), get_test_file_contents(lint_name, Some(&header)))?;
Ok(())