Fix CLI arguments without config file

Since we only applied the CLI arguments as overrides to the
configuration file after the file was loaded, all CLI arguments that are
stored on the config would be dropped without a configuration file in
place.

This also makes sure that all configuration file config overrides are
still loaded if the configuration file could not be loaded for any
reason, since there's no reason why we'd just drop everything in that
case.
This commit is contained in:
Christian Duerr 2020-09-20 09:58:39 +00:00 committed by GitHub
parent 56cff18486
commit 539855cdb9
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -97,18 +97,20 @@ impl From<serde_yaml::Error> for Error {
/// Load the configuration file.
pub fn load(options: &Options) -> Config {
// Get config path.
let config_path = match options.config_path().or_else(installed_config) {
Some(path) => path,
None => {
info!(target: LOG_TARGET_CONFIG, "No config file found; using default");
return Config::default();
},
};
// Load config, falling back to the default on error.
let config_options = options.config_options().clone();
let mut config = load_from(&config_path, config_options).unwrap_or_default();
let config_path = options.config_path().or_else(installed_config);
if config_path.is_none() {
info!(target: LOG_TARGET_CONFIG, "No config file found; using default");
}
// Load the config using the following fallback behavior:
// - Config path + CLI overrides
// - CLI overrides
// - Default
let mut config = config_path
.and_then(|config_path| load_from(&config_path, config_options.clone()).ok())
.unwrap_or_else(|| Config::deserialize(config_options).unwrap_or_default());
// Override config with CLI options.
options.override_config(&mut config);