66
77use tidy:: * ;
88
9+ use crossbeam_utils:: thread:: scope;
910use std:: env;
1011use std:: path:: PathBuf ;
1112use std:: process;
13+ use std:: sync:: atomic:: { AtomicBool , Ordering } ;
1214
1315fn main ( ) {
1416 let root_path: PathBuf = env:: args_os ( ) . nth ( 1 ) . expect ( "need path to root of repo" ) . into ( ) ;
@@ -22,45 +24,68 @@ fn main() {
2224
2325 let args: Vec < String > = env:: args ( ) . skip ( 1 ) . collect ( ) ;
2426
25- let mut bad = false ;
2627 let verbose = args. iter ( ) . any ( |s| * s == "--verbose" ) ;
2728
28- // Checks over tests.
29- debug_artifacts:: check ( & src_path, & mut bad) ;
30- ui_tests:: check ( & src_path, & mut bad) ;
31-
32- // Checks that only make sense for the compiler.
33- errors:: check ( & compiler_path, & mut bad) ;
34- error_codes_check:: check ( & src_path, & mut bad) ;
35-
36- // Checks that only make sense for the std libs.
37- pal:: check ( & library_path, & mut bad) ;
38-
39- // Checks that need to be done for both the compiler and std libraries.
40- unit_tests:: check ( & src_path, & mut bad) ;
41- unit_tests:: check ( & compiler_path, & mut bad) ;
42- unit_tests:: check ( & library_path, & mut bad) ;
43-
44- bins:: check ( & src_path, & output_directory, & mut bad) ;
45- bins:: check ( & compiler_path, & output_directory, & mut bad) ;
46- bins:: check ( & library_path, & output_directory, & mut bad) ;
47-
48- style:: check ( & src_path, & mut bad) ;
49- style:: check ( & compiler_path, & mut bad) ;
50- style:: check ( & library_path, & mut bad) ;
51-
52- edition:: check ( & src_path, & mut bad) ;
53- edition:: check ( & compiler_path, & mut bad) ;
54- edition:: check ( & library_path, & mut bad) ;
55-
56- let collected = features:: check ( & src_path, & compiler_path, & library_path, & mut bad, verbose) ;
57- unstable_book:: check ( & src_path, collected, & mut bad) ;
58-
59- // Checks that are done on the cargo workspace.
60- deps:: check ( & root_path, & cargo, & mut bad) ;
61- extdeps:: check ( & root_path, & mut bad) ;
62-
63- if bad {
29+ let bad = std:: sync:: Arc :: new ( AtomicBool :: new ( false ) ) ;
30+
31+ scope ( |s| {
32+ macro_rules! check {
33+ ( $p: ident $( , $args: expr) * ) => {
34+ s. spawn( |_| {
35+ let mut flag = false ;
36+ $p:: check( $( $args) ,* , & mut flag) ;
37+ if ( flag) {
38+ bad. store( true , Ordering :: Relaxed ) ;
39+ }
40+ } ) ;
41+ }
42+ }
43+
44+ // Checks that are done on the cargo workspace.
45+ check ! ( deps, & root_path, & cargo) ;
46+ check ! ( extdeps, & root_path) ;
47+
48+ // Checks over tests.
49+ check ! ( debug_artifacts, & src_path) ;
50+ check ! ( ui_tests, & src_path) ;
51+
52+ // Checks that only make sense for the compiler.
53+ check ! ( errors, & compiler_path) ;
54+ check ! ( error_codes_check, & src_path) ;
55+
56+ // Checks that only make sense for the std libs.
57+ check ! ( pal, & library_path) ;
58+
59+ // Checks that need to be done for both the compiler and std libraries.
60+ check ! ( unit_tests, & src_path) ;
61+ check ! ( unit_tests, & compiler_path) ;
62+ check ! ( unit_tests, & library_path) ;
63+
64+ check ! ( bins, & src_path, & output_directory) ;
65+ check ! ( bins, & compiler_path, & output_directory) ;
66+ check ! ( bins, & library_path, & output_directory) ;
67+
68+ check ! ( style, & src_path) ;
69+ check ! ( style, & compiler_path) ;
70+ check ! ( style, & library_path) ;
71+
72+ check ! ( edition, & src_path) ;
73+ check ! ( edition, & compiler_path) ;
74+ check ! ( edition, & library_path) ;
75+
76+ let collected = {
77+ let mut flag = false ;
78+ let r = features:: check ( & src_path, & compiler_path, & library_path, & mut flag, verbose) ;
79+ if flag {
80+ bad. store ( true , Ordering :: Relaxed ) ;
81+ }
82+ r
83+ } ;
84+ check ! ( unstable_book, & src_path, collected) ;
85+ } )
86+ . unwrap ( ) ;
87+
88+ if bad. load ( Ordering :: Relaxed ) {
6489 eprintln ! ( "some tidy checks failed" ) ;
6590 process:: exit ( 1 ) ;
6691 }
0 commit comments