Implement x.py test src/tools/clippy --bless

- Add clippy_dev to the rust workspace

  Before, it would give an error that it wasn't either included or
  excluded from the workspace:

  ```
  error: current package believes it's in a workspace when it's not:
  current:   /home/joshua/rustc/src/tools/clippy/clippy_dev/Cargo.toml
  workspace: /home/joshua/rustc/Cargo.toml

  this may be fixable by adding `src/tools/clippy/clippy_dev` to the `workspace.members` array of the manifest located at: /home/joshua/rustc/Cargo.toml
  Alternatively, to keep it out of the workspace, add the package to the `workspace.exclude` array, or add an empty `[workspace]` table to the package's manifest.
  ```

- Change clippy's copy of compiletest not to special-case
  rust-lang/rust. Using OUT_DIR confused `clippy_dev` and it couldn't find
  the test outputs. This is one of the reasons why `cargo dev bless` used
  to silently do nothing (the others were that `CARGO_TARGET_DIR` and
  `PROFILE` weren't set appropriately).

- Run clippy_dev on test failure

I tested this by removing a couple lines from a stderr file, and they
were correctly replaced.

- Fix clippy_dev warnings
This commit is contained in:
Joshua Nelson 2021-04-14 09:20:49 -04:00
parent 2e7eb85b1d
commit 8c25e27f16
6 changed files with 42 additions and 10 deletions

View File

@ -599,6 +599,19 @@ dependencies = [
name = "clippy-mini-macro-test" name = "clippy-mini-macro-test"
version = "0.2.0" version = "0.2.0"
[[package]]
name = "clippy_dev"
version = "0.0.1"
dependencies = [
"bytecount",
"clap",
"itertools 0.9.0",
"opener",
"regex",
"shell-escape",
"walkdir",
]
[[package]] [[package]]
name = "clippy_lints" name = "clippy_lints"
version = "0.1.53" version = "0.1.53"

View File

@ -7,6 +7,7 @@ members = [
"src/rustdoc-json-types", "src/rustdoc-json-types",
"src/tools/cargotest", "src/tools/cargotest",
"src/tools/clippy", "src/tools/clippy",
"src/tools/clippy/clippy_dev",
"src/tools/compiletest", "src/tools/compiletest",
"src/tools/error_index_generator", "src/tools/error_index_generator",
"src/tools/linkchecker", "src/tools/linkchecker",

View File

@ -1627,6 +1627,11 @@ impl Cargo {
pub fn add_rustc_lib_path(&mut self, builder: &Builder<'_>, compiler: Compiler) { pub fn add_rustc_lib_path(&mut self, builder: &Builder<'_>, compiler: Compiler) {
builder.add_rustc_lib_path(compiler, &mut self.command); builder.add_rustc_lib_path(compiler, &mut self.command);
} }
pub fn current_dir(&mut self, dir: &Path) -> &mut Cargo {
self.command.current_dir(dir);
self
}
} }
impl From<Cargo> for Command { impl From<Cargo> for Command {

View File

@ -632,6 +632,26 @@ impl Step for Clippy {
cargo.add_rustc_lib_path(builder, compiler); cargo.add_rustc_lib_path(builder, compiler);
if builder.try_run(&mut cargo.into()) {
// The tests succeeded; nothing to do.
return;
}
if !builder.config.cmd.bless() {
std::process::exit(1);
}
let mut cargo = builder.cargo(compiler, Mode::ToolRustc, SourceType::InTree, host, "run");
cargo.arg("-p").arg("clippy_dev");
// clippy_dev gets confused if it can't find `clippy/Cargo.toml`
cargo.current_dir(&builder.src.join("src").join("tools").join("clippy"));
if builder.config.rust_optimize {
cargo.env("PROFILE", "release");
} else {
cargo.env("PROFILE", "debug");
}
cargo.arg("--");
cargo.arg("bless");
builder.run(&mut cargo.into()); builder.run(&mut cargo.into());
} }
} }

View File

@ -44,7 +44,7 @@ pub fn create(pass: Option<&str>, lint_name: Option<&str>, category: Option<&str
create_test(&lint).context("Unable to create a test for the new lint") create_test(&lint).context("Unable to create a test for the new lint")
} }
fn create_lint(lint: &LintData) -> io::Result<()> { fn create_lint(lint: &LintData<'_>) -> io::Result<()> {
let (pass_type, pass_lifetimes, pass_import, context_import) = match lint.pass { let (pass_type, pass_lifetimes, pass_import, context_import) = match lint.pass {
"early" => ("EarlyLintPass", "", "use rustc_ast::ast::*;", "EarlyContext"), "early" => ("EarlyLintPass", "", "use rustc_ast::ast::*;", "EarlyContext"),
"late" => ("LateLintPass", "<'_>", "use rustc_hir::*;", "LateContext"), "late" => ("LateLintPass", "<'_>", "use rustc_hir::*;", "LateContext"),
@ -68,7 +68,7 @@ fn create_lint(lint: &LintData) -> io::Result<()> {
write_file(lint.project_root.join(&lint_path), lint_contents.as_bytes()) write_file(lint.project_root.join(&lint_path), lint_contents.as_bytes())
} }
fn create_test(lint: &LintData) -> io::Result<()> { fn create_test(lint: &LintData<'_>) -> io::Result<()> {
fn create_project_layout<P: Into<PathBuf>>(lint_name: &str, location: P, case: &str, hint: &str) -> io::Result<()> { fn create_project_layout<P: Into<PathBuf>>(lint_name: &str, location: P, case: &str, hint: &str) -> io::Result<()> {
let mut path = location.into().join(case); let mut path = location.into().join(case);
fs::create_dir(&path)?; fs::create_dir(&path)?;

View File

@ -83,14 +83,7 @@ fn default_config() -> compiletest::Config {
third_party_crates(), third_party_crates(),
)); ));
config.build_base = if cargo::is_rustc_test_suite() { config.build_base = host_lib().join("test_build_base");
// This make the stderr files go to clippy OUT_DIR on rustc repo build dir
let mut path = PathBuf::from(env!("OUT_DIR"));
path.push("test_build_base");
path
} else {
host_lib().join("test_build_base")
};
config.rustc_path = clippy_driver_path(); config.rustc_path = clippy_driver_path();
config config
} }