1use std::io;
2use std::path::Path;
3
4pub fn set_executable(path: &Path) -> io::Result<()> {
5 #[cfg(unix)]
6 { use std::os::unix::fs::PermissionsExt; std::fs::set_permissions(path, std::fs::Permissions::from_mode(0o755)) }
7 #[cfg(not(unix))]
8 { let _ = path; Ok(()) }
9}
10
11pub fn set_private(path: &Path) -> io::Result<()> {
12 #[cfg(unix)]
13 { use std::os::unix::fs::PermissionsExt; std::fs::set_permissions(path, std::fs::Permissions::from_mode(0o600)) }
14 #[cfg(not(unix))]
15 { let _ = path; Ok(()) }
16}
17
18pub fn copy_permissions(src: &Path, dst: &Path) -> io::Result<()> {
19 #[cfg(unix)]
20 { std::fs::set_permissions(dst, std::fs::metadata(src)?.permissions()) }
21 #[cfg(not(unix))]
22 { let _ = (src, dst); Ok(()) }
23}
24
25pub fn copy_dir(src: &Path, dst: &Path) -> io::Result<()> {
26 std::fs::create_dir_all(dst)?;
27 for e in std::fs::read_dir(src)?.flatten() {
28 let (s, d) = (e.path(), dst.join(e.file_name()));
29 if s.symlink_metadata()?.file_type().is_symlink() { continue; }
30 if s.is_dir() { copy_dir(&s, &d)?; }
31 else { std::fs::copy(&s, &d)?; let _ = copy_permissions(&s, &d); }
32 }
33 Ok(())
34}