5
5
// positives.
6
6
7
7
#![ cfg( feature = "lintcheck" ) ]
8
- #![ allow( clippy:: filter_map) ]
8
+ #![ allow( clippy:: filter_map, clippy :: collapsible_else_if ) ]
9
9
10
10
use crate :: clippy_project_root;
11
11
12
12
use std:: collections:: HashMap ;
13
13
use std:: process:: Command ;
14
14
use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
15
- use std:: { env, fmt, fs:: write, path:: PathBuf } ;
15
+ use std:: {
16
+ env, fmt,
17
+ fs:: write,
18
+ path:: { Path , PathBuf } ,
19
+ } ;
16
20
17
21
use clap:: ArgMatches ;
18
22
use rayon:: prelude:: * ;
@@ -196,11 +200,9 @@ impl CrateSource {
196
200
if !crate_root. exists ( ) {
197
201
println ! ( "Copying {} to {}" , path. display( ) , copy_dest. display( ) ) ;
198
202
199
- dir:: copy ( path, & copy_dest, & dir:: CopyOptions :: new ( ) ) . expect ( & format ! (
200
- "Failed to copy from {}, to {}" ,
201
- path. display( ) ,
202
- crate_root. display( )
203
- ) ) ;
203
+ dir:: copy ( path, & copy_dest, & dir:: CopyOptions :: new ( ) ) . unwrap_or_else ( |_| {
204
+ panic ! ( "Failed to copy from {}, to {}" , path. display( ) , crate_root. display( ) )
205
+ } ) ;
204
206
} else {
205
207
println ! (
206
208
"Not copying {} to {}, destination already exists" ,
@@ -225,7 +227,7 @@ impl Crate {
225
227
/// issued
226
228
fn run_clippy_lints (
227
229
& self ,
228
- cargo_clippy_path : & PathBuf ,
230
+ cargo_clippy_path : & Path ,
229
231
target_dir_index : & AtomicUsize ,
230
232
thread_limit : usize ,
231
233
total_crates_to_lint : usize ,
@@ -308,13 +310,13 @@ impl LintcheckConfig {
308
310
// first, check if we got anything passed via the LINTCHECK_TOML env var,
309
311
// if not, ask clap if we got any value for --crates-toml <foo>
310
312
// if not, use the default "clippy_dev/lintcheck_crates.toml"
311
- let sources_toml = env:: var ( "LINTCHECK_TOML" ) . unwrap_or (
313
+ let sources_toml = env:: var ( "LINTCHECK_TOML" ) . unwrap_or_else ( |_| {
312
314
clap_config
313
315
. value_of ( "crates-toml" )
314
316
. clone ( )
315
317
. unwrap_or ( "clippy_dev/lintcheck_crates.toml" )
316
- . to_string ( ) ,
317
- ) ;
318
+ . to_string ( )
319
+ } ) ;
318
320
319
321
let sources_toml_path = PathBuf :: from ( sources_toml) ;
320
322
@@ -328,9 +330,8 @@ impl LintcheckConfig {
328
330
// by default use a single thread
329
331
let max_jobs = match clap_config. value_of ( "threads" ) {
330
332
Some ( threads) => {
331
- let threads: usize = threads
332
- . parse ( )
333
- . expect ( & format ! ( "Failed to parse '{}' to a digit" , threads) ) ;
333
+ let err_msg = format ! ( "Failed to parse '{}' to a digit" , threads) ;
334
+ let threads: usize = threads. parse ( ) . expect ( & err_msg) ;
334
335
if threads == 0 {
335
336
// automatic choice
336
337
// Rayon seems to return thread count so half that for core count
@@ -387,7 +388,7 @@ fn build_clippy() {
387
388
}
388
389
389
390
/// Read a `toml` file and return a list of `CrateSources` that we want to check with clippy
390
- fn read_crates ( toml_path : & PathBuf ) -> Vec < CrateSource > {
391
+ fn read_crates ( toml_path : & Path ) -> Vec < CrateSource > {
391
392
let toml_content: String =
392
393
std:: fs:: read_to_string ( & toml_path) . unwrap_or_else ( |_| panic ! ( "Failed to read {}" , toml_path. display( ) ) ) ;
393
394
let crate_list: SourceList =
@@ -499,7 +500,10 @@ fn gather_stats(clippy_warnings: &[ClippyWarning]) -> (String, HashMap<&String,
499
500
500
501
/// check if the latest modification of the logfile is older than the modification date of the
501
502
/// clippy binary, if this is true, we should clean the lintchec shared target directory and recheck
502
- fn lintcheck_needs_rerun ( lintcheck_logs_path : & PathBuf ) -> bool {
503
+ fn lintcheck_needs_rerun ( lintcheck_logs_path : & Path ) -> bool {
504
+ if !lintcheck_logs_path. exists ( ) {
505
+ return true ;
506
+ }
503
507
let clippy_modified: std:: time:: SystemTime = {
504
508
let mut times = [ CLIPPY_DRIVER_PATH , CARGO_CLIPPY_PATH ] . iter ( ) . map ( |p| {
505
509
std:: fs:: metadata ( p)
@@ -533,15 +537,13 @@ pub fn run(clap_config: &ArgMatches) {
533
537
// refresh the logs
534
538
if lintcheck_needs_rerun ( & config. lintcheck_results_path ) {
535
539
let shared_target_dir = "target/lintcheck/shared_target_dir" ;
536
- match std:: fs:: metadata ( & shared_target_dir) {
537
- Ok ( metadata) => {
538
- if metadata. is_dir ( ) {
539
- println ! ( "Clippy is newer than lint check logs, clearing lintcheck shared target dir..." ) ;
540
- std:: fs:: remove_dir_all ( & shared_target_dir)
541
- . expect ( "failed to remove target/lintcheck/shared_target_dir" ) ;
542
- }
543
- } ,
544
- Err ( _) => { /* dir probably does not exist, don't remove anything */ } ,
540
+ // if we get an Err here, the shared target dir probably does simply not exist
541
+ if let Ok ( metadata) = std:: fs:: metadata ( & shared_target_dir) {
542
+ if metadata. is_dir ( ) {
543
+ println ! ( "Clippy is newer than lint check logs, clearing lintcheck shared target dir..." ) ;
544
+ std:: fs:: remove_dir_all ( & shared_target_dir)
545
+ . expect ( "failed to remove target/lintcheck/shared_target_dir" ) ;
546
+ }
545
547
}
546
548
}
547
549
@@ -660,11 +662,10 @@ pub fn run(clap_config: &ArgMatches) {
660
662
}
661
663
662
664
/// read the previous stats from the lintcheck-log file
663
- fn read_stats_from_file ( file_path : & PathBuf ) -> HashMap < String , usize > {
665
+ fn read_stats_from_file ( file_path : & Path ) -> HashMap < String , usize > {
664
666
let file_content: String = match std:: fs:: read_to_string ( file_path) . ok ( ) {
665
667
Some ( content) => content,
666
668
None => {
667
- eprintln ! ( "RETURND" ) ;
668
669
return HashMap :: new ( ) ;
669
670
} ,
670
671
} ;
@@ -678,9 +679,9 @@ fn read_stats_from_file(file_path: &PathBuf) -> HashMap<String, usize> {
678
679
let stats_lines = & lines[ start + 1 ..=end - 1 ] ;
679
680
680
681
stats_lines
681
- . into_iter ( )
682
+ . iter ( )
682
683
. map ( |line| {
683
- let mut spl = line. split ( " " ) . into_iter ( ) ;
684
+ let mut spl = line. split ( ' ' ) ;
684
685
(
685
686
spl. next ( ) . unwrap ( ) . to_string ( ) ,
686
687
spl. next ( ) . unwrap ( ) . parse :: < usize > ( ) . unwrap ( ) ,
@@ -733,3 +734,32 @@ fn print_stats(old_stats: HashMap<String, usize>, new_stats: HashMap<&String, us
733
734
println ! ( "{} {} => 0" , old_key, old_value) ;
734
735
} ) ;
735
736
}
737
+
738
+ #[ test]
739
+ fn lintcheck_test ( ) {
740
+ let args = [
741
+ "run" ,
742
+ "--target-dir" ,
743
+ "clippy_dev/target" ,
744
+ "--package" ,
745
+ "clippy_dev" ,
746
+ "--bin" ,
747
+ "clippy_dev" ,
748
+ "--manifest-path" ,
749
+ "clippy_dev/Cargo.toml" ,
750
+ "--features" ,
751
+ "lintcheck" ,
752
+ "--" ,
753
+ "lintcheck" ,
754
+ //"--",
755
+ "--crates-toml" ,
756
+ //"--",
757
+ "clippy_dev/ci_test_sources.toml" ,
758
+ ] ;
759
+ let status = std:: process:: Command :: new ( "cargo" )
760
+ . args ( & args)
761
+ . current_dir ( "../" /* repo root */ )
762
+ . status ( ) ;
763
+
764
+ assert ! ( status. unwrap( ) . success( ) ) ;
765
+ }
0 commit comments