use anyhow::Context;
use std::path::Path;
use super::{write_managed_bytes, FileInstallReport};
pub fn copy_tree(
source: &Path,
destination: &Path,
force: bool,
) -> anyhow::Result<Vec<FileInstallReport>> {
let mut files = Vec::new();
copy_directory(source, destination, force, &mut files)?;
Ok(files)
}
fn copy_directory(
source: &Path,
destination: &Path,
force: bool,
files: &mut Vec<FileInstallReport>,
) -> anyhow::Result<()> {
let mut entries = std::fs::read_dir(source)
.with_context(|| format!("failed to read {}", source.display()))?
.collect::<Result<Vec<_>, _>>()?;
entries.sort_by_key(std::fs::DirEntry::file_name);
for entry in entries {
let path = entry.path();
let target = destination.join(entry.file_name());
if entry.file_type()?.is_dir() {
copy_directory(&path, &target, force, files)?;
continue;
}
let contents =
std::fs::read(&path).with_context(|| format!("failed to read {}", path.display()))?;
files.push(write_managed_bytes(&target, &contents, force)?);
}
Ok(())
}