Unnamed repository; edit this file 'description' to name the repository.
Preserve file creation time on macOS and Windows (#13561)
| -rw-r--r-- | helix-stdx/src/faccess.rs | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/helix-stdx/src/faccess.rs b/helix-stdx/src/faccess.rs index a69ad3f4..b98ae153 100644 --- a/helix-stdx/src/faccess.rs +++ b/helix-stdx/src/faccess.rs @@ -71,6 +71,16 @@ mod imp { perms.set_mode(new_perms); } + #[cfg(target_os = "macos")] + { + use std::fs::{File, FileTimes}; + use std::os::macos::fs::FileTimesExt; + + let to_file = File::options().write(true).open(to)?; + let times = FileTimes::new().set_created(from_meta.created()?); + to_file.set_times(times)?; + } + std::fs::set_permissions(to, perms)?; Ok(()) @@ -109,7 +119,13 @@ mod imp { use std::ffi::c_void; - use std::os::windows::{ffi::OsStrExt, fs::OpenOptionsExt, io::AsRawHandle}; + use std::os::windows::{ + ffi::OsStrExt, + fs::{FileTimesExt, OpenOptionsExt}, + io::AsRawHandle, + }; + + use std::fs::{File, FileTimes}; struct SecurityDescriptor { sd: PSECURITY_DESCRIPTOR, @@ -413,6 +429,10 @@ mod imp { let meta = std::fs::metadata(from)?; let perms = meta.permissions(); + let to_file = File::options().write(true).open(to)?; + let times = FileTimes::new().set_created(meta.created()?); + to_file.set_times(times)?; + std::fs::set_permissions(to, perms)?; Ok(()) |