From eb739c9ff92db9f03fc2e4717425e498465f3b4a Mon Sep 17 00:00:00 2001 From: Josh Holmer Date: Tue, 30 Jan 2018 10:12:42 -0500 Subject: [PATCH] Implement unix-specific permissions copying Closes #4 --- CHANGELOG.md | 1 + src/lib.rs | 22 +++++++++++++++++++--- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a4ac20e..3ca8212d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ ### Version 0.19.1 (unreleased) - Refactor of internal code. + - Implement unix-specific permissions copying for `-p` option ### Version 0.19.0 - [SEMVER_MAJOR] Default to overwriting the input file if `out_file` is not set. diff --git a/src/lib.rs b/src/lib.rs index defa7767..e79e143b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -713,12 +713,10 @@ fn perform_backup(input_path: &Path) -> Result<(), PngError> { }) } +#[cfg(not(unix))] fn copy_permissions(input_path: &Path, out_file: &File, verbosity: Option) { if let Ok(f) = File::open(input_path) { if let Ok(metadata) = f.metadata() { - // TODO: Implement full permission changing on Unix - // Not available in stable, requires block cfg statements - // See https://github.com/rust-lang/rust/issues/15701 if let Ok(out_meta) = out_file.metadata() { let readonly = metadata.permissions().readonly(); out_meta.permissions().set_readonly(readonly); @@ -731,6 +729,24 @@ fn copy_permissions(input_path: &Path, out_file: &File, verbosity: Option) { } } +#[cfg(unix)] +fn copy_permissions(input_path: &Path, out_file: &File, verbosity: Option) { + use std::os::unix::fs::PermissionsExt; + + if let Ok(f) = File::open(input_path) { + if let Ok(metadata) = f.metadata() { + if let Ok(out_meta) = out_file.metadata() { + let permissions = metadata.permissions().mode(); + out_meta.permissions().set_mode(permissions); + return; + } + } + }; + if verbosity.is_some() { + eprintln!("Failed to set permissions on output file"); + } +} + fn image_to_pixel_array(image: &DynamicImage) -> Vec> { image .pixels()