From 4d56f09650a62485fd9f9414e401e12f03959855 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Thu, 3 Mar 2022 19:48:26 -0600 Subject: [PATCH] Fallback to top-level config.toml if not present in current directory This also preserves the behavior where x.py will only give a hard error on a missing config file if it was configured through `--config` or RUST_BOOTSTRAP_CONFIG. It also removes the top-level fallback for everything except the default path. --- src/bootstrap/bootstrap.py | 12 +++++++----- src/bootstrap/config.rs | 23 +++++++++++++++++------ 2 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py index 1777dae594f8e..71b8f3c4553bc 100644 --- a/src/bootstrap/bootstrap.py +++ b/src/bootstrap/bootstrap.py @@ -1233,16 +1233,18 @@ def bootstrap(help_triggered): build.verbose = args.verbose build.clean = args.clean - # Read from `--config`, then `RUST_BOOTSTRAP_CONFIG`, then fallback to `config.toml` (if it - # exists). + # Read from `--config`, then `RUST_BOOTSTRAP_CONFIG`, then `./config.toml`, + # then `config.toml` in the root directory. toml_path = args.config or os.getenv('RUST_BOOTSTRAP_CONFIG') - if not toml_path and os.path.exists('config.toml'): + using_default_path = toml_path is None + if using_default_path: toml_path = 'config.toml' - - if toml_path: if not os.path.exists(toml_path): toml_path = os.path.join(build.rust_root, toml_path) + # Give a hard error if `--config` or `RUST_BOOTSTRAP_CONFIG` are set to a missing path, + # but not if `config.toml` hasn't been created. + if not using_default_path or os.path.exists(toml_path): with open(toml_path) as config: build.config_toml = config.read() diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs index 73a855ae4d72a..0c0a4733231d2 100644 --- a/src/bootstrap/config.rs +++ b/src/bootstrap/config.rs @@ -647,7 +647,8 @@ impl Config { let get_toml = |file: &Path| { use std::process; - let contents = t!(fs::read_to_string(file), "`include` config not found"); + let contents = + t!(fs::read_to_string(file), format!("config file {} not found", file.display())); match toml::from_str(&contents) { Ok(table) => table, Err(err) => { @@ -657,14 +658,24 @@ impl Config { } }; - // check --config first, then `$RUST_BOOTSTRAP_CONFIG` first, then `config.toml` + // Read from `--config`, then `RUST_BOOTSTRAP_CONFIG`, then `./config.toml`, then `config.toml` in the root directory. let toml_path = flags .config .clone() - .or_else(|| env::var_os("RUST_BOOTSTRAP_CONFIG").map(PathBuf::from)) - .unwrap_or_else(|| PathBuf::from("config.toml")); - let mut toml = - if toml_path.exists() { get_toml(&toml_path) } else { TomlConfig::default() }; + .or_else(|| env::var_os("RUST_BOOTSTRAP_CONFIG").map(PathBuf::from)); + let using_default_path = toml_path.is_none(); + let mut toml_path = toml_path.unwrap_or_else(|| PathBuf::from("config.toml")); + if using_default_path && !toml_path.exists() { + toml_path = config.src.join(toml_path); + } + + // Give a hard error if `--config` or `RUST_BOOTSTRAP_CONFIG` are set to a missing path, + // but not if `config.toml` hasn't been created. + let mut toml = if !using_default_path || toml_path.exists() { + get_toml(&toml_path) + } else { + TomlConfig::default() + }; if let Some(include) = &toml.profile { let mut include_path = config.src.clone();