RIIR update lints: Add check mode (update_lints.py rewrite complete)
This finishes up the rewrite of `update_lints.py` in Rust. More
specifically, this
* adds the `--check` flag and handling to clippy_dev
* tracks file changes over the different calls to `replace_region_in_file`
* only writes changes to files if the `--check` flag is *not* used
* runs `./util/dev update_lints --check` on CI instead of the old script
* replaces usage of the `update_lints.py` script with an error
`./util/dev update_lints` behaves 99% the same as the python script.
The only difference that I'm aware of is an ordering change to
`clippy_lints/src/lib.rs` because underscores seem to be sorted
differently in Rust and in Python.
🏁
This commit is contained in:
@@ -15,6 +15,12 @@ extern crate regex;
|
||||
use clap::{App, Arg, SubCommand};
|
||||
use clippy_dev::*;
|
||||
|
||||
#[derive(PartialEq)]
|
||||
enum UpdateMode {
|
||||
Check,
|
||||
Change
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let matches = App::new("Clippy developer tooling")
|
||||
.subcommand(
|
||||
@@ -28,17 +34,23 @@ fn main() {
|
||||
.arg(
|
||||
Arg::with_name("print-only")
|
||||
.long("print-only")
|
||||
.short("p")
|
||||
.help("Print a table of lints to STDOUT. This does not include deprecated and internal lints. (Does not modify any files)"),
|
||||
.help("Print a table of lints to STDOUT. This does not include deprecated and internal lints. (Does not modify any files)")
|
||||
)
|
||||
)
|
||||
.get_matches();
|
||||
.arg(
|
||||
Arg::with_name("check")
|
||||
.long("check")
|
||||
.help("Checks that util/dev update_lints has been run. Used on CI."),
|
||||
)
|
||||
)
|
||||
.get_matches();
|
||||
|
||||
if let Some(matches) = matches.subcommand_matches("update_lints") {
|
||||
if matches.is_present("print-only") {
|
||||
print_lints();
|
||||
} else if matches.is_present("check") {
|
||||
update_lints(UpdateMode::Check);
|
||||
} else {
|
||||
update_lints();
|
||||
update_lints(UpdateMode::Change);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -63,53 +75,58 @@ fn print_lints() {
|
||||
println!("there are {} lints", lint_count);
|
||||
}
|
||||
|
||||
fn update_lints() {
|
||||
fn update_lints(update_mode: UpdateMode) {
|
||||
let lint_list: Vec<Lint> = gather_all().collect();
|
||||
let usable_lints: Vec<Lint> = Lint::usable_lints(lint_list.clone().into_iter()).collect();
|
||||
let lint_count = usable_lints.len();
|
||||
|
||||
replace_region_in_file(
|
||||
let mut file_change = replace_region_in_file(
|
||||
"../README.md",
|
||||
r#"\[There are \d+ lints included in this crate!\]\(https://rust-lang-nursery.github.io/rust-clippy/master/index.html\)"#,
|
||||
"",
|
||||
true,
|
||||
update_mode == UpdateMode::Change,
|
||||
|| {
|
||||
vec", lint_count)
|
||||
]
|
||||
}
|
||||
);
|
||||
).changed;
|
||||
|
||||
replace_region_in_file(
|
||||
file_change |= replace_region_in_file(
|
||||
"../CHANGELOG.md",
|
||||
"<!-- begin autogenerated links to lint list -->",
|
||||
"<!-- end autogenerated links to lint list -->",
|
||||
false,
|
||||
update_mode == UpdateMode::Change,
|
||||
|| { gen_changelog_lint_list(lint_list.clone()) }
|
||||
);
|
||||
).changed;
|
||||
|
||||
replace_region_in_file(
|
||||
file_change |= replace_region_in_file(
|
||||
"../clippy_lints/src/lib.rs",
|
||||
"begin deprecated lints",
|
||||
"end deprecated lints",
|
||||
false,
|
||||
update_mode == UpdateMode::Change,
|
||||
|| { gen_deprecated(&lint_list) }
|
||||
);
|
||||
).changed;
|
||||
|
||||
replace_region_in_file(
|
||||
file_change |= replace_region_in_file(
|
||||
"../clippy_lints/src/lib.rs",
|
||||
"begin lints modules",
|
||||
"end lints modules",
|
||||
false,
|
||||
update_mode == UpdateMode::Change,
|
||||
|| { gen_modules_list(lint_list.clone()) }
|
||||
);
|
||||
).changed;
|
||||
|
||||
// Generate lists of lints in the clippy::all lint group
|
||||
replace_region_in_file(
|
||||
file_change |= replace_region_in_file(
|
||||
"../clippy_lints/src/lib.rs",
|
||||
r#"reg.register_lint_group\("clippy::all""#,
|
||||
r#"\]\);"#,
|
||||
false,
|
||||
update_mode == UpdateMode::Change,
|
||||
|| {
|
||||
// clippy::all should only include the following lint groups:
|
||||
let all_group_lints = usable_lints.clone().into_iter().filter(|l| {
|
||||
@@ -121,16 +138,22 @@ fn update_lints() {
|
||||
|
||||
gen_lint_group_list(all_group_lints)
|
||||
}
|
||||
);
|
||||
).changed;
|
||||
|
||||
// Generate the list of lints for all other lint groups
|
||||
for (lint_group, lints) in Lint::by_lint_group(&usable_lints) {
|
||||
replace_region_in_file(
|
||||
file_change |= replace_region_in_file(
|
||||
"../clippy_lints/src/lib.rs",
|
||||
&format!("reg.register_lint_group\\(\"clippy::{}\"", lint_group),
|
||||
r#"\]\);"#,
|
||||
false,
|
||||
update_mode == UpdateMode::Change,
|
||||
|| { gen_lint_group_list(lints.clone()) }
|
||||
);
|
||||
).changed;
|
||||
}
|
||||
|
||||
if update_mode == UpdateMode::Check && file_change {
|
||||
println!("Not all lints defined properly. Please run util/dev update_lints to make sure all lints are defined properly.");
|
||||
std::process::exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user