From 5acc39d44d555966bf5a03f5df6fea68950e0c10 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Sun, 7 Dec 2025 18:38:34 +0700 Subject: [PATCH] Inherit recipes config from parent packages --- src/bin/repo.rs | 67 +++++++++++++++++++++++++------------------------ 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index 7d283398..c4a10a28 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -498,46 +498,47 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec {} - // keep local changes - PackageConfig::Build(rule) if rule == "local" => recipe.recipe.source = None, - // download from remote build - PackageConfig::Build(rule) if rule == "binary" => { - recipe.recipe.source = None; - recipe.recipe.build.set_as_remote(); - } - // don't build this recipe (unlikely to go here unless some deps need it) - // TODO: Note that we're assuming this being ignored from e.g. metapackages - // TODO: Will totally broke build if this recipe needed as some other build dependencies - PackageConfig::Build(rule) if rule == "ignore" => { - recipe.recipe.source = None; - recipe.recipe.build.set_as_none(); - } - PackageConfig::Build(rule) => { - bail!( - // Fail fast because we could risk losing local changes if "local" was typo'ed - "Invalid pkg config {} = \"{}\"\nExpecting either 'source', 'local', 'binary' or 'ignore'", - recipe.name.as_str(), - rule - ); - } + let repo_binary = conf.general.repo_binary == Some(true); + let mut last_rule = if repo_binary { "binary" } else { "source" }; + // Use rev() so recipes that don't listed in config is inherited from parent + for recipe in recipes.iter_mut().rev() { + if let Some(conf) = conf.packages.get(recipe.name.as_str()) { + last_rule = match conf { + PackageConfig::Build(rule) => &rule, _ => { - if conf.general.repo_binary == Some(true) { - // same reason as Build("binary") - recipe.recipe.source = None; - recipe.recipe.build.set_as_remote(); + if repo_binary { + "binary" + } else { + "source" } } } - } else { - if conf.general.repo_binary == Some(true) { + }; + match last_rule { + // build from source as usual + "source" => {} + // keep local changes + "local" => recipe.recipe.source = None, + // download from remote build + "binary" => { recipe.recipe.source = None; recipe.recipe.build.set_as_remote(); } + // don't build this recipe (unlikely to go here unless some deps need it) + // TODO: Note that we're assuming this being ignored from e.g. metapackages + // TODO: Will totally broke build if this recipe needed as some other build dependencies + "ignore" => { + recipe.recipe.source = None; + recipe.recipe.build.set_as_none(); + } + rule => { + bail!( + // Fail fast because we could risk losing local changes if "local" was typo'ed + "Invalid pkg config {} = \"{}\"\nExpecting either 'source', 'local', 'binary' or 'ignore'", + recipe.name.as_str(), + rule + ); + } } } }