From 3890992d0a9509bfab77659bc23f065ebcd3c2ba Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Mon, 26 Dec 2022 17:53:39 -0600 Subject: [PATCH] Fix panic on `x build --help --verbose` This also makes the panic message a little more informative in case it happens again. --- src/bootstrap/flags.rs | 12 +++++++++++- src/bootstrap/lib.rs | 5 ++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/bootstrap/flags.rs b/src/bootstrap/flags.rs index 851cb5ecf4c26..de39868d692d4 100644 --- a/src/bootstrap/flags.rs +++ b/src/bootstrap/flags.rs @@ -351,7 +351,17 @@ To learn more about a subcommand, run `./x.py -h`", // fn usage() let usage = |exit_code: i32, opts: &Options, verbose: bool, subcommand_help: &str| -> ! { - let config = Config::parse(&["setup".to_string()]); + // We have an unfortunate situation here: some Steps use `builder.in_tree_crates` to determine their paths. + // To determine those crates, we need to run `cargo metadata`, which means we need all submodules to be checked out. + // That takes a while to run, so only do it when paths were explicitly requested, not on all CLI errors. + // `Build::new` won't load submodules for the `setup` command. + let cmd = if verbose { + println!("note: updating submodules before printing available paths"); + "build" + } else { + "setup" + }; + let config = Config::parse(&[cmd.to_string()]); let build = Build::new(config); let paths = Builder::get_help(&build, subcommand); diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index f84fcd21cfcfe..ced1e397807e4 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -1400,7 +1400,10 @@ impl Build { let mut list = vec![INTERNER.intern_str(root)]; let mut visited = HashSet::new(); while let Some(krate) = list.pop() { - let krate = &self.crates[&krate]; + let krate = self + .crates + .get(&krate) + .unwrap_or_else(|| panic!("metadata missing for {krate}: {:?}", self.crates)); ret.push(krate); for dep in &krate.deps { if !self.crates.contains_key(dep) {