diff --git a/src/deb/local.rs b/src/deb/local.rs index fa9c423..79f8db4 100644 --- a/src/deb/local.rs +++ b/src/deb/local.rs @@ -80,10 +80,16 @@ pub fn build( return Err("Could not install essential packages for the build".into()); } + // Find the actual package directory + let package_dir = crate::deb::find_package_directory(Path::new(build_root), package, version)?; + let package_dir_str = package_dir + .to_str() + .ok_or("Invalid package directory path")?; + // Install build dependencies log::debug!("Installing build dependencies..."); let mut cmd = ctx.command("apt-get"); - cmd.current_dir(format!("{build_root}/{package}")) + cmd.current_dir(package_dir_str) .envs(env.clone()) .arg("-y") .arg("build-dep"); @@ -102,7 +108,7 @@ pub fn build( log::debug!("Building (debian/rules build) package..."); let status = ctx .command("debian/rules") - .current_dir(format!("{build_root}/{package}")) + .current_dir(package_dir_str) .envs(env.clone()) .arg("build") .status()?; @@ -113,7 +119,7 @@ pub fn build( // Run the 'binary' step to produce deb let status = ctx .command("fakeroot") - .current_dir(format!("{build_root}/{package}")) + .current_dir(package_dir_str) .envs(env.clone()) .arg("debian/rules") .arg("binary") diff --git a/src/deb/mod.rs b/src/deb/mod.rs index 16275c4..25a6714 100644 --- a/src/deb/mod.rs +++ b/src/deb/mod.rs @@ -85,6 +85,45 @@ pub fn build_binary_package( Ok(()) } +/// Find the current package directory by trying both patterns: +/// - package/package +/// - package/package-origversion +pub(crate) fn find_package_directory( + parent_dir: &Path, + package: &str, + version: &str, +) -> Result> { + let ctx = context::current(); + + // Try package/package pattern first + let package_dir_pattern1 = parent_dir.join(package).join(package); + if ctx.exists(&package_dir_pattern1)? { + return Ok(package_dir_pattern1); + } + + // Compute origversion from version: remove everything after first '-', after stripping epoch + let version_without_epoch = version.split_once(':').map(|(_, v)| v).unwrap_or(version); + let origversion = version_without_epoch + .split_once('-') + .map(|(v, _)| v) + .unwrap_or(version); + + // Try package/package-origversion pattern + let package_dir_pattern2 = parent_dir + .join(package) + .join(format!("{}-{}", package, origversion)); + if ctx.exists(&package_dir_pattern2)? { + return Ok(package_dir_pattern2); + } + + Err(format!( + "Could not find package directory for {} in {}", + package, + parent_dir.display() + ) + .into()) +} + fn find_dsc_file( build_root: &str, package: &str, @@ -135,7 +174,7 @@ mod tests { log::info!("Successfully pulled package {}", package); // Change directory to the package directory - let cwd = cwd.join(package).join(package); + let cwd = crate::deb::find_package_directory(cwd, package, &package_info.stanza.version).expect("Cannot find package directory"); log::debug!("Package directory: {}", cwd.display()); log::info!("Starting binary package build..."); diff --git a/src/deb/sbuild.rs b/src/deb/sbuild.rs index ee39b09..ccc3524 100644 --- a/src/deb/sbuild.rs +++ b/src/deb/sbuild.rs @@ -2,18 +2,26 @@ /// Call 'sbuild' with the dsc file to build the package with unshare use crate::context; use std::error::Error; +use std::path::Path; pub fn build( package: &str, - _version: &str, + version: &str, arch: &str, series: &str, build_root: &str, cross: bool, ) -> Result<(), Box> { let ctx = context::current(); + + // Find the actual package directory + let package_dir = crate::deb::find_package_directory(Path::new(build_root), package, version)?; + let package_dir_str = package_dir + .to_str() + .ok_or("Invalid package directory path")?; + let mut cmd = ctx.command("sbuild"); - cmd.current_dir(format!("{}/{}", build_root, package)); + cmd.current_dir(package_dir_str); cmd.arg("--chroot-mode=unshare"); cmd.arg("--no-clean-source");