| use crate::utils::{ErrAction, cargo_cmd, expect_action, run_exit_on_err}; |
| use std::process::Command; |
| use std::{env, fs}; |
| |
| #[cfg(not(windows))] |
| static CARGO_CLIPPY_EXE: &str = "cargo-clippy"; |
| #[cfg(windows)] |
| static CARGO_CLIPPY_EXE: &str = "cargo-clippy.exe"; |
| |
| pub fn run<'a>(path: &str, edition: &str, args: impl Iterator<Item = &'a String>) { |
| let is_file = expect_action(fs::metadata(path), ErrAction::Read, path).is_file(); |
| if is_file { |
| run_exit_on_err( |
| "cargo run", |
| cargo_cmd() |
| .args(["run", "--bin", "clippy-driver", "--"]) |
| .args(["-L", "./target/debug"]) |
| .args(["-Z", "no-codegen"]) |
| .args(["--edition", edition]) |
| .arg(path) |
| .args(args) |
| // Prevent rustc from creating `rustc-ice-*` files the console output is enough. |
| .env("RUSTC_ICE", "0"), |
| ); |
| } else { |
| // Ideally this would just be `cargo run`, but the working directory needs to be |
| // set to clippy's directory when building, and the target project's directory |
| // when running clippy. `cargo` can only set a single working directory for both |
| // when using `run`. |
| run_exit_on_err("cargo build", cargo_cmd().arg("build")); |
| |
| let mut exe = env::current_exe().expect("failed to get current executable name"); |
| exe.set_file_name(CARGO_CLIPPY_EXE); |
| run_exit_on_err( |
| "cargo clippy", |
| Command::new(exe) |
| .arg("clippy") |
| .args(args) |
| // Prevent rustc from creating `rustc-ice-*` files the console output is enough. |
| .env("RUSTC_ICE", "0") |
| .current_dir(path), |
| ); |
| } |
| } |