#![cfg_attr(feature = "deny-warnings", deny(warnings))]
-use clap::{App, Arg, SubCommand};
-use clippy_dev::{fmt, new_lint, ra_setup, serve, stderr_length_check, update_lints};
+use clap::{App, Arg, ArgMatches, SubCommand};
+use clippy_dev::{bless, fmt, new_lint, ra_setup, serve, stderr_length_check, update_lints};
+
+#[cfg(feature = "crater")]
+use clippy_dev::crater;
fn main() {
- let matches = App::new("Clippy developer tooling")
+ let matches = get_clap_config();
+
+ match matches.subcommand() {
+ ("bless", Some(matches)) => {
+ bless::bless(matches.is_present("ignore-timestamp"));
+ },
+ #[cfg(feature = "crater")]
+ ("crater", Some(matches)) => {
+ crater::run(&matches);
+ },
+ ("fmt", Some(matches)) => {
+ fmt::run(matches.is_present("check"), matches.is_present("verbose"));
+ },
+ ("update_lints", Some(matches)) => {
+ if matches.is_present("print-only") {
+ update_lints::print_lints();
+ } else if matches.is_present("check") {
+ update_lints::run(update_lints::UpdateMode::Check);
+ } else {
+ update_lints::run(update_lints::UpdateMode::Change);
+ }
+ },
+ ("new_lint", Some(matches)) => {
+ match new_lint::create(
+ matches.value_of("pass"),
+ matches.value_of("name"),
+ matches.value_of("category"),
+ ) {
+ Ok(_) => update_lints::run(update_lints::UpdateMode::Change),
+ Err(e) => eprintln!("Unable to create lint: {}", e),
+ }
+ },
+ ("limit_stderr_length", _) => {
+ stderr_length_check::check();
+ },
+ ("ra_setup", Some(matches)) => ra_setup::run(matches.value_of("rustc-repo-path")),
+ ("serve", Some(matches)) => {
+ let port = matches.value_of("port").unwrap().parse().unwrap();
+ let lint = matches.value_of("lint");
+ serve::run(port, lint);
+ },
+ _ => {},
+ }
+}
+
+fn get_clap_config<'a>() -> ArgMatches<'a> {
+ #[cfg(feature = "crater")]
+ let crater_sbcmd = SubCommand::with_name("crater")
+ .about("run clippy on a set of crates and check output")
+ .arg(
+ Arg::with_name("only")
+ .takes_value(true)
+ .value_name("CRATE")
+ .long("only")
+ .help("only process a single crate of the list"),
+ );
+
+ let app = App::new("Clippy developer tooling")
+ .subcommand(
+ SubCommand::with_name("bless")
+ .about("bless the test output changes")
+ .arg(
+ Arg::with_name("ignore-timestamp")
+ .long("ignore-timestamp")
+ .help("Include files updated before clippy was built"),
+ ),
+ )
.subcommand(
SubCommand::with_name("fmt")
.about("Run rustfmt on all projects and tests")
.about("Updates lint registration and information from the source code")
.long_about(
"Makes sure that:\n \
- * the lint count in README.md is correct\n \
- * the changelog contains markdown link references at the bottom\n \
- * all lint groups include the correct lints\n \
- * lint modules in `clippy_lints/*` are visible in `src/lib.rs` via `pub mod`\n \
- * all lints are registered in the lint store",
+ * the lint count in README.md is correct\n \
+ * the changelog contains markdown link references at the bottom\n \
+ * all lint groups include the correct lints\n \
+ * lint modules in `clippy_lints/*` are visible in `src/lifb.rs` via `pub mod`\n \
+ * all lints are registered in the lint store",
)
.arg(Arg::with_name("print-only").long("print-only").help(
"Print a table of lints to STDOUT. \
- This does not include deprecated and internal lints. \
- (Does not modify any files)",
+ This does not include deprecated and internal lints. \
+ (Does not modify any files)",
))
.arg(
Arg::with_name("check")
.about("Ensures that stderr files do not grow longer than a certain amount of lines."),
)
.subcommand(
- SubCommand::with_name("ra-setup")
+ SubCommand::with_name("ra_setup")
.about("Alter dependencies so rust-analyzer can find rustc internals")
.arg(
Arg::with_name("rustc-repo-path")
.validator_os(serve::validate_port),
)
.arg(Arg::with_name("lint").help("Which lint's page to load initially (optional)")),
- )
- .get_matches();
+ );
- match matches.subcommand() {
- ("fmt", Some(matches)) => {
- fmt::run(matches.is_present("check"), matches.is_present("verbose"));
- },
- ("update_lints", Some(matches)) => {
- if matches.is_present("print-only") {
- update_lints::print_lints();
- } else if matches.is_present("check") {
- update_lints::run(update_lints::UpdateMode::Check);
- } else {
- update_lints::run(update_lints::UpdateMode::Change);
- }
- },
- ("new_lint", Some(matches)) => {
- match new_lint::create(
- matches.value_of("pass"),
- matches.value_of("name"),
- matches.value_of("category"),
- ) {
- Ok(_) => update_lints::run(update_lints::UpdateMode::Change),
- Err(e) => eprintln!("Unable to create lint: {}", e),
- }
- },
- ("limit_stderr_length", _) => {
- stderr_length_check::check();
- },
- ("ra-setup", Some(matches)) => ra_setup::run(matches.value_of("rustc-repo-path")),
- ("serve", Some(matches)) => {
- let port = matches.value_of("port").unwrap().parse().unwrap();
- let lint = matches.value_of("lint");
- serve::run(port, lint);
- },
- _ => {},
- }
+ #[cfg(feature = "crater")]
+ let app = app.subcommand(crater_sbcmd);
+
+ app.get_matches()
}