From c748bc6407c1383f676889e1efc4848d7bd27fb8 Mon Sep 17 00:00:00 2001 From: Ojus Chugh Date: Thu, 25 Dec 2025 20:38:31 +0530 Subject: [PATCH 1/2] Fix REPO_BINARY=1 source dependency propagation Signed-off-by: Ojus Chugh --- src/bin/repo.rs | 61 ++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 60 insertions(+), 1 deletion(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index 3b81c828..afd4fa33 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -370,6 +370,26 @@ fn publish_packages(recipe_names: &Vec, repo_path: &PathBuf) -> anyh run_command(command, &None).map_err(|e| anyhow!(e)) } +fn add_dependencies_recursive(recipe: &cookbook::recipe::Recipe, force_source: &mut HashSet) { + for dep in &recipe.build.dependencies { + if !force_source.contains(dep) { + force_source.insert(dep.clone()); + if let Ok(dep_recipe) = CookRecipe::from_name(dep.clone()) { + add_dependencies_recursive(&dep_recipe.recipe, force_source); + } + } + } + + for dep in &recipe.build.dev_dependencies { + if !force_source.contains(dep) { + force_source.insert(dep.clone()); + if let Ok(dep_recipe) = CookRecipe::from_name(dep.clone()) { + add_dependencies_recursive(&dep_recipe.recipe, force_source); + } + } + } +} + fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec)> { let mut config = CliConfig::new()?; let mut command: Option = None; @@ -512,11 +532,50 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec = std::collections::HashSet::new(); + let mut force_binary_recipes: std::collections::HashSet = std::collections::HashSet::new(); + + // When repo_binary=1, collect "source" recipes and their dependencies + if repo_binary { + for recipe in recipes.iter() { + if let Some(conf) = conf.packages.get(recipe.name.as_str()) { + let rule = match conf { + PackageConfig::Build(rule) => rule.as_str(), + _ => "binary", + }; + if rule == "source" { + force_source_recipes.insert(recipe.name.clone()); + add_dependencies_recursive(&recipe.recipe, &mut force_source_recipes); + } + } + } + } else { + // When repo_binary=0 (default source), collect "binary" recipes and their dependencies + for recipe in recipes.iter() { + if let Some(conf) = conf.packages.get(recipe.name.as_str()) { + let rule = match conf { + PackageConfig::Build(rule) => rule.as_str(), + _ => "source", + }; + if rule == "binary" { + force_binary_recipes.insert(recipe.name.clone()); + add_dependencies_recursive(&recipe.recipe, &mut force_binary_recipes); + } + } + } + } + let mut last_rule = if repo_binary { "binary" } else { "source" }; let mut should_drop_host_packages = true; // 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()) { + if force_source_recipes.contains(&recipe.name) { + last_rule = "source"; + } else if force_binary_recipes.contains(&recipe.name) { + last_rule = "binary"; + } else if let Some(conf) = conf.packages.get(recipe.name.as_str()) { last_rule = match conf { PackageConfig::Build(rule) => &rule, _ => { From 327603557c8c314f6d11806c511383dccfc2d578 Mon Sep 17 00:00:00 2001 From: Ojus Chugh Date: Sun, 25 Jan 2026 12:25:03 +0530 Subject: [PATCH 2/2] fixed reviewer feedback and comments Signed-off-by: Ojus Chugh --- src/bin/repo.rs | 63 ++++++++++++++++++++++--------------------------- 1 file changed, 28 insertions(+), 35 deletions(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index afd4fa33..0fabdd45 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -533,9 +533,10 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec = std::collections::HashSet::new(); - let mut force_binary_recipes: std::collections::HashSet = std::collections::HashSet::new(); + let force_binary_recipes: std::collections::HashSet = std::collections::HashSet::new(); + let mut should_drop_host_packages = true; // When repo_binary=1, collect "source" recipes and their dependencies if repo_binary { @@ -548,46 +549,38 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec rule.as_str(), - _ => "source", - }; - if rule == "binary" { - force_binary_recipes.insert(recipe.name.clone()); - add_dependencies_recursive(&recipe.recipe, &mut force_binary_recipes); + should_drop_host_packages = false; } } } } - let mut last_rule = if repo_binary { "binary" } else { "source" }; - let mut should_drop_host_packages = true; - // Use rev() so recipes that don't listed in config is inherited from parent - for recipe in recipes.iter_mut().rev() { - if force_source_recipes.contains(&recipe.name) { - last_rule = "source"; - } else if force_binary_recipes.contains(&recipe.name) { - last_rule = "binary"; - } else if let Some(conf) = conf.packages.get(recipe.name.as_str()) { - last_rule = match conf { - PackageConfig::Build(rule) => &rule, - _ => { - if repo_binary { - "binary" - } else { - "source" + for recipe in recipes.iter_mut() { + let last_rule = match (force_source_recipes.contains(&recipe.name), force_binary_recipes.contains(&recipe.name)) { + (true, true) => { + // both lists: flip logic + if repo_binary { "source" } else { "binary" } + }, + (true, false) => "source", + (false, true) => "binary", + (false, false) => { + // check config or use default + if let Some(conf) = conf.packages.get(recipe.name.as_str()) { + match conf { + PackageConfig::Build(rule) => { + let rule_str = rule.as_str(); + if should_drop_host_packages && (rule_str == "source" || rule_str == "local") { + should_drop_host_packages = false; + } + rule_str + }, + _ => { + if repo_binary { "binary" } else { "source" } + } } + } else { + if repo_binary { "binary" } else { "source" } } - }; - if should_drop_host_packages && (last_rule == "source" || last_rule == "local") { - should_drop_host_packages = false; } }; recipe