6
6
7
7
#![ cfg( feature = "lintcheck" ) ]
8
8
#![ allow( clippy:: filter_map, clippy:: collapsible_else_if) ]
9
- #![ allow( clippy:: blocks_in_if_conditions) ] // FP on `if x.iter().any(|x| ...)`
10
9
11
10
use crate :: clippy_project_root;
12
11
@@ -116,9 +115,9 @@ impl CrateSource {
116
115
// url to download the crate from crates.io
117
116
let url = format ! ( "https://crates.io/api/v1/crates/{}/{}/download" , name, version) ;
118
117
println ! ( "Downloading and extracting {} {} from {}" , name, version, url) ;
119
- let _ = std:: fs:: create_dir ( "target/lintcheck/" ) ;
120
- let _ = std:: fs:: create_dir ( & krate_download_dir) ;
121
- let _ = std:: fs:: create_dir ( & extract_dir) ;
118
+ std:: fs:: create_dir ( "target/lintcheck/" ) . expect ( "cannot create lintcheck target dir ") ;
119
+ std:: fs:: create_dir ( & krate_download_dir) . expect ( "cannot create crate download dir" ) ;
120
+ std:: fs:: create_dir ( & extract_dir) . expect ( "cannot create crate extraction dir" ) ;
122
121
123
122
let krate_file_path = krate_download_dir. join ( format ! ( "{}-{}.crate.tar.gz" , name, version) ) ;
124
123
// don't download/extract if we already have done so
@@ -198,18 +197,18 @@ impl CrateSource {
198
197
// the source path of the crate we copied, ${copy_dest}/crate_name
199
198
let crate_root = copy_dest. join ( name) ; // .../crates/local_crate
200
199
201
- if !crate_root. exists ( ) {
202
- println ! ( "Copying {} to {}" , path. display( ) , copy_dest. display( ) ) ;
203
-
204
- dir:: copy ( path, & copy_dest, & dir:: CopyOptions :: new ( ) ) . unwrap_or_else ( |_| {
205
- panic ! ( "Failed to copy from {}, to {}" , path. display( ) , crate_root. display( ) )
206
- } ) ;
207
- } else {
200
+ if crate_root. exists ( ) {
208
201
println ! (
209
202
"Not copying {} to {}, destination already exists" ,
210
203
path. display( ) ,
211
204
crate_root. display( )
212
205
) ;
206
+ } else {
207
+ println ! ( "Copying {} to {}" , path. display( ) , copy_dest. display( ) ) ;
208
+
209
+ dir:: copy ( path, & copy_dest, & dir:: CopyOptions :: new ( ) ) . unwrap_or_else ( |_| {
210
+ panic ! ( "Failed to copy from {}, to {}" , path. display( ) , crate_root. display( ) )
211
+ } ) ;
213
212
}
214
213
215
214
Crate {
@@ -236,8 +235,8 @@ impl Crate {
236
235
// advance the atomic index by one
237
236
let index = target_dir_index. fetch_add ( 1 , Ordering :: SeqCst ) ;
238
237
// "loop" the index within 0..thread_limit
239
- let target_dir_index = index % thread_limit;
240
- let perc = ( ( index * 100 ) as f32 / total_crates_to_lint as f32 ) as u8 ;
238
+ let thread_index = index % thread_limit;
239
+ let perc = ( index * 100 ) / total_crates_to_lint;
241
240
242
241
if thread_limit == 1 {
243
242
println ! (
@@ -247,7 +246,7 @@ impl Crate {
247
246
} else {
248
247
println ! (
249
248
"{}/{} {}% Linting {} {} in target dir {:?}" ,
250
- index, total_crates_to_lint, perc, & self . name, & self . version, target_dir_index
249
+ index, total_crates_to_lint, perc, & self . name, & self . version, thread_index
251
250
) ;
252
251
}
253
252
@@ -269,7 +268,7 @@ impl Crate {
269
268
// use the looping index to create individual target dirs
270
269
. env (
271
270
"CARGO_TARGET_DIR" ,
272
- shared_target_dir. join ( format ! ( "_{:?}" , target_dir_index ) ) ,
271
+ shared_target_dir. join ( format ! ( "_{:?}" , thread_index ) ) ,
273
272
)
274
273
// lint warnings will look like this:
275
274
// src/cargo/ops/cargo_compile.rs:127:35: warning: usage of `FromIterator::from_iter`
@@ -529,6 +528,10 @@ fn lintcheck_needs_rerun(lintcheck_logs_path: &Path) -> bool {
529
528
}
530
529
531
530
/// lintchecks `main()` function
531
+ ///
532
+ /// # Panics
533
+ ///
534
+ /// This function panics if the clippy binaries don't exist.
532
535
pub fn run ( clap_config : & ArgMatches ) {
533
536
let config = LintcheckConfig :: from_clap ( clap_config) ;
534
537
@@ -579,9 +582,9 @@ pub fn run(clap_config: &ArgMatches) {
579
582
// if we don't have the specified crate in the .toml, throw an error
580
583
if !crates. iter ( ) . any ( |krate| {
581
584
let name = match krate {
582
- CrateSource :: CratesIo { name, .. } => name,
583
- CrateSource :: Git { name , .. } => name,
584
- CrateSource :: Path { name , .. } => name ,
585
+ CrateSource :: CratesIo { name, .. } | CrateSource :: Git { name, .. } | CrateSource :: Path { name , .. } => {
586
+ name
587
+ } ,
585
588
} ;
586
589
name == only_one_crate
587
590
} ) {
@@ -597,8 +600,7 @@ pub fn run(clap_config: &ArgMatches) {
597
600
. into_iter ( )
598
601
. map ( |krate| krate. download_and_extract ( ) )
599
602
. filter ( |krate| krate. name == only_one_crate)
600
- . map ( |krate| krate. run_clippy_lints ( & cargo_clippy_path, & AtomicUsize :: new ( 0 ) , 1 , 1 ) )
601
- . flatten ( )
603
+ . flat_map ( |krate| krate. run_clippy_lints ( & cargo_clippy_path, & AtomicUsize :: new ( 0 ) , 1 , 1 ) )
602
604
. collect ( )
603
605
} else {
604
606
if config. max_jobs > 1 {
@@ -621,17 +623,15 @@ pub fn run(clap_config: &ArgMatches) {
621
623
crates
622
624
. into_par_iter ( )
623
625
. map ( |krate| krate. download_and_extract ( ) )
624
- . map ( |krate| krate. run_clippy_lints ( & cargo_clippy_path, & counter, num_cpus, num_crates) )
625
- . flatten ( )
626
+ . flat_map ( |krate| krate. run_clippy_lints ( & cargo_clippy_path, & counter, num_cpus, num_crates) )
626
627
. collect ( )
627
628
} else {
628
629
// run sequential
629
630
let num_crates = crates. len ( ) ;
630
631
crates
631
632
. into_iter ( )
632
633
. map ( |krate| krate. download_and_extract ( ) )
633
- . map ( |krate| krate. run_clippy_lints ( & cargo_clippy_path, & counter, 1 , num_crates) )
634
- . flatten ( )
634
+ . flat_map ( |krate| krate. run_clippy_lints ( & cargo_clippy_path, & counter, 1 , num_crates) )
635
635
. collect ( )
636
636
}
637
637
} ;
@@ -646,7 +646,7 @@ pub fn run(clap_config: &ArgMatches) {
646
646
. map ( |w| ( & w. crate_name , & w. message ) )
647
647
. collect ( ) ;
648
648
649
- let mut all_msgs: Vec < String > = clippy_warnings. iter ( ) . map ( |warning| warning . to_string ( ) ) . collect ( ) ;
649
+ let mut all_msgs: Vec < String > = clippy_warnings. iter ( ) . map ( ToString :: to_string) . collect ( ) ;
650
650
all_msgs. sort ( ) ;
651
651
all_msgs. push ( "\n \n \n \n Stats:\n " . into ( ) ) ;
652
652
all_msgs. push ( stats_formatted) ;
@@ -673,13 +673,13 @@ fn read_stats_from_file(file_path: &Path) -> HashMap<String, usize> {
673
673
} ,
674
674
} ;
675
675
676
- let lines: Vec < String > = file_content. lines ( ) . map ( |l| l . to_string ( ) ) . collect ( ) ;
676
+ let lines: Vec < String > = file_content. lines ( ) . map ( ToString :: to_string) . collect ( ) ;
677
677
678
678
// search for the beginning "Stats:" and the end "ICEs:" of the section we want
679
679
let start = lines. iter ( ) . position ( |line| line == "Stats:" ) . unwrap ( ) ;
680
680
let end = lines. iter ( ) . position ( |line| line == "ICEs:" ) . unwrap ( ) ;
681
681
682
- let stats_lines = & lines[ start + 1 ..= end - 1 ] ;
682
+ let stats_lines = & lines[ start + 1 ..end] ;
683
683
684
684
stats_lines
685
685
. iter ( )
0 commit comments