55// positives.
66
77#![ cfg( feature = "lintcheck" ) ]
8- #![ allow( clippy:: filter_map) ]
8+ #![ allow( clippy:: filter_map, clippy:: collapsible_else_if) ]
9+ #![ allow( clippy:: blocks_in_if_conditions) ] // FP on `if x.iter().any(|x| ...)`
910
1011use crate :: clippy_project_root;
1112
1213use std:: collections:: HashMap ;
1314use std:: process:: Command ;
1415use std:: sync:: atomic:: { AtomicUsize , Ordering } ;
15- use std:: { env, fmt, fs:: write, path:: PathBuf } ;
16+ use std:: {
17+ env, fmt,
18+ fs:: write,
19+ path:: { Path , PathBuf } ,
20+ } ;
1621
1722use clap:: ArgMatches ;
1823use rayon:: prelude:: * ;
@@ -196,11 +201,9 @@ impl CrateSource {
196201 if !crate_root. exists ( ) {
197202 println ! ( "Copying {} to {}" , path. display( ) , copy_dest. display( ) ) ;
198203
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- ) ) ;
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+ } ) ;
204207 } else {
205208 println ! (
206209 "Not copying {} to {}, destination already exists" ,
@@ -225,7 +228,7 @@ impl Crate {
225228 /// issued
226229 fn run_clippy_lints (
227230 & self ,
228- cargo_clippy_path : & PathBuf ,
231+ cargo_clippy_path : & Path ,
229232 target_dir_index : & AtomicUsize ,
230233 thread_limit : usize ,
231234 total_crates_to_lint : usize ,
@@ -308,13 +311,13 @@ impl LintcheckConfig {
308311 // first, check if we got anything passed via the LINTCHECK_TOML env var,
309312 // if not, ask clap if we got any value for --crates-toml <foo>
310313 // if not, use the default "clippy_dev/lintcheck_crates.toml"
311- let sources_toml = env:: var ( "LINTCHECK_TOML" ) . unwrap_or (
314+ let sources_toml = env:: var ( "LINTCHECK_TOML" ) . unwrap_or_else ( |_| {
312315 clap_config
313316 . value_of ( "crates-toml" )
314317 . clone ( )
315318 . unwrap_or ( "clippy_dev/lintcheck_crates.toml" )
316- . to_string ( ) ,
317- ) ;
319+ . to_string ( )
320+ } ) ;
318321
319322 let sources_toml_path = PathBuf :: from ( sources_toml) ;
320323
@@ -330,7 +333,7 @@ impl LintcheckConfig {
330333 Some ( threads) => {
331334 let threads: usize = threads
332335 . parse ( )
333- . expect ( & format ! ( "Failed to parse '{}' to a digit" , threads) ) ;
336+ . unwrap_or_else ( |_| panic ! ( "Failed to parse '{}' to a digit" , threads) ) ;
334337 if threads == 0 {
335338 // automatic choice
336339 // Rayon seems to return thread count so half that for core count
@@ -387,7 +390,7 @@ fn build_clippy() {
387390}
388391
389392/// 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 > {
393+ fn read_crates ( toml_path : & Path ) -> Vec < CrateSource > {
391394 let toml_content: String =
392395 std:: fs:: read_to_string ( & toml_path) . unwrap_or_else ( |_| panic ! ( "Failed to read {}" , toml_path. display( ) ) ) ;
393396 let crate_list: SourceList =
@@ -499,7 +502,10 @@ fn gather_stats(clippy_warnings: &[ClippyWarning]) -> (String, HashMap<&String,
499502
500503/// check if the latest modification of the logfile is older than the modification date of the
501504/// 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 {
505+ fn lintcheck_needs_rerun ( lintcheck_logs_path : & Path ) -> bool {
506+ if !lintcheck_logs_path. exists ( ) {
507+ return true ;
508+ }
503509 let clippy_modified: std:: time:: SystemTime = {
504510 let mut times = [ CLIPPY_DRIVER_PATH , CARGO_CLIPPY_PATH ] . iter ( ) . map ( |p| {
505511 std:: fs:: metadata ( p)
@@ -533,15 +539,13 @@ pub fn run(clap_config: &ArgMatches) {
533539 // refresh the logs
534540 if lintcheck_needs_rerun ( & config. lintcheck_results_path ) {
535541 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 */ } ,
542+ // if we get an Err here, the shared target dir probably does simply not exist
543+ if let Ok ( metadata) = std:: fs:: metadata ( & shared_target_dir) {
544+ if metadata. is_dir ( ) {
545+ println ! ( "Clippy is newer than lint check logs, clearing lintcheck shared target dir..." ) ;
546+ std:: fs:: remove_dir_all ( & shared_target_dir)
547+ . expect ( "failed to remove target/lintcheck/shared_target_dir" ) ;
548+ }
545549 }
546550 }
547551
@@ -660,11 +664,10 @@ pub fn run(clap_config: &ArgMatches) {
660664}
661665
662666/// read the previous stats from the lintcheck-log file
663- fn read_stats_from_file ( file_path : & PathBuf ) -> HashMap < String , usize > {
667+ fn read_stats_from_file ( file_path : & Path ) -> HashMap < String , usize > {
664668 let file_content: String = match std:: fs:: read_to_string ( file_path) . ok ( ) {
665669 Some ( content) => content,
666670 None => {
667- eprintln ! ( "RETURND" ) ;
668671 return HashMap :: new ( ) ;
669672 } ,
670673 } ;
@@ -678,9 +681,9 @@ fn read_stats_from_file(file_path: &PathBuf) -> HashMap<String, usize> {
678681 let stats_lines = & lines[ start + 1 ..=end - 1 ] ;
679682
680683 stats_lines
681- . into_iter ( )
684+ . iter ( )
682685 . map ( |line| {
683- let mut spl = line. split ( " " ) . into_iter ( ) ;
686+ let mut spl = line. split ( ' ' ) ;
684687 (
685688 spl. next ( ) . unwrap ( ) . to_string ( ) ,
686689 spl. next ( ) . unwrap ( ) . parse :: < usize > ( ) . unwrap ( ) ,
@@ -733,3 +736,30 @@ fn print_stats(old_stats: HashMap<String, usize>, new_stats: HashMap<&String, us
733736 println ! ( "{} {} => 0" , old_key, old_value) ;
734737 } ) ;
735738}
739+
740+ #[ test]
741+ fn lintcheck_test ( ) {
742+ let args = [
743+ "run" ,
744+ "--target-dir" ,
745+ "clippy_dev/target" ,
746+ "--package" ,
747+ "clippy_dev" ,
748+ "--bin" ,
749+ "clippy_dev" ,
750+ "--manifest-path" ,
751+ "clippy_dev/Cargo.toml" ,
752+ "--features" ,
753+ "lintcheck" ,
754+ "--" ,
755+ "lintcheck" ,
756+ "--crates-toml" ,
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