From 183e18be318493dee5d3b01e85e9b8c850e1d245 Mon Sep 17 00:00:00 2001 From: Anhad Singh Date: Sat, 7 Dec 2024 01:06:02 +1100 Subject: [PATCH] fix: install runtime dependencies of locally built packages This is the same behavior as remote prebuilt packages and what the package manager already does. It seems to be only unimplemented for locally built packages. Signed-off-by: Anhad Singh --- src/lib.rs | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 169aa61839..1c6b5366c3 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -20,7 +20,7 @@ use std::{ collections::BTreeMap, env, fs, io::{self, Seek, SeekFrom, Write}, - path::Path, + path::{Path, PathBuf}, process, rc::Rc, sync::mpsc::channel, @@ -78,13 +78,32 @@ fn prompt_password(prompt: &str, confirm_prompt: &str) -> Result { Ok(password.unwrap_or("".to_string())) } -fn install_local_pkgar(cookbook: &str, target: &str, packagename: &str, dest: &str) { +fn install_local_pkgar(cookbook: &str, target: &str, packagename: &str, dest: &str) -> Result<()> { + let head_path = PathBuf::from(format!("{dest}/pkg/{packagename}.pkgar_head")); + + // Check if the package has been already installed. Maybe it was a runtime dependency of some + // other package. + if head_path.exists() { + return Ok(()); + } + let public_path = format!("{cookbook}/build/id_ed25519.pub.toml",); let pkgar_path = format!("{cookbook}/repo/{target}/{packagename}.pkgar"); - pkgar::extract(&public_path, &pkgar_path, dest).unwrap(); - let head_path = format!("{dest}/pkg/{packagename}.pkgar_head"); - pkgar::split(&public_path, &pkgar_path, &head_path, Option::<&str>::None).unwrap(); + pkgar::extract(&public_path, &pkgar_path, dest).unwrap(); + pkgar::split(&public_path, &pkgar_path, head_path, Option::<&str>::None).unwrap(); + + let pkginfo_path = format!("{cookbook}/repo/{target}/{packagename}.toml"); + let pkginfo = pkg::Package::from_toml(&fs::read_to_string(pkginfo_path)?)?; + + // Recursively install any runtime dependencies. + for dep in pkginfo.depends.iter() { + let depname = dep.as_str(); + println!("Installing runtime dependency for {packagename} from local repo: {depname}"); + install_local_pkgar(cookbook, target, depname, dest)?; + } + + Ok(()) } //TODO: error handling @@ -129,7 +148,7 @@ fn install_packages(config: &Config, dest: &str, cookbook: Option<&str>) { } Rule::Build => { println!("Installing package from local repo: {}", packagename); - install_local_pkgar(cookbook, target, packagename, dest); + install_local_pkgar(cookbook, target, packagename, dest).unwrap(); } } }