Skip to content

Commit

Permalink
Fix panic on x build --help --verbose
Browse files Browse the repository at this point in the history
This also makes the panic message a little more informative in case it
happens again.
  • Loading branch information
jyn514 committed Dec 26, 2022
1 parent 88c58e3 commit 3890992
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 2 deletions.
12 changes: 11 additions & 1 deletion src/bootstrap/flags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -351,7 +351,17 @@ 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 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);

Expand Down
5 changes: 4 additions & 1 deletion src/bootstrap/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit 3890992

Please sign in to comment.