use eyre::{Result, bail};
use crate::config::{Config, ConfigMap};
use crate::oci::{BuildOptions, BuildOutput, Builder, OciConfig};
use crate::toolset::{ConfigScope, ToolsetBuilder};
pub fn merged_oci_config_from<'a>(
config_files: impl IntoIterator<
Item = &'a std::sync::Arc<dyn crate::config::config_file::ConfigFile>,
>,
) -> OciConfig {
let mut out = OciConfig::default();
for cf in config_files {
if let Some(oci) = cf.oci_config() {
out.fill_defaults_from(oci);
}
}
out
}
pub fn merged_oci_config(config: &Config) -> OciConfig {
merged_oci_config_from(config.config_files.values())
}
pub async fn perform_build(opts: BuildOptions, include_global: bool) -> Result<BuildOutput> {
let config = Config::get().await?;
if include_global {
let ts = ToolsetBuilder::new().build(&config).await?;
let oci = merged_oci_config(&config);
return Builder::new(config.clone(), ts, oci, opts).build().await;
}
let project_files = project_config_files(&config)?;
let ts = build_project_toolset(&config, project_files.clone()).await?;
let oci = merged_oci_config_from(project_files.values());
Builder::new(config.clone(), ts, oci, opts).build().await
}
fn project_config_files(config: &Config) -> Result<ConfigMap> {
let project_files: ConfigMap = config
.config_files
.iter()
.filter(|(_, cf)| cf.project_root().is_some())
.map(|(p, cf)| (p.clone(), cf.clone()))
.collect();
if project_files.is_empty() {
bail!(
"mise oci: no project mise config found in the current directory or any parent. \
Add a `mise.toml` to the project, or pass `--include-global` to use tools and \
[oci] settings from your global config (note: asdf/vfox plugins remain \
unsupported)."
);
}
Ok(project_files)
}
async fn build_project_toolset(
config: &std::sync::Arc<Config>,
project_files: ConfigMap,
) -> Result<crate::toolset::Toolset> {
ToolsetBuilder::new()
.with_config_files(project_files)
.with_scope(ConfigScope::LocalOnly)
.build(config)
.await
}
pub fn short_digest(d: &str) -> String {
let hex = d.trim_start_matches("sha256:");
if hex.len() >= 12 {
format!("sha256:{}", &hex[..12])
} else {
d.to_string()
}
}