Rollup merge of #76800 - jyn514:usage, r=Mark-Simulacrum
Don't generate bootstrap usage unless it's needed Previously, `x.py` would unconditionally run `x.py build` to get the help message. After https://github.com/rust-lang/rust/issues/76165, when checking the CI stage was moved into `Config`, that would cause an assertion failure (but only only in CI!): ``` thread 'main' panicked at 'assertion failed: `(left == right)` left: `1`, right: `2`', src/bootstrap/config.rs:619:49 ``` This changes bootstrap to only generate a help message when it needs to (when someone passes `--help`). r? @Mark-Simulacrum This should fix the CI failures in https://github.com/rust-lang/rust/pull/76797 and https://github.com/rust-lang/rust/pull/75991.
This commit is contained in:
commit
b603143c9e
@ -98,7 +98,6 @@ impl Default for Subcommand {
|
|||||||
|
|
||||||
impl Flags {
|
impl Flags {
|
||||||
pub fn parse(args: &[String]) -> Flags {
|
pub fn parse(args: &[String]) -> Flags {
|
||||||
let mut extra_help = String::new();
|
|
||||||
let mut subcommand_help = String::from(
|
let mut subcommand_help = String::from(
|
||||||
"\
|
"\
|
||||||
Usage: x.py <subcommand> [options] [<paths>...]
|
Usage: x.py <subcommand> [options] [<paths>...]
|
||||||
@ -170,16 +169,6 @@ To learn more about a subcommand, run `./x.py <subcommand> -h`",
|
|||||||
"VALUE",
|
"VALUE",
|
||||||
);
|
);
|
||||||
|
|
||||||
// fn usage()
|
|
||||||
let usage =
|
|
||||||
|exit_code: i32, opts: &Options, subcommand_help: &str, extra_help: &str| -> ! {
|
|
||||||
println!("{}", opts.usage(subcommand_help));
|
|
||||||
if !extra_help.is_empty() {
|
|
||||||
println!("{}", extra_help);
|
|
||||||
}
|
|
||||||
process::exit(exit_code);
|
|
||||||
};
|
|
||||||
|
|
||||||
// We can't use getopt to parse the options until we have completed specifying which
|
// We can't use getopt to parse the options until we have completed specifying which
|
||||||
// options are valid, but under the current implementation, some options are conditional on
|
// options are valid, but under the current implementation, some options are conditional on
|
||||||
// the subcommand. Therefore we must manually identify the subcommand first, so that we can
|
// the subcommand. Therefore we must manually identify the subcommand first, so that we can
|
||||||
@ -263,12 +252,38 @@ To learn more about a subcommand, run `./x.py <subcommand> -h`",
|
|||||||
_ => {}
|
_ => {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// fn usage()
|
||||||
|
let usage = |exit_code: i32, opts: &Options, verbose: bool, subcommand_help: &str| -> ! {
|
||||||
|
let mut extra_help = String::new();
|
||||||
|
|
||||||
|
// All subcommands except `clean` can have an optional "Available paths" section
|
||||||
|
if verbose {
|
||||||
|
let config = Config::parse(&["build".to_string()]);
|
||||||
|
let build = Build::new(config);
|
||||||
|
|
||||||
|
let maybe_rules_help = Builder::get_help(&build, subcommand.as_str());
|
||||||
|
extra_help.push_str(maybe_rules_help.unwrap_or_default().as_str());
|
||||||
|
} else if !(subcommand.as_str() == "clean" || subcommand.as_str() == "fmt") {
|
||||||
|
extra_help.push_str(
|
||||||
|
format!("Run `./x.py {} -h -v` to see a list of available paths.", subcommand)
|
||||||
|
.as_str(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
println!("{}", opts.usage(subcommand_help));
|
||||||
|
if !extra_help.is_empty() {
|
||||||
|
println!("{}", extra_help);
|
||||||
|
}
|
||||||
|
process::exit(exit_code);
|
||||||
|
};
|
||||||
|
|
||||||
// Done specifying what options are possible, so do the getopts parsing
|
// Done specifying what options are possible, so do the getopts parsing
|
||||||
let matches = opts.parse(&args[..]).unwrap_or_else(|e| {
|
let matches = opts.parse(&args[..]).unwrap_or_else(|e| {
|
||||||
// Invalid argument/option format
|
// Invalid argument/option format
|
||||||
println!("\n{}\n", e);
|
println!("\n{}\n", e);
|
||||||
usage(1, &opts, &subcommand_help, &extra_help);
|
usage(1, &opts, false, &subcommand_help);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Extra sanity check to make sure we didn't hit this crazy corner case:
|
// Extra sanity check to make sure we didn't hit this crazy corner case:
|
||||||
//
|
//
|
||||||
// ./x.py --frobulate clean build
|
// ./x.py --frobulate clean build
|
||||||
@ -436,24 +451,11 @@ Arguments:
|
|||||||
let paths = matches.free[1..].iter().map(|p| p.into()).collect::<Vec<PathBuf>>();
|
let paths = matches.free[1..].iter().map(|p| p.into()).collect::<Vec<PathBuf>>();
|
||||||
|
|
||||||
let cfg_file = env::var_os("BOOTSTRAP_CONFIG").map(PathBuf::from);
|
let cfg_file = env::var_os("BOOTSTRAP_CONFIG").map(PathBuf::from);
|
||||||
|
let verbose = matches.opt_present("verbose");
|
||||||
// All subcommands except `clean` can have an optional "Available paths" section
|
|
||||||
if matches.opt_present("verbose") {
|
|
||||||
let config = Config::parse(&["build".to_string()]);
|
|
||||||
let build = Build::new(config);
|
|
||||||
|
|
||||||
let maybe_rules_help = Builder::get_help(&build, subcommand.as_str());
|
|
||||||
extra_help.push_str(maybe_rules_help.unwrap_or_default().as_str());
|
|
||||||
} else if !(subcommand.as_str() == "clean" || subcommand.as_str() == "fmt") {
|
|
||||||
extra_help.push_str(
|
|
||||||
format!("Run `./x.py {} -h -v` to see a list of available paths.", subcommand)
|
|
||||||
.as_str(),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// User passed in -h/--help?
|
// User passed in -h/--help?
|
||||||
if matches.opt_present("help") {
|
if matches.opt_present("help") {
|
||||||
usage(0, &opts, &subcommand_help, &extra_help);
|
usage(0, &opts, verbose, &subcommand_help);
|
||||||
}
|
}
|
||||||
|
|
||||||
let cmd = match subcommand.as_str() {
|
let cmd = match subcommand.as_str() {
|
||||||
@ -483,7 +485,7 @@ Arguments:
|
|||||||
"clean" => {
|
"clean" => {
|
||||||
if !paths.is_empty() {
|
if !paths.is_empty() {
|
||||||
println!("\nclean does not take a path argument\n");
|
println!("\nclean does not take a path argument\n");
|
||||||
usage(1, &opts, &subcommand_help, &extra_help);
|
usage(1, &opts, verbose, &subcommand_help);
|
||||||
}
|
}
|
||||||
|
|
||||||
Subcommand::Clean { all: matches.opt_present("all") }
|
Subcommand::Clean { all: matches.opt_present("all") }
|
||||||
@ -494,12 +496,12 @@ Arguments:
|
|||||||
"run" | "r" => {
|
"run" | "r" => {
|
||||||
if paths.is_empty() {
|
if paths.is_empty() {
|
||||||
println!("\nrun requires at least a path!\n");
|
println!("\nrun requires at least a path!\n");
|
||||||
usage(1, &opts, &subcommand_help, &extra_help);
|
usage(1, &opts, verbose, &subcommand_help);
|
||||||
}
|
}
|
||||||
Subcommand::Run { paths }
|
Subcommand::Run { paths }
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
usage(1, &opts, &subcommand_help, &extra_help);
|
usage(1, &opts, verbose, &subcommand_help);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user