@@ -181,21 +181,33 @@ impl CrateSource {
181
181
CrateSource :: CratesIo { name, version, options } => {
182
182
let extract_dir = PathBuf :: from ( LINTCHECK_SOURCES ) ;
183
183
let krate_download_dir = PathBuf :: from ( LINTCHECK_DOWNLOADS ) ;
184
+ let extracted_krate_dir = extract_dir. join ( format ! ( "{name}-{version}/" ) ) ;
184
185
185
186
// url to download the crate from crates.io
186
187
let url = format ! ( "https://crates.io/api/v1/crates/{name}/{version}/download" ) ;
187
188
println ! ( "Downloading and extracting {name} {version} from {url}" ) ;
188
189
create_dirs ( & krate_download_dir, & extract_dir) ;
189
190
190
191
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
192
+ // don't download if we already have done so
192
193
if !krate_file_path. is_file ( ) {
193
194
// create a file path to download and write the crate data into
194
195
let mut krate_dest = std:: fs:: File :: create ( & krate_file_path) . unwrap ( ) ;
195
196
let mut krate_req = get ( & url) . unwrap ( ) . into_reader ( ) ;
196
197
// copy the crate into the file
197
198
std:: io:: copy ( & mut krate_req, & mut krate_dest) . unwrap ( ) ;
199
+ }
198
200
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) ;
199
211
// unzip the tarball
200
212
let ungz_tar = flate2:: read:: GzDecoder :: new ( std:: fs:: File :: open ( & krate_file_path) . unwrap ( ) ) ;
201
213
// extract the tar archive
@@ -207,7 +219,7 @@ impl CrateSource {
207
219
Crate {
208
220
version : version. clone ( ) ,
209
221
name : name. clone ( ) ,
210
- path : extract_dir . join ( format ! ( "{name}-{version}/" ) ) ,
222
+ path : extracted_krate_dir ,
211
223
options : options. clone ( ) ,
212
224
}
213
225
} ,
@@ -337,7 +349,9 @@ impl Crate {
337
349
let shared_target_dir = clippy_project_root ( ) . join ( "target/lintcheck/shared_target_dir" ) ;
338
350
339
351
let mut cargo_clippy_args = if config. fix {
340
- 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" , "--" ]
341
355
} else {
342
356
vec ! [ "--" , "--message-format=json" , "--" ]
343
357
} ;
@@ -347,16 +361,19 @@ impl Crate {
347
361
for opt in options {
348
362
clippy_args. push ( opt) ;
349
363
}
350
- } else {
351
- clippy_args. extend ( [ "-Wclippy::pedantic" , "-Wclippy::cargo" ] ) ;
352
364
}
353
365
354
- if lint_filter. is_empty ( ) {
355
- 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 ( )
356
372
} else {
357
- clippy_args. push ( "--cap-lints=allow" ) ;
358
- clippy_args. extend ( lint_filter. iter ( ) . map ( std:: string:: String :: as_str) ) ;
359
- }
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
+ } ;
360
377
361
378
if let Some ( server) = server {
362
379
let target = shared_target_dir. join ( "recursive" ) ;
@@ -393,6 +410,7 @@ impl Crate {
393
410
let all_output = Command :: new ( & cargo_clippy_path)
394
411
// use the looping index to create individual target dirs
395
412
. env ( "CARGO_TARGET_DIR" , shared_target_dir. join ( format ! ( "_{thread_index:?}" ) ) )
413
+ . env ( "RUSTFLAGS" , rustc_flags)
396
414
. args ( & cargo_clippy_args)
397
415
. current_dir ( & self . path )
398
416
. output ( )
0 commit comments