@@ -188,14 +188,25 @@ impl CrateSource {
188
188
create_dirs ( & krate_download_dir, & extract_dir) ;
189
189
190
190
let krate_file_path = krate_download_dir. join ( format ! ( "{name}-{version}.crate.tar.gz" ) ) ;
191
- // don't download/extract if we already have done so
191
+ // don't download if we already have done so
192
192
if !krate_file_path. is_file ( ) {
193
193
// create a file path to download and write the crate data into
194
194
let mut krate_dest = std:: fs:: File :: create ( & krate_file_path) . unwrap ( ) ;
195
195
let mut krate_req = get ( & url) . unwrap ( ) . into_reader ( ) ;
196
196
// copy the crate into the file
197
197
std:: io:: copy ( & mut krate_req, & mut krate_dest) . unwrap ( ) ;
198
+ }
198
199
200
+ // if the source code was altered (previous use of `--fix`), we need to restore the crate
201
+ // to its original state by re-extracting it
202
+ if !extracted_krate_dir. exists ( )
203
+ || extracted_krate_dir. metadata ( ) . map_or ( false , |metadata| {
204
+ metadata. created ( ) . map_or ( false , |created| {
205
+ metadata. modified ( ) . map_or ( false , |modified| created != modified)
206
+ } )
207
+ } )
208
+ {
209
+ debug ! ( "extracting {} {}" , name, version) ;
199
210
// unzip the tarball
200
211
let ungz_tar = flate2:: read:: GzDecoder :: new ( std:: fs:: File :: open ( & krate_file_path) . unwrap ( ) ) ;
201
212
// extract the tar archive
@@ -337,7 +348,9 @@ impl Crate {
337
348
let shared_target_dir = clippy_project_root ( ) . join ( "target/lintcheck/shared_target_dir" ) ;
338
349
339
350
let mut cargo_clippy_args = if config. fix {
340
- vec ! [ "--fix" , "--" ]
351
+ // need to pass `clippy` arg even if already feeding `cargo-clippy`
352
+ // see https://github.com/rust-lang/rust-clippy/pull/9461
353
+ vec ! [ "clippy" , "--fix" , "--allow-no-vcs" , "--" ]
341
354
} else {
342
355
vec ! [ "--" , "--message-format=json" , "--" ]
343
356
} ;
@@ -347,16 +360,19 @@ impl Crate {
347
360
for opt in options {
348
361
clippy_args. push ( opt) ;
349
362
}
350
- } else {
351
- clippy_args. extend ( [ "-Wclippy::pedantic" , "-Wclippy::cargo" ] ) ;
352
363
}
353
364
354
- if lint_filter. is_empty ( ) {
355
- clippy_args. push ( "--cap-lints=warn" ) ;
365
+ // cap-lints flag is ignored when using `clippy --fix` for now
366
+ // So it needs to be passed directly to rustc
367
+ // see https://github.com/rust-lang/rust-clippy/issues/9703
368
+ let rustc_flags = if lint_filter. is_empty ( ) {
369
+ clippy_args. extend ( [ "-Wclippy::pedantic" , "-Wclippy::cargo" ] ) ;
370
+ "--cap-lints=warn" . to_string ( )
356
371
} else {
357
- clippy_args. push ( "--cap-lints=allow" ) ;
358
- clippy_args. extend ( lint_filter. iter ( ) . map ( std:: string:: String :: as_str) ) ;
359
- }
372
+ let mut lint_filter_buf = lint_filter. clone ( ) ;
373
+ lint_filter_buf. push ( "--cap-lints=allow" . to_string ( ) ) ;
374
+ lint_filter_buf. join ( " " )
375
+ } ;
360
376
361
377
if let Some ( server) = server {
362
378
let target = shared_target_dir. join ( "recursive" ) ;
@@ -393,6 +409,7 @@ impl Crate {
393
409
let all_output = Command :: new ( & cargo_clippy_path)
394
410
// use the looping index to create individual target dirs
395
411
. env ( "CARGO_TARGET_DIR" , shared_target_dir. join ( format ! ( "_{thread_index:?}" ) ) )
412
+ . env ( "RUSTFLAGS" , rustc_flags)
396
413
. args ( & cargo_clippy_args)
397
414
. current_dir ( & self . path )
398
415
. output ( )
0 commit comments