pull: move orig tarball content to the right place on archive download
All checks were successful
CI / build (push) Successful in 9m13s

This commit is contained in:
2026-01-12 21:58:57 +01:00
parent 35f9517732
commit 843f28e8af

View File

@@ -90,6 +90,26 @@ use futures_util::StreamExt;
use tar::Archive;
use xz2::read::XzDecoder;
fn copy_dir_all(src: &Path, dst: &Path) -> Result<(), Box<dyn Error>> {
if !dst.exists() {
std::fs::create_dir_all(dst)?;
}
for entry in std::fs::read_dir(src)? {
let entry = entry?;
let src_path = entry.path();
let dst_path = dst.join(entry.file_name());
if src_path.is_dir() {
copy_dir_all(&src_path, &dst_path)?;
} else {
std::fs::copy(&src_path, &dst_path)?;
}
}
Ok(())
}
fn extract_archive(path: &Path, dest: &Path) -> Result<(), Box<dyn Error>> {
let file = File::open(path)?;
let filename = path.file_name().unwrap().to_string_lossy();
@@ -338,13 +358,46 @@ async fn fetch_archive_sources(
.find(|f| f.name.contains(".orig.tar."))
{
let path = package_dir.join(&orig_file.name);
let extract_dir = package_dir.join(&info.stanza.package);
let extract_dir = package_dir;
if (orig_file.name.ends_with(".tar.xz") || orig_file.name.ends_with(".tar.gz"))
&& let Err(e) = extract_archive(&path, &extract_dir)
&& let Err(e) = extract_archive(&path, extract_dir)
{
return Err(format!("Failed to extract {}: {}", orig_file.name, e).into());
}
// Rename from 'package-origversion' to 'package', merging with existing directory
let target_dir = package_dir.join(&info.stanza.package);
let entries = std::fs::read_dir(package_dir)?;
for entry in entries {
let entry = entry?;
let entry_path = entry.path();
if entry_path.is_dir() {
let dir_name = entry.file_name().to_string_lossy().to_string();
if dir_name.starts_with(&format!("{}-", info.stanza.package)) {
// Found a directory like 'package-version', rename it to 'package'
if target_dir.exists() {
// Target exists, we need to merge contents
for sub_entry in std::fs::read_dir(&entry_path)? {
let sub_entry = sub_entry?;
let sub_path = sub_entry.path();
let target_path = target_dir.join(sub_entry.file_name());
if sub_path.is_dir() {
std::fs::create_dir_all(&target_path)?;
// Recursively copy directory contents
copy_dir_all(&sub_path, &target_path)?;
} else {
std::fs::copy(&sub_path, &target_path)?;
}
}
std::fs::remove_dir_all(&entry_path)?;
} else {
std::fs::rename(&entry_path, &target_dir)?;
}
break;
}
}
}
}
Ok(())