From 4e8c307fd562d37e8233a18c226786f6bd51646e Mon Sep 17 00:00:00 2001 From: Valentin Haudiquet Date: Wed, 10 Dec 2025 18:40:32 +0100 Subject: [PATCH] deb: first implementation --- src/changelog.rs | 2 +- src/deb.rs | 29 +++++++++++++++++++++++++++++ src/lib.rs | 2 ++ src/main.rs | 11 +++++++++-- 4 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 src/deb.rs diff --git a/src/changelog.rs b/src/changelog.rs index 442f58b..5ee419a 100644 --- a/src/changelog.rs +++ b/src/changelog.rs @@ -123,7 +123,7 @@ fn increment_suffix(version: &str, suffix: &str) -> String { /* * Parse a changelog file first entry header, to obtain (package, version, series) */ -fn parse_changelog_header( +pub fn parse_changelog_header( path: &Path, ) -> Result<(String, String, String), Box> { let file = File::open(path)?; diff --git a/src/deb.rs b/src/deb.rs new file mode 100644 index 0000000..1ac38da --- /dev/null +++ b/src/deb.rs @@ -0,0 +1,29 @@ +use std::error::Error; +use std::path::Path; +use std::process::Command; + +pub fn build_binary_package(cwd: Option<&Path>) -> Result<(), Box> { + let cwd = cwd.unwrap_or_else(|| Path::new(".")); + + // Parse changelog to get package name and version + let changelog_path = cwd.join("debian/changelog"); + let (package, version, _series) = crate::changelog::parse_changelog_header(&changelog_path)?; + + // Construct dsc file name + let parent = cwd.parent().ok_or("Cannot find parent directory")?; + let dsc_name = format!("{}_{}.dsc", package, version); + let dsc_path = parent.join(&dsc_name); + if !dsc_path.exists() { + return Err(format!("Could not find .dsc file at {}", dsc_path.display()).into()); + } + + println!("Building {} using sbuild...", dsc_path.display()); + + let status = Command::new("sbuild").arg(dsc_path).status()?; + + if !status.success() { + return Err(format!("sbuild failed with status: {}", status).into()); + } + + Ok(()) +} diff --git a/src/lib.rs b/src/lib.rs index ca7b7a0..e9f0664 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,4 +1,6 @@ pub mod build; +pub mod changelog; +pub mod deb; pub mod package_info; pub mod pull; diff --git a/src/main.rs b/src/main.rs index 6470122..84b1bb0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -8,8 +8,7 @@ extern crate flate2; use pkh::pull::pull; -mod changelog; -use changelog::generate_entry; +use pkh::changelog::generate_entry; use indicatif_log_bridge::LogWrapper; use log::{error, info}; @@ -50,6 +49,7 @@ fn main() { .arg(arg!(-v --version "Target version").required(false)), ) .subcommand(Command::new("build").about("Build the source package")) + .subcommand(Command::new("deb").about("Build the binary package")) .get_matches(); match matches.subcommand() { @@ -109,6 +109,13 @@ fn main() { std::process::exit(1); } } + Some(("deb", _sub_matches)) => { + let cwd = std::env::current_dir().unwrap(); + if let Err(e) = pkh::deb::build_binary_package(Some(&cwd)) { + error!("{}", e); + std::process::exit(1); + } + } _ => unreachable!("Exhausted list of subcommands and subcommand_required prevents `None`"), } }