about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2022-07-01 01:07:25 +0000
committerbors <bors@rust-lang.org>2022-07-01 01:07:25 +0000
commitd4488a520abb20a23398dd89086c8cbb089f03d3 (patch)
treee0754f3d3aaa66433ccc055a9c1f481fba94a806
parent23db5ce261cb8cf933d7b7988699cc1a28cee311 (diff)
parent131770d22b982998c179c1407111cf24ad12c809 (diff)
downloadrust-d4488a520abb20a23398dd89086c8cbb089f03d3.tar.gz
rust-d4488a520abb20a23398dd89086c8cbb089f03d3.zip
Auto merge of #9039 - Serial-ATA:dev-dogfood, r=giraffate
Add `cargo dev dogfood`

changelog: Add `cargo dev dogfood`

Part of #5394
-rw-r--r--book/src/development/basics.md4
-rw-r--r--clippy_dev/src/dogfood.rs33
-rw-r--r--clippy_dev/src/lib.rs1
-rw-r--r--clippy_dev/src/main.rs20
-rw-r--r--tests/dogfood.rs14
5 files changed, 66 insertions, 6 deletions
diff --git a/book/src/development/basics.md b/book/src/development/basics.md
index d3a11a31db8..6cb6615c3d8 100644
--- a/book/src/development/basics.md
+++ b/book/src/development/basics.md
@@ -59,7 +59,7 @@ cargo uitest
 # only run UI tests starting with `test_`
 TESTNAME="test_" cargo uitest
 # only run dogfood tests
-cargo test --test dogfood
+cargo dev dogfood
 ```
 
 If the output of a [UI test] differs from the expected output, you can update
@@ -97,6 +97,8 @@ cargo dev deprecate
 cargo dev setup git-hook
 # (experimental) Setup Clippy to work with IntelliJ-Rust
 cargo dev setup intellij
+# runs the `dogfood` tests
+cargo dev dogfood
 ```
 
 More about intellij command usage and reasons
diff --git a/clippy_dev/src/dogfood.rs b/clippy_dev/src/dogfood.rs
new file mode 100644
index 00000000000..b69e9f649ec
--- /dev/null
+++ b/clippy_dev/src/dogfood.rs
@@ -0,0 +1,33 @@
+use crate::clippy_project_root;
+use std::process::Command;
+
+/// # Panics
+///
+/// Panics if unable to run the dogfood test
+pub fn dogfood(fix: bool, allow_dirty: bool, allow_staged: bool) {
+    let mut cmd = Command::new("cargo");
+
+    cmd.current_dir(clippy_project_root())
+        .args(["test", "--test", "dogfood"])
+        .args(["--features", "internal"])
+        .args(["--", "dogfood_clippy"]);
+
+    let mut dogfood_args = Vec::new();
+    if fix {
+        dogfood_args.push("--fix");
+    }
+
+    if allow_dirty {
+        dogfood_args.push("--allow-dirty");
+    }
+
+    if allow_staged {
+        dogfood_args.push("--allow-staged");
+    }
+
+    cmd.env("__CLIPPY_DOGFOOD_ARGS", dogfood_args.join(" "));
+
+    let output = cmd.output().expect("failed to run command");
+
+    println!("{}", String::from_utf8_lossy(&output.stdout));
+}
diff --git a/clippy_dev/src/lib.rs b/clippy_dev/src/lib.rs
index 81e807cf10c..82574a8e64b 100644
--- a/clippy_dev/src/lib.rs
+++ b/clippy_dev/src/lib.rs
@@ -11,6 +11,7 @@ extern crate rustc_lexer;
 use std::path::PathBuf;
 
 pub mod bless;
+pub mod dogfood;
 pub mod fmt;
 pub mod lint;
 pub mod new_lint;
diff --git a/clippy_dev/src/main.rs b/clippy_dev/src/main.rs
index 243a901503f..a29ba2d0c85 100644
--- a/clippy_dev/src/main.rs
+++ b/clippy_dev/src/main.rs
@@ -3,7 +3,7 @@
 #![warn(rust_2018_idioms, unused_lifetimes)]
 
 use clap::{Arg, ArgAction, ArgMatches, Command, PossibleValue};
-use clippy_dev::{bless, fmt, lint, new_lint, serve, setup, update_lints};
+use clippy_dev::{bless, dogfood, fmt, lint, new_lint, serve, setup, update_lints};
 use indoc::indoc;
 
 fn main() {
@@ -13,6 +13,13 @@ fn main() {
         Some(("bless", matches)) => {
             bless::bless(matches.contains_id("ignore-timestamp"));
         },
+        Some(("dogfood", matches)) => {
+            dogfood::dogfood(
+                matches.contains_id("fix"),
+                matches.contains_id("allow-dirty"),
+                matches.contains_id("allow-staged"),
+            );
+        },
         Some(("fmt", matches)) => {
             fmt::run(matches.contains_id("check"), matches.contains_id("verbose"));
         },
@@ -104,6 +111,17 @@ fn get_clap_config() -> ArgMatches {
                     .long("ignore-timestamp")
                     .help("Include files updated before clippy was built"),
             ),
+            Command::new("dogfood").about("Runs the dogfood test").args([
+                Arg::new("fix").long("fix").help("Apply the suggestions when possible"),
+                Arg::new("allow-dirty")
+                    .long("allow-dirty")
+                    .help("Fix code even if the working directory has changes")
+                    .requires("fix"),
+                Arg::new("allow-staged")
+                    .long("allow-staged")
+                    .help("Fix code even if the working directory has staged changes")
+                    .requires("fix"),
+            ]),
             Command::new("fmt")
                 .about("Run rustfmt on all projects and tests")
                 .args([
diff --git a/tests/dogfood.rs b/tests/dogfood.rs
index fffc5360342..5697e8680cd 100644
--- a/tests/dogfood.rs
+++ b/tests/dogfood.rs
@@ -74,10 +74,16 @@ fn run_clippy_for_package(project: &str, args: &[&str]) {
         .env("CARGO_INCREMENTAL", "0")
         .arg("clippy")
         .arg("--all-targets")
-        .arg("--all-features")
-        .arg("--")
-        .args(args)
-        .arg("-Cdebuginfo=0"); // disable debuginfo to generate less data in the target dir
+        .arg("--all-features");
+
+    if let Ok(dogfood_args) = std::env::var("__CLIPPY_DOGFOOD_ARGS") {
+        for arg in dogfood_args.split_whitespace() {
+            command.arg(arg);
+        }
+    }
+
+    command.arg("--").args(args);
+    command.arg("-Cdebuginfo=0"); // disable debuginfo to generate less data in the target dir
 
     if cfg!(feature = "internal") {
         // internal lints only exist if we build with the internal feature