]> git.lizzy.rs Git - rust.git/blob - clippy_dev/src/main.rs
Updated `cargo dev setup intellij` for cleaner user messages
[rust.git] / clippy_dev / src / main.rs
1 #![cfg_attr(feature = "deny-warnings", deny(warnings))]
2 // warn on lints, that are included in `rust-lang/rust`s bootstrap
3 #![warn(rust_2018_idioms, unused_lifetimes)]
4
5 use clap::{App, AppSettings, Arg, ArgMatches, SubCommand};
6 use clippy_dev::{bless, fmt, new_lint, serve, setup, stderr_length_check, update_lints};
7 fn main() {
8     let matches = get_clap_config();
9
10     match matches.subcommand() {
11         ("bless", Some(matches)) => {
12             bless::bless(matches.is_present("ignore-timestamp"));
13         },
14         ("fmt", Some(matches)) => {
15             fmt::run(matches.is_present("check"), matches.is_present("verbose"));
16         },
17         ("update_lints", Some(matches)) => {
18             if matches.is_present("print-only") {
19                 update_lints::print_lints();
20             } else if matches.is_present("check") {
21                 update_lints::run(update_lints::UpdateMode::Check);
22             } else {
23                 update_lints::run(update_lints::UpdateMode::Change);
24             }
25         },
26         ("new_lint", Some(matches)) => {
27             match new_lint::create(
28                 matches.value_of("pass"),
29                 matches.value_of("name"),
30                 matches.value_of("category"),
31             ) {
32                 Ok(_) => update_lints::run(update_lints::UpdateMode::Change),
33                 Err(e) => eprintln!("Unable to create lint: {}", e),
34             }
35         },
36         ("limit_stderr_length", _) => {
37             stderr_length_check::check();
38         },
39         ("setup", Some(sub_command)) => match sub_command.subcommand() {
40             ("intellij", Some(matches)) => setup::intellij::setup_rustc_src(
41                 matches
42                     .value_of("rustc-repo-path")
43                     .expect("this field is mandatory and therefore always valid"),
44             ),
45             ("git-hook", Some(matches)) => setup::git_hook::install_hook(matches.is_present("force-override")),
46             _ => {},
47         },
48         ("remove", Some(sub_command)) => {
49             if let ("git-hook", Some(_)) = sub_command.subcommand() {
50                 setup::git_hook::remove_hook();
51             }
52         },
53         ("serve", Some(matches)) => {
54             let port = matches.value_of("port").unwrap().parse().unwrap();
55             let lint = matches.value_of("lint");
56             serve::run(port, lint);
57         },
58         _ => {},
59     }
60 }
61
62 fn get_clap_config<'a>() -> ArgMatches<'a> {
63     App::new("Clippy developer tooling")
64         .setting(AppSettings::ArgRequiredElseHelp)
65         .subcommand(
66             SubCommand::with_name("bless")
67                 .about("bless the test output changes")
68                 .arg(
69                     Arg::with_name("ignore-timestamp")
70                         .long("ignore-timestamp")
71                         .help("Include files updated before clippy was built"),
72                 ),
73         )
74         .subcommand(
75             SubCommand::with_name("fmt")
76                 .about("Run rustfmt on all projects and tests")
77                 .arg(
78                     Arg::with_name("check")
79                         .long("check")
80                         .help("Use the rustfmt --check option"),
81                 )
82                 .arg(
83                     Arg::with_name("verbose")
84                         .short("v")
85                         .long("verbose")
86                         .help("Echo commands run"),
87                 ),
88         )
89         .subcommand(
90             SubCommand::with_name("update_lints")
91                 .about("Updates lint registration and information from the source code")
92                 .long_about(
93                     "Makes sure that:\n \
94                  * the lint count in README.md is correct\n \
95                  * the changelog contains markdown link references at the bottom\n \
96                  * all lint groups include the correct lints\n \
97                  * lint modules in `clippy_lints/*` are visible in `src/lifb.rs` via `pub mod`\n \
98                  * all lints are registered in the lint store",
99                 )
100                 .arg(Arg::with_name("print-only").long("print-only").help(
101                     "Print a table of lints to STDOUT. \
102                  This does not include deprecated and internal lints. \
103                  (Does not modify any files)",
104                 ))
105                 .arg(
106                     Arg::with_name("check")
107                         .long("check")
108                         .help("Checks that `cargo dev update_lints` has been run. Used on CI."),
109                 ),
110         )
111         .subcommand(
112             SubCommand::with_name("new_lint")
113                 .about("Create new lint and run `cargo dev update_lints`")
114                 .arg(
115                     Arg::with_name("pass")
116                         .short("p")
117                         .long("pass")
118                         .help("Specify whether the lint runs during the early or late pass")
119                         .takes_value(true)
120                         .possible_values(&["early", "late"])
121                         .required(true),
122                 )
123                 .arg(
124                     Arg::with_name("name")
125                         .short("n")
126                         .long("name")
127                         .help("Name of the new lint in snake case, ex: fn_too_long")
128                         .takes_value(true)
129                         .required(true),
130                 )
131                 .arg(
132                     Arg::with_name("category")
133                         .short("c")
134                         .long("category")
135                         .help("What category the lint belongs to")
136                         .default_value("nursery")
137                         .possible_values(&[
138                             "style",
139                             "correctness",
140                             "complexity",
141                             "perf",
142                             "pedantic",
143                             "restriction",
144                             "cargo",
145                             "nursery",
146                             "internal",
147                             "internal_warn",
148                         ])
149                         .takes_value(true),
150                 ),
151         )
152         .subcommand(
153             SubCommand::with_name("limit_stderr_length")
154                 .about("Ensures that stderr files do not grow longer than a certain amount of lines."),
155         )
156         .subcommand(
157             SubCommand::with_name("setup")
158                 .about("Support for setting up your personal development environment")
159                 .setting(AppSettings::ArgRequiredElseHelp)
160                 .subcommand(
161                     SubCommand::with_name("intellij")
162                         .about("Alter dependencies so Intellij Rust can find rustc internals")
163                         .arg(
164                             Arg::with_name("rustc-repo-path")
165                                 .long("repo-path")
166                                 .short("r")
167                                 .help("The path to a rustc repo that will be used for setting the dependencies")
168                                 .takes_value(true)
169                                 .value_name("path")
170                                 .required(true),
171                         ),
172                 )
173                 .subcommand(
174                     SubCommand::with_name("git-hook")
175                         .about("Add a pre-commit git hook that formats your code to make it look pretty")
176                         .arg(
177                             Arg::with_name("force-override")
178                                 .long("force-override")
179                                 .short("f")
180                                 .help("Forces the override of an existing git pre-commit hook")
181                                 .required(false),
182                         ),
183                 ),
184         )
185         .subcommand(
186             SubCommand::with_name("remove")
187                 .about("Support for undoing changes done by the setup command")
188                 .setting(AppSettings::ArgRequiredElseHelp)
189                 .subcommand(SubCommand::with_name("git-hook").about("Remove any existing pre-commit git hook")),
190         )
191         .subcommand(
192             SubCommand::with_name("serve")
193                 .about("Launch a local 'ALL the Clippy Lints' website in a browser")
194                 .arg(
195                     Arg::with_name("port")
196                         .long("port")
197                         .short("p")
198                         .help("Local port for the http server")
199                         .default_value("8000")
200                         .validator_os(serve::validate_port),
201                 )
202                 .arg(Arg::with_name("lint").help("Which lint's page to load initially (optional)")),
203         )
204         .get_matches()
205 }