diff --git a/src/config.rs b/src/config.rs index d99822a1602..969323a8f2e 100644 --- a/src/config.rs +++ b/src/config.rs @@ -112,6 +112,7 @@ pub struct Cfg { pub profile_override: Option, pub rustup_dir: PathBuf, pub settings_file: SettingsFile, + pub fallback_settings: Option, pub toolchains_dir: PathBuf, pub update_hash_dir: PathBuf, pub download_dir: PathBuf, @@ -133,6 +134,20 @@ impl Cfg { let settings_file = SettingsFile::new(rustup_dir.join("settings.toml")); + // Centralised file for multi-user systems to provide admin/distributor set initial values. + let fallback_settings = if cfg!(not(windows)) { + let f = SettingsFile::new(PathBuf::from("/etc/rustup/settings.toml")); + // Users cannot fix issues with missing/unreadable/invalid centralised files, so we simply trap all errors. + // Ideally we would separate these into missing file vs others, so that we could log a message about the bad + // situation rather than entirely ignoring it. + match f.with(|s| Ok(Some(s.clone()))) { + Ok(res) => res, + Err(_) => None, + } + } else { + None + }; + let toolchains_dir = rustup_dir.join("toolchains"); let update_hash_dir = rustup_dir.join("update-hashes"); let download_dir = rustup_dir.join("downloads"); @@ -191,6 +206,7 @@ impl Cfg { profile_override: None, rustup_dir, settings_file, + fallback_settings, toolchains_dir, update_hash_dir, download_dir, @@ -365,9 +381,7 @@ impl Cfg { } pub fn find_default(&self) -> Result>> { - let opt_name = self - .settings_file - .with(|s| Ok(s.default_toolchain.clone()))?; + let opt_name = self.get_default()?; if let Some(name) = opt_name { let toolchain = self @@ -509,7 +523,14 @@ impl Cfg { } pub fn get_default(&self) -> Result> { - self.settings_file.with(|s| Ok(s.default_toolchain.clone())) + let user_opt = self.settings_file.with(|s| Ok(s.default_toolchain.clone())); + if let Some(fallback_settings) = &self.fallback_settings { + match user_opt { + Err(_) | Ok(None) => return Ok(fallback_settings.default_toolchain.clone()), + _ => {} + }; + }; + user_opt } pub fn list_toolchains(&self) -> Result> {