diff --git a/Cargo.lock b/Cargo.lock index f734d25bb..b95ef9214 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -912,7 +912,7 @@ dependencies = [ [[package]] name = "redox-pkg" version = "0.2.8" -source = "git+https://gitlab.redox-os.org/redox-os/pkgutils.git#b89f08df540b597949207147e0645aed24eb2a80" +source = "git+https://gitlab.redox-os.org/redox-os/pkgutils.git#6ed6a265cbe9abaf9d747e700f72cad9cea5a5d0" dependencies = [ "anyhow", "ignore", @@ -986,7 +986,7 @@ dependencies = [ [[package]] name = "redoxer" version = "0.2.61" -source = "git+https://gitlab.redox-os.org/redox-os/redoxer.git#ccf8df39804a3b405c239a7b2bdddceb77612911" +source = "git+https://gitlab.redox-os.org/redox-os/redoxer.git#a4c4dac4550bc234aa04e30efd4058daf8377678" dependencies = [ "anyhow", "dirs", @@ -1321,7 +1321,7 @@ version = "1.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97fee6b57c6a41524a810daee9286c02d7752c4253064d0b05472833a438f675" dependencies = [ - "cfg-if 1.0.4", + "cfg-if 0.1.10", "static_assertions", ] diff --git a/src/bin/repo.rs b/src/bin/repo.rs index 19e1e372e..378ff9ee3 100644 --- a/src/bin/repo.rs +++ b/src/bin/repo.rs @@ -1008,7 +1008,7 @@ fn run_tui_cook( let cooker_status_tx = status_tx.clone(); let cooker_prompting = prompting.clone(); let cooker_handle = thread::spawn(move || { - 'done: for (recipe, source_dir) in work_rx { + 'done: for (mut recipe, source_dir) in work_rx { let name = recipe.name.clone(); let is_deps = recipe.is_deps; let (mut stdout_writer, mut stderr_writer) = setup_logger(&cooker_status_tx, &name); @@ -1017,6 +1017,7 @@ fn run_tui_cook( cooker_status_tx .send(StatusUpdate::StartCook(name.clone())) .unwrap(); + let _ = recipe.reload_recipe(); // reread recipe.toml in case we're retrying let handler = handle_cook( &recipe, &cooker_config, @@ -1113,7 +1114,7 @@ fn run_tui_cook( let fetcher_config = config.clone(); let fetcher_prompting = prompting.clone(); let fetcher_handle = thread::spawn(move || { - 'done: for recipe in fetcher_recipes { + 'done: for mut recipe in fetcher_recipes { let name = recipe.name.clone(); let (mut stdout_writer, mut stderr_writer) = setup_logger(&fetcher_status_tx, &name); let mut logger = Some((&mut stdout_writer, &mut stderr_writer)); @@ -1121,6 +1122,7 @@ fn run_tui_cook( fetcher_status_tx .send(StatusUpdate::StartFetch(name.clone())) .unwrap(); + let _ = recipe.reload_recipe(); // reread recipe.toml in case we're retrying let handler = handle_fetch(&recipe, &fetcher_config, true, &logger); if let Some(log_path) = fetcher_config.logs_dir.as_ref() // successful fetch log usually not that helpful diff --git a/src/bin/repo_builder.rs b/src/bin/repo_builder.rs index ad9902611..517367713 100644 --- a/src/bin/repo_builder.rs +++ b/src/bin/repo_builder.rs @@ -1,7 +1,7 @@ use anyhow::anyhow; use cookbook::WALK_DEPTH; use cookbook::config::{get_config, init_config}; -use cookbook::cook::package::{get_package_name, package_stage_paths, package_target}; +use cookbook::cook::package as cook_package; use cookbook::recipe::CookRecipe; use pkg::{Package, PackageName, recipes}; use std::collections::{BTreeMap, HashMap}; @@ -94,14 +94,11 @@ fn publish_packages(config: &CliConfig) -> anyhow::Result<()> { continue; }; - let target = package_target(recipe); - let target_dir = cookbook_recipe.dir.join("target").join(&target); - - let packages = cookbook_recipe.recipe.get_packages_list(); - - for package in packages { - let (stage_dir, pkgar_src, toml_src) = package_stage_paths(package, &target_dir); - let recipe_name = get_package_name(recipe.name(), package); + let target_dir = cookbook_recipe.target_dir(); + for package in cookbook_recipe.recipe.get_packages_list() { + let (stage_dir, pkgar_src, toml_src) = + cook_package::package_stage_paths(package, &target_dir); + let recipe_name = recipe.without_host(); let pkgar_dst = repo_path.join(format!("{}.pkgar", recipe_name)); let toml_dst = repo_path.join(format!("{}.toml", recipe_name)); diff --git a/src/cook/cook_build.rs b/src/cook/cook_build.rs index 7651befe1..6aa0e088f 100644 --- a/src/cook/cook_build.rs +++ b/src/cook/cook_build.rs @@ -195,11 +195,7 @@ pub fn build( build_deps.push(CookRecipe::from_name(dep.clone()).map_err(|e| format!("{:?}", e))?); } for dependency in build_deps.iter() { - let pkgar = dependency - .dir - .join("target") - .join(dependency.target) - .join("stage.pkgar"); + let (_, pkgar, _) = dependency.stage_paths(); if dependency.name.is_host() { dep_host_pkgars.insert((dependency.name.clone(), pkgar)); } else { diff --git a/src/cook/package.rs b/src/cook/package.rs index 9998d2f5b..70d90818e 100644 --- a/src/cook/package.rs +++ b/src/cook/package.rs @@ -150,12 +150,7 @@ pub fn package_toml( }; let package = Package { - name: PackageName::new(if name.is_host() { - &name.as_str()["host:".len()..] - } else { - name.as_str() - }) - .unwrap(), + name: name.without_host(), version: package_version(recipe), target: package_target(name).to_string(), blake3: hash, diff --git a/src/cook/tree.rs b/src/cook/tree.rs index ec4feb1ac..70bacb1d3 100644 --- a/src/cook/tree.rs +++ b/src/cook/tree.rs @@ -4,10 +4,10 @@ use std::{ path::PathBuf, }; -use anyhow::{Context, anyhow}; +use anyhow::Context; use pkg::{Package, PackageName}; -use crate::{cook::fs::create_target_dir, recipe::CookRecipe}; +use crate::recipe::CookRecipe; pub enum WalkTreeEntry<'a> { Built(&'a PathBuf, u64), @@ -53,10 +53,7 @@ pub fn walk_tree_entry( } }; - let package_dir = &cook_recipe.dir; - let target_dir = create_target_dir(package_dir, redoxer::target()).map_err(|e| anyhow!(e))?; - let pkg_path = target_dir.join("stage.pkgar"); - let pkg_toml = target_dir.join("stage.toml"); + let (_, pkg_path, pkg_toml) = cook_recipe.stage_paths(); let deduped = visited.contains(package_name); let entry = match (std::fs::metadata(&pkg_path), deduped) { diff --git a/src/recipe.rs b/src/recipe.rs index 415fb3126..67947a33a 100644 --- a/src/recipe.rs +++ b/src/recipe.rs @@ -12,7 +12,7 @@ use serde::{ de::{Error as DeErrorT, value::Error as DeError}, }; -use crate::{WALK_DEPTH, cook::package::package_target}; +use crate::{WALK_DEPTH, cook::package as cook_package}; /// Specifies how to download the source for a recipe #[derive(Debug, Clone, Deserialize, PartialEq, Serialize)] @@ -225,14 +225,14 @@ impl Recipe { impl CookRecipe { pub fn new(name: PackageName, dir: PathBuf, mut recipe: Recipe) -> Result { - let target = package_target(&name); + let target = cook_package::package_target(&name); if name.is_host() { let thisname = name.name(); let fn_map = |p: PackageName| { if p.is_host() { if p.name() == thisname { None } else { Some(p) } } else { - Some(PackageName::new(format!("host:{}", p.as_str())).unwrap()) + Some(p.with_host()) } }; recipe.build.dependencies = recipe @@ -415,6 +415,25 @@ impl CookRecipe { Ok(packages.into_iter().map(|p| p.name).collect()) } + + pub fn reload_recipe(&mut self) -> Result<(), PackageError> { + let r = Self::from_path(&self.dir, true)?; + self.recipe = r.recipe; + Ok(()) + } + + /// returns stage dir, pkgar file and toml file. + pub fn stage_paths(&self) -> (PathBuf, PathBuf, PathBuf) { + let r = self.name.suffix().map(|p| OptionalPackageRecipe { + name: p.to_string(), + ..Default::default() + }); + cook_package::package_stage_paths(r.as_ref(), &self.target_dir()) + } + + pub fn target_dir(&self) -> PathBuf { + self.dir.join("target").join(self.target) + } } #[derive(Serialize, Deserialize)]