fix(core): restrict implicit config merge to explicit config files (#2127)

This commit is contained in:
Mg Pig
2026-04-19 10:39:04 +08:00
committed by GitHub
parent 2db655bd6d
commit 40c6de8e31
+39 -9
View File
@@ -788,20 +788,33 @@ impl Cli {
} }
impl NetworkOptions { impl NetworkOptions {
fn can_merge(&self, cfg: &TomlConfigLoader, config_file_count: usize) -> bool { fn can_merge(
&self,
cfg: &TomlConfigLoader,
source: ConfigSource,
explicit_config_file_count: usize,
config_dir_file_count: usize,
) -> bool {
if (*self) == NetworkOptions::default() { if (*self) == NetworkOptions::default() {
return false; return false;
} }
if config_file_count == 1 {
if source == ConfigSource::CliConfigFile
&& explicit_config_file_count == 1
&& config_dir_file_count == 0
{
return true; return true;
} }
let Some(network_name) = &self.network_name else { let Some(network_name) = &self.network_name else {
return false; return false;
}; };
if cfg.get_network_identity().network_name == *network_name {
return true; if source == ConfigSource::ConfigDir {
return cfg.get_network_identity().network_name == *network_name;
} }
false
cfg.get_network_identity().network_name == *network_name
} }
fn merge_into(&self, cfg: &TomlConfigLoader) -> anyhow::Result<()> { fn merge_into(&self, cfg: &TomlConfigLoader) -> anyhow::Result<()> {
@@ -1122,6 +1135,12 @@ impl NetworkOptions {
} }
} }
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
enum ConfigSource {
CliConfigFile,
ConfigDir,
}
impl LoggingConfigLoader for &LoggingOptions { impl LoggingConfigLoader for &LoggingOptions {
fn get_console_logger_config(&self) -> ConsoleLoggerConfig { fn get_console_logger_config(&self) -> ConsoleLoggerConfig {
ConsoleLoggerConfig { ConsoleLoggerConfig {
@@ -1304,8 +1323,13 @@ async fn run_main(cli: Cli) -> anyhow::Result<()> {
None None
}; };
let explicit_config_file_count = cli.config_file.as_ref().map_or(0, |files| files.len());
let mut config_dir_file_count = 0;
let mut config_files = if let Some(v) = cli.config_file { let mut config_files = if let Some(v) = cli.config_file {
v.clone() v.iter()
.cloned()
.map(|path| (path, ConfigSource::CliConfigFile))
.collect()
} else { } else {
vec![] vec![]
}; };
@@ -1326,7 +1350,8 @@ async fn run_main(cli: Cli) -> anyhow::Result<()> {
if ext != "toml" { if ext != "toml" {
continue; continue;
} }
config_files.push(path); config_dir_file_count += 1;
config_files.push((path, ConfigSource::ConfigDir));
} }
} }
let config_file_count = config_files.len(); let config_file_count = config_files.len();
@@ -1339,7 +1364,7 @@ async fn run_main(cli: Cli) -> anyhow::Result<()> {
cli.network_options.network_name.is_some() cli.network_options.network_name.is_some()
} }
}; };
for config_file in config_files { for (config_file, source) in config_files {
let (cfg, mut control) = load_config_from_file( let (cfg, mut control) = load_config_from_file(
&config_file, &config_file,
cli.config_dir.as_ref(), cli.config_dir.as_ref(),
@@ -1347,7 +1372,12 @@ async fn run_main(cli: Cli) -> anyhow::Result<()> {
) )
.await?; .await?;
if cli.network_options.can_merge(&cfg, config_file_count) { if cli.network_options.can_merge(
&cfg,
source,
explicit_config_file_count,
config_dir_file_count,
) {
cli.network_options cli.network_options
.merge_into(&cfg) .merge_into(&cfg)
.with_context(|| format!("failed to merge config from cli: {:?}", config_file))?; .with_context(|| format!("failed to merge config from cli: {:?}", config_file))?;