diff --git a/src/pull.rs b/src/pull.rs index c45062f..84c1d15 100644 --- a/src/pull.rs +++ b/src/pull.rs @@ -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> { + 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> { 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(())