parallelize tidy checks
This commit is contained in:
parent
5233edcf1c
commit
77d1185f00
@ -5239,6 +5239,7 @@ name = "tidy"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"cargo_metadata 0.11.1",
|
||||
"crossbeam-utils 0.8.0",
|
||||
"lazy_static",
|
||||
"regex",
|
||||
"walkdir",
|
||||
|
@ -10,6 +10,7 @@ cargo_metadata = "0.11"
|
||||
regex = "1"
|
||||
lazy_static = "1"
|
||||
walkdir = "2"
|
||||
crossbeam-utils = "0.8.0"
|
||||
|
||||
[[bin]]
|
||||
name = "rust-tidy"
|
||||
|
@ -32,9 +32,12 @@ fn is_executable(path: &Path) -> std::io::Result<bool> {
|
||||
// readily create a file there to test.
|
||||
//
|
||||
// See #36706 and #74753 for context.
|
||||
let mut temp_path = path.join("tidy-test-file");
|
||||
//
|
||||
// We also add the thread ID to avoid threads trampling on each others files.
|
||||
let file_name = format!("t{}.tidy-test-file", std::thread::current().id().as_u64());
|
||||
let mut temp_path = path.join(&file_name);
|
||||
match fs::File::create(&temp_path).or_else(|_| {
|
||||
temp_path = output.join("tidy-test-file");
|
||||
temp_path = output.join(&file_name);
|
||||
fs::File::create(&temp_path)
|
||||
}) {
|
||||
Ok(file) => {
|
||||
|
@ -4,6 +4,7 @@
|
||||
//! to be used by tools.
|
||||
|
||||
#![cfg_attr(bootstrap, feature(str_split_once))]
|
||||
#![feature(thread_id_value)]
|
||||
|
||||
use std::fs::File;
|
||||
use std::io::Read;
|
||||
@ -54,6 +55,12 @@ macro_rules! tidy_error {
|
||||
pub mod unstable_book;
|
||||
|
||||
fn filter_dirs(path: &Path) -> bool {
|
||||
// Filter out temporary files used by the bins module to probe the filesystem
|
||||
match path.extension() {
|
||||
Some(ext) if ext == "tidy-test-file" => return true,
|
||||
_ => {}
|
||||
}
|
||||
|
||||
let skip = [
|
||||
"compiler/rustc_codegen_cranelift",
|
||||
"src/llvm-project",
|
||||
|
@ -6,9 +6,11 @@
|
||||
|
||||
use tidy::*;
|
||||
|
||||
use crossbeam_utils::thread::scope;
|
||||
use std::env;
|
||||
use std::path::PathBuf;
|
||||
use std::process;
|
||||
use std::sync::atomic::{AtomicBool, Ordering};
|
||||
|
||||
fn main() {
|
||||
let root_path: PathBuf = env::args_os().nth(1).expect("need path to root of repo").into();
|
||||
@ -22,45 +24,68 @@ fn main() {
|
||||
|
||||
let args: Vec<String> = env::args().skip(1).collect();
|
||||
|
||||
let mut bad = false;
|
||||
let verbose = args.iter().any(|s| *s == "--verbose");
|
||||
|
||||
// Checks over tests.
|
||||
debug_artifacts::check(&src_path, &mut bad);
|
||||
ui_tests::check(&src_path, &mut bad);
|
||||
let bad = std::sync::Arc::new(AtomicBool::new(false));
|
||||
|
||||
// Checks that only make sense for the compiler.
|
||||
errors::check(&compiler_path, &mut bad);
|
||||
error_codes_check::check(&src_path, &mut bad);
|
||||
scope(|s| {
|
||||
macro_rules! check {
|
||||
($p:ident $(, $args:expr)* ) => {
|
||||
s.spawn(|_| {
|
||||
let mut flag = false;
|
||||
$p::check($($args),* , &mut flag);
|
||||
if (flag) {
|
||||
bad.store(true, Ordering::Relaxed);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Checks that only make sense for the std libs.
|
||||
pal::check(&library_path, &mut bad);
|
||||
// Checks that are done on the cargo workspace.
|
||||
check!(deps, &root_path, &cargo);
|
||||
check!(extdeps, &root_path);
|
||||
|
||||
// Checks that need to be done for both the compiler and std libraries.
|
||||
unit_tests::check(&src_path, &mut bad);
|
||||
unit_tests::check(&compiler_path, &mut bad);
|
||||
unit_tests::check(&library_path, &mut bad);
|
||||
// Checks over tests.
|
||||
check!(debug_artifacts, &src_path);
|
||||
check!(ui_tests, &src_path);
|
||||
|
||||
bins::check(&src_path, &output_directory, &mut bad);
|
||||
bins::check(&compiler_path, &output_directory, &mut bad);
|
||||
bins::check(&library_path, &output_directory, &mut bad);
|
||||
// Checks that only make sense for the compiler.
|
||||
check!(errors, &compiler_path);
|
||||
check!(error_codes_check, &src_path);
|
||||
|
||||
style::check(&src_path, &mut bad);
|
||||
style::check(&compiler_path, &mut bad);
|
||||
style::check(&library_path, &mut bad);
|
||||
// Checks that only make sense for the std libs.
|
||||
check!(pal, &library_path);
|
||||
|
||||
edition::check(&src_path, &mut bad);
|
||||
edition::check(&compiler_path, &mut bad);
|
||||
edition::check(&library_path, &mut bad);
|
||||
// Checks that need to be done for both the compiler and std libraries.
|
||||
check!(unit_tests, &src_path);
|
||||
check!(unit_tests, &compiler_path);
|
||||
check!(unit_tests, &library_path);
|
||||
|
||||
let collected = features::check(&src_path, &compiler_path, &library_path, &mut bad, verbose);
|
||||
unstable_book::check(&src_path, collected, &mut bad);
|
||||
check!(bins, &src_path, &output_directory);
|
||||
check!(bins, &compiler_path, &output_directory);
|
||||
check!(bins, &library_path, &output_directory);
|
||||
|
||||
// Checks that are done on the cargo workspace.
|
||||
deps::check(&root_path, &cargo, &mut bad);
|
||||
extdeps::check(&root_path, &mut bad);
|
||||
check!(style, &src_path);
|
||||
check!(style, &compiler_path);
|
||||
check!(style, &library_path);
|
||||
|
||||
if bad {
|
||||
check!(edition, &src_path);
|
||||
check!(edition, &compiler_path);
|
||||
check!(edition, &library_path);
|
||||
|
||||
let collected = {
|
||||
let mut flag = false;
|
||||
let r = features::check(&src_path, &compiler_path, &library_path, &mut flag, verbose);
|
||||
if flag {
|
||||
bad.store(true, Ordering::Relaxed);
|
||||
}
|
||||
r
|
||||
};
|
||||
check!(unstable_book, &src_path, collected);
|
||||
})
|
||||
.unwrap();
|
||||
|
||||
if bad.load(Ordering::Relaxed) {
|
||||
eprintln!("some tidy checks failed");
|
||||
process::exit(1);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user