From 7bd5e1e087d64bc1cba8ed66a0b608e1b327e6c7 Mon Sep 17 00:00:00 2001 From: Wildan M Date: Mon, 26 Jan 2026 21:36:53 +0700 Subject: [PATCH] Build filesystem complete map --- src/bin/repo.rs | 84 +++++++++++++++++++++++++++++++------------------ src/recipe.rs | 10 ++++++ 2 files changed, 64 insertions(+), 30 deletions(-) diff --git a/src/bin/repo.rs b/src/bin/repo.rs index 003834cc..b6267ef2 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -516,33 +516,46 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec = Vec::new(); - let mut binary_recipe_names: Vec = Vec::new(); - - for recipe_name in recipe_names.iter() { - let rule = match conf.packages.get(recipe_name.as_str()) { - Some(PackageConfig::Build(rule)) => rule.as_str(), - _ => { - if repo_binary { - "binary" - } else { - "source" - } - } + // This is the complete map from filesystem config + let mut source_names: Vec = Vec::new(); + let mut binary_names: Vec = Vec::new(); + let mut special_rules: HashMap = HashMap::new(); + let default_rule = if repo_binary { "binary" } else { "source" }; + for (recipe_name_str, recipe_config) in conf.packages.iter() { + let Ok(recipe_name) = PackageName::new(recipe_name_str) else { + continue; + }; + let rule = match recipe_config { + PackageConfig::Build(rule) => rule, + _ => default_rule, }; if rule == "source" || rule == "local" { - source_recipe_names.push(recipe_name.clone()); + source_names.push(recipe_name.clone()); } else { - binary_recipe_names.push(recipe_name.clone()); + binary_names.push(recipe_name.clone()); } if rule == "local" || rule == "ignore" { - // these don't inherit into their deps - let mut recipe = CookRecipe::from_name(recipe_name.clone())?; - recipe.apply_filesystem_config(rule)?; - preloaded_recipes.insert(recipe_name.clone(), recipe); + special_rules.insert(recipe_name, rule.to_string()); } } + source_names = CookRecipe::get_all_deps_names_recursive(&source_names, true)?; + binary_names = CookRecipe::get_all_deps_names_recursive(&binary_names, false)?; + let source_names: HashSet = source_names.into_iter().collect(); + let binary_names: HashSet = binary_names.into_iter().collect(); + + // These are list that derived from recipe_names + let mut source_recipe_names: Vec = Vec::new(); + let mut binary_recipe_names: Vec = Vec::new(); + for recipe_name in recipe_names.iter() { + if source_names.contains(recipe_name) { + source_recipe_names.push(recipe_name.clone()); + } + if binary_names.contains(recipe_name) { + binary_recipe_names.push(recipe_name.clone()); + } + } + if config.with_package_deps { source_recipe_names = CookRecipe::get_package_deps_recursive(&source_recipe_names, true)?; @@ -556,20 +569,23 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec { // both lists: flip logic @@ -579,14 +595,22 @@ fn parse_args(args: Vec) -> anyhow::Result<(CliConfig, CliCommand, Vec "binary", (false, false) => { // should not be possible to go here - if repo_binary { "binary" } else { "source" } + default_rule } }; recipe.apply_filesystem_config(rule)?; } + recipes } else { - CookRecipe::from_list(recipe_names.clone())? + if config.with_package_deps { + recipe_names = CookRecipe::get_package_deps_recursive(&recipe_names, true)?; + } + if command.is_building() { + CookRecipe::get_build_deps_recursive(&recipe_names, true)? + } else { + CookRecipe::from_list(recipe_names.clone())? + } }; if command.is_pushing() || !config.with_package_deps { diff --git a/src/recipe.rs b/src/recipe.rs index 7ae97e87..63fc5a09 100644 --- a/src/recipe.rs +++ b/src/recipe.rs @@ -427,6 +427,16 @@ impl CookRecipe { Ok(packages.into_iter().map(|p| p.name).collect()) } + pub fn get_all_deps_names_recursive( + names: &[PackageName], + include_dev: bool, + ) -> Result, PackageError> { + let packages = + Self::new_recursive(names, true, include_dev, true, true, true, true, WALK_DEPTH)?; + + Ok(packages.into_iter().map(|p| p.name).collect()) + } + pub fn reload_recipe(&mut self) -> Result<(), PackageError> { self.recipe = Self::from_path(&self.dir, true, self.name.is_host())?.recipe; let _ = self.apply_filesystem_config(&self.rule.clone());