pull: allow applying diff.gz from archive download
Some checks failed
CI / build (push) Failing after 7m56s

This commit is contained in:
2026-01-22 00:05:39 +01:00
parent dd9cc07285
commit c3a116203a

View File

@@ -431,6 +431,46 @@ async fn fetch_archive_sources(
} }
} }
} }
// Extract and apply .diff.gz if present (old packages)
if file.name.ends_with(".diff.gz") {
let diff_gz_path = package_dir.join(&file.name);
let source_dir = package_dir.join(&info.stanza.package);
// Create the .diff file path by replacing .gz with empty string
let diff_path = diff_gz_path.with_extension("");
// Decompress the .diff.gz file directly to .diff
let input_file = File::open(&diff_gz_path)?;
let mut decoder = GzDecoder::new(input_file);
let mut output_file = File::create(&diff_path)?;
std::io::copy(&mut decoder, &mut output_file)?;
// Use relative path for the diff file (it's in the parent directory)
let relative_diff_path =
format!("../{}", diff_path.file_name().unwrap().to_string_lossy());
// Apply the patch using the patch command with relative path
let output = Command::new("patch")
.current_dir(&source_dir)
.arg("-p1")
.arg("--input")
.arg(&relative_diff_path)
.output()?;
if !output.status.success() {
let stderr = String::from_utf8_lossy(&output.stderr);
return Err(
format!("Failed to apply patch: {}\n{}", diff_path.display(), stderr).into(),
);
}
debug!("Successfully applied patch: {}", diff_path.display());
// Clean up the extracted .diff file
std::fs::remove_file(&diff_path)?;
}
} }
Ok(()) Ok(())
@@ -533,7 +573,12 @@ pub async fn pull(
mod tests { mod tests {
use super::*; use super::*;
async fn test_pull_package_end_to_end(package: &str, series: Option<&str>, dist: Option<&str>) { async fn test_pull_package_end_to_end(
package: &str,
series: Option<&str>,
dist: Option<&str>,
archive: Option<bool>,
) {
// This test verifies that 'pkh pull' clones the repo and fetches the tarball. // This test verifies that 'pkh pull' clones the repo and fetches the tarball.
// For determinism, we require for tests that either a distro or series is specified, // For determinism, we require for tests that either a distro or series is specified,
@@ -548,7 +593,9 @@ mod tests {
let info = crate::package_info::lookup(package, None, series, "", dist, None) let info = crate::package_info::lookup(package, None, series, "", dist, None)
.await .await
.unwrap(); .unwrap();
pull(&info, Some(cwd), None, false).await.unwrap(); pull(&info, Some(cwd), None, archive.unwrap_or(false))
.await
.unwrap();
let package_dir = cwd.join(package); let package_dir = cwd.join(package);
assert!(package_dir.exists()); assert!(package_dir.exists());
@@ -608,33 +655,39 @@ mod tests {
#[tokio::test] #[tokio::test]
async fn test_pull_hello_ubuntu_end_to_end() { async fn test_pull_hello_ubuntu_end_to_end() {
test_pull_package_end_to_end("hello", Some("noble"), None).await; test_pull_package_end_to_end("hello", Some("noble"), None, None).await;
} }
#[tokio::test] #[tokio::test]
async fn test_pull_hello_debian_end_to_end() { async fn test_pull_hello_debian_end_to_end() {
test_pull_package_end_to_end("hello", Some("bookworm"), None).await; test_pull_package_end_to_end("hello", Some("bookworm"), None, None).await;
}
/// Specific test for a package using a .diff.gz, instead of .debian and .orig
#[tokio::test]
async fn test_pull_linux_riscv_ubuntu_end_to_end() {
test_pull_package_end_to_end("linux-riscv", Some("noble"), None, Some(true)).await;
} }
#[tokio::test] #[tokio::test]
async fn test_pull_2048_universe_ubuntu_end_to_end() { async fn test_pull_2048_universe_ubuntu_end_to_end() {
test_pull_package_end_to_end("2048", Some("noble"), None).await; test_pull_package_end_to_end("2048", Some("noble"), None, None).await;
} }
#[tokio::test] #[tokio::test]
async fn test_pull_1oom_contrib_debian_end_to_end() { async fn test_pull_1oom_contrib_debian_end_to_end() {
test_pull_package_end_to_end("1oom", Some("trixie"), None).await; test_pull_package_end_to_end("1oom", Some("trixie"), None, None).await;
} }
#[tokio::test] #[tokio::test]
async fn test_pull_agg_svn_fallback_ok() { async fn test_pull_agg_svn_fallback_ok() {
test_pull_package_end_to_end("agg", Some("trixie"), None).await; test_pull_package_end_to_end("agg", Some("trixie"), None, None).await;
} }
#[tokio::test] #[tokio::test]
async fn test_pull_hello_debian_latest_end_to_end() { async fn test_pull_hello_debian_latest_end_to_end() {
test_pull_package_end_to_end("hello", None, Some("debian")).await; test_pull_package_end_to_end("hello", None, Some("debian"), None).await;
} }
#[tokio::test] #[tokio::test]
async fn test_pull_hello_ubuntu_latest_end_to_end() { async fn test_pull_hello_ubuntu_latest_end_to_end() {
test_pull_package_end_to_end("hello", None, Some("ubuntu")).await; test_pull_package_end_to_end("hello", None, Some("ubuntu"), None).await;
} }
} }