Skip to content

Commit 8b04b61

Browse files
committed
Fix lintcheck --fix
There were several issues: - `--fix` was ignored as part of rust-lang#9461 - `--filter` in conjunction to `--fix` was broken due to rust-lang#9703 After `lintcheck --fix` is used, crates will be re-extracted since their content has been modified
1 parent fe38868 commit 8b04b61

File tree

1 file changed

+26
-9
lines changed

1 file changed

+26
-9
lines changed

lintcheck/src/main.rs

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -189,14 +189,25 @@ impl CrateSource {
189189
create_dirs(&krate_download_dir, &extract_dir);
190190

191191
let krate_file_path = krate_download_dir.join(format!("{name}-{version}.crate.tar.gz"));
192-
// don't download/extract if we already have done so
192+
// don't download if we already have done so
193193
if !krate_file_path.is_file() {
194194
// create a file path to download and write the crate data into
195195
let mut krate_dest = std::fs::File::create(&krate_file_path).unwrap();
196196
let mut krate_req = get(&url).unwrap().into_reader();
197197
// copy the crate into the file
198198
std::io::copy(&mut krate_req, &mut krate_dest).unwrap();
199+
}
199200

201+
// if the source code was altered (previous use of `--fix`), we need to restore the crate
202+
// to its original state by re-extracting it
203+
if !extracted_krate_dir.exists()
204+
|| extracted_krate_dir.metadata().map_or(false, |metadata| {
205+
metadata.created().map_or(false, |created| {
206+
metadata.modified().map_or(false, |modified| created != modified)
207+
})
208+
})
209+
{
210+
debug!("extracting {} {}", name, version);
200211
// unzip the tarball
201212
let ungz_tar = flate2::read::GzDecoder::new(std::fs::File::open(&krate_file_path).unwrap());
202213
// extract the tar archive
@@ -338,7 +349,9 @@ impl Crate {
338349
let shared_target_dir = clippy_project_root().join("target/lintcheck/shared_target_dir");
339350

340351
let mut cargo_clippy_args = if config.fix {
341-
vec!["--fix", "--"]
352+
// need to pass `clippy` arg even if already feeding `cargo-clippy`
353+
// see https://github.com/rust-lang/rust-clippy/pull/9461
354+
vec!["clippy", "--fix", "--allow-no-vcs", "--"]
342355
} else {
343356
vec!["--", "--message-format=json", "--"]
344357
};
@@ -348,16 +361,19 @@ impl Crate {
348361
for opt in options {
349362
clippy_args.push(opt);
350363
}
351-
} else {
352-
clippy_args.extend(["-Wclippy::pedantic", "-Wclippy::cargo"]);
353364
}
354365

355-
if lint_filter.is_empty() {
356-
clippy_args.push("--cap-lints=warn");
366+
// cap-lints flag is ignored when using `clippy --fix` for now
367+
// So it needs to be passed directly to rustc
368+
// see https://github.com/rust-lang/rust-clippy/issues/9703
369+
let rustc_flags = if lint_filter.is_empty() {
370+
clippy_args.extend(["-Wclippy::pedantic", "-Wclippy::cargo"]);
371+
"--cap-lints=warn".to_string()
357372
} else {
358-
clippy_args.push("--cap-lints=allow");
359-
clippy_args.extend(lint_filter.iter().map(std::string::String::as_str));
360-
}
373+
let mut lint_filter_buf = lint_filter.clone();
374+
lint_filter_buf.push("--cap-lints=allow".to_string());
375+
lint_filter_buf.join(" ")
376+
};
361377

362378
if let Some(server) = server {
363379
let target = shared_target_dir.join("recursive");
@@ -396,6 +412,7 @@ impl Crate {
396412
let all_output = Command::new(&cargo_clippy_path)
397413
// use the looping index to create individual target dirs
398414
.env("CARGO_TARGET_DIR", shared_target_dir.join(format!("_{thread_index:?}")))
415+
.env("RUSTFLAGS", rustc_flags)
399416
.args(&cargo_clippy_args)
400417
.current_dir(&self.path)
401418
.output()

0 commit comments

Comments
 (0)