in eden/mononoke/metaconfig/parser/src/config.rs [98:328]
fn parse_with_repo_definition(
repo_definition: RawRepoDefinition,
named_repo_configs: &HashMap<String, RawRepoConfig>,
named_storage_configs: &HashMap<String, RawStorageConfig>,
named_acl_region_configs: &HashMap<String, RawAclRegionConfig>,
) -> Result<RepoConfig> {
let RawRepoDefinition {
repo_id: repoid,
backup_source_repo_name,
repo_name,
repo_config,
write_lock_db_address,
hipster_acl,
enabled,
readonly,
needs_backup: _,
external_repo_id: _,
acl_region_config,
} = repo_definition;
let named_repo_config_name = repo_config
.clone()
.ok_or_else(|| ConfigurationError::InvalidConfig(format!("No named_repo_config")))?;
let named_repo_config = named_repo_configs
.get(named_repo_config_name.as_str())
.ok_or_else(|| {
ConfigurationError::InvalidConfig(format!(
"no named_repo_config \"{}\" for repo \"{:?}\".",
named_repo_config_name, repo_name
))
})?
.clone();
let reponame = repo_name.ok_or_else(|| {
ConfigurationError::InvalidConfig(format!("No repo_name in repo_definition"))
})?;
let backup_repo_config = if let Some(backup_source_repo_name) = backup_source_repo_name {
if backup_source_repo_name != reponame {
Some(BackupRepoConfig {
source_repo_name: backup_source_repo_name,
})
} else {
None
}
} else {
None
};
let RawRepoConfig {
storage_config,
storage,
bookmarks,
hook_manager_params,
hooks,
redaction,
generation_cache_size,
scuba_table_hooks,
cache_warmup,
push,
pushrebase,
lfs,
hash_validation_percentage,
skiplist_index_blobstore_key,
bundle2_replay_params,
infinitepush,
list_keys_patterns_max,
filestore,
hook_max_file_size,
source_control_service,
source_control_service_monitoring,
derived_data_config,
scuba_local_path_hooks,
hgsql_name,
hgsql_globalrevs_name,
enforce_lfs_acl_check,
repo_client_use_warm_bookmarks_cache,
segmented_changelog_config,
repo_client_knobs,
phabricator_callsign,
..
} = named_repo_config;
let named_storage_config = storage_config;
let repoid = RepositoryId::new(repoid.context("missing repoid from configuration")?);
let enabled = enabled.unwrap_or(true);
let hooks: Vec<_> = hooks.unwrap_or_default().convert()?;
let get_storage = move |name: &str| -> Result<StorageConfig> {
let raw_storage_config = storage
.as_ref()
.and_then(|s| s.get(name))
.or_else(|| named_storage_configs.get(name))
.cloned()
.ok_or_else(|| {
ConfigurationError::InvalidConfig(format!("Storage \"{}\" not defined", name))
})?;
raw_storage_config.convert()
};
let storage_config = get_storage(
&named_storage_config
.ok_or_else(|| anyhow!("missing storage_config from configuration"))?,
)?;
let cache_warmup = cache_warmup.convert()?;
let hook_manager_params = hook_manager_params.convert()?;
let bookmarks = bookmarks.unwrap_or_default().convert()?;
let push = push.convert()?.unwrap_or_default();
let pushrebase = pushrebase.convert()?.unwrap_or_default();
let bundle2_replay_params = bundle2_replay_params.convert()?.unwrap_or_default();
let lfs = lfs.convert()?.unwrap_or_default();
let hash_validation_percentage = hash_validation_percentage
.map(|v| v.try_into())
.transpose()?
.unwrap_or(0);
let readonly = if readonly.unwrap_or_default() {
RepoReadOnly::ReadOnly("Set by config option".to_string())
} else {
RepoReadOnly::ReadWrite
};
let redaction = if redaction.unwrap_or(true) {
Redaction::Enabled
} else {
Redaction::Disabled
};
let infinitepush = infinitepush.convert()?.unwrap_or_default();
let generation_cache_size: usize = generation_cache_size
.map(|v| v.try_into())
.transpose()?
.unwrap_or(10 * 1024 * 1024);
let list_keys_patterns_max: u64 = list_keys_patterns_max
.map(|v| v.try_into())
.transpose()?
.unwrap_or(LIST_KEYS_PATTERNS_MAX_DEFAULT);
let hook_max_file_size: u64 = hook_max_file_size
.map(|v| v.try_into())
.transpose()?
.unwrap_or(HOOK_MAX_FILE_SIZE_DEFAULT);
let filestore = filestore.convert()?;
let source_control_service = source_control_service.convert()?.unwrap_or_default();
let source_control_service_monitoring = source_control_service_monitoring.convert()?;
let derived_data_config = derived_data_config.convert()?.unwrap_or_default();
// XXX only www has it explicitly specified.
let hgsql_name = HgsqlName(hgsql_name.unwrap_or_else(|| reponame.to_string()));
let hgsql_globalrevs_name =
HgsqlGlobalrevsName(hgsql_globalrevs_name.unwrap_or_else(|| hgsql_name.0.clone()));
let enforce_lfs_acl_check = enforce_lfs_acl_check.unwrap_or(false);
let repo_client_use_warm_bookmarks_cache =
repo_client_use_warm_bookmarks_cache.unwrap_or(false);
let segmented_changelog_config = segmented_changelog_config.convert()?.unwrap_or_default();
let repo_client_knobs = repo_client_knobs.convert()?.unwrap_or_default();
let acl_region_config = acl_region_config
.map(|key| {
named_acl_region_configs.get(&key).cloned().ok_or_else(|| {
ConfigurationError::InvalidConfig(format!(
"ACL region config \"{}\" not defined",
key
))
})
})
.transpose()?
.convert()?;
Ok(RepoConfig {
enabled,
storage_config,
generation_cache_size,
repoid,
scuba_table_hooks,
scuba_local_path_hooks,
cache_warmup,
hook_manager_params,
bookmarks,
hooks,
push,
pushrebase,
lfs,
hash_validation_percentage,
readonly,
redaction,
skiplist_index_blobstore_key,
bundle2_replay_params,
write_lock_db_address,
infinitepush,
list_keys_patterns_max,
filestore,
hook_max_file_size,
hipster_acl,
source_control_service,
source_control_service_monitoring,
derived_data_config,
hgsql_name,
hgsql_globalrevs_name,
enforce_lfs_acl_check,
repo_client_use_warm_bookmarks_cache,
segmented_changelog_config,
repo_client_knobs,
phabricator_callsign,
backup_repo_config,
acl_region_config,
})
}