use anyhow::Result;
use std::fs::Metadata;
use std::path::Path;
#[cfg(unix)]
use crate::metadata::copy_ownership;
use crate::metadata::{copy_attributes, copy_permissions, copy_timestamps, CopyFlags};
pub fn apply_metadata_from_flags(
source: &Path,
destination: &Path,
source_metadata: &Metadata,
copy_flags: &CopyFlags,
) -> Result<()> {
if copy_flags.timestamps {
copy_timestamps(source, destination, source_metadata)?;
}
if copy_flags.security {
copy_permissions(source, destination, source_metadata)?;
}
if copy_flags.attributes {
copy_attributes(source, destination, source_metadata)?;
}
#[cfg(unix)]
if copy_flags.owner {
copy_ownership(source, destination, source_metadata)?;
}
Ok(())
}
pub fn apply_metadata_after_delta(
source: &Path,
destination: &Path,
copy_flags: &CopyFlags,
) -> Result<()> {
if let Ok(metadata) = std::fs::metadata(source) {
apply_metadata_from_flags(source, destination, &metadata, copy_flags)?;
}
Ok(())
}
pub fn get_file_metadata(path: &Path) -> Result<Metadata> {
std::fs::metadata(path)
.map_err(|e| anyhow::anyhow!("Failed to get metadata for {}: {}", path.display(), e))
}
#[cfg(test)]
mod tests {
use super::*;
use std::fs;
use tempfile::tempdir;
#[test]
fn test_apply_metadata_with_minimal_flags() {
let temp_dir = tempdir().unwrap();
let source = temp_dir.path().join("source.txt");
let dest = temp_dir.path().join("dest.txt");
fs::write(&source, "test content").unwrap();
fs::write(&dest, "test content").unwrap();
let metadata = fs::metadata(&source).unwrap();
let flags = CopyFlags {
data: true,
timestamps: true,
security: false,
attributes: false,
owner: false,
auditing: false,
};
let result = apply_metadata_from_flags(&source, &dest, &metadata, &flags);
assert!(result.is_ok());
}
}