Get st_flags
from MetadataExt
on MacOS
I missed that `st_flags` is available on `MetadataExt` on MacOS, so get them from there, instead of calling `libc::stat`. type: reform
This commit is contained in:
parent
deca555ac3
commit
4f4464e3a2
|
@ -4,7 +4,8 @@ Changelog
|
||||||
|
|
||||||
UNRELEASED - 2020-04-21
|
UNRELEASED - 2020-04-21
|
||||||
-----------------------
|
-----------------------
|
||||||
- :sparkles: [`xxxxxxxxxxxx`](https://github.com/casey/intermodal/commits/master) Allow suppressing output with `--quiet` - Fixes [#174](https://github.com/casey/intermodal/issues/174) - _Celeo <celeodor@gmail.com>_
|
- :art: [`xxxxxxxxxxxx`](https://github.com/casey/intermodal/commits/master) Get `st_flags` from `MetadataExt` on MacOS - _Casey Rodarmor <casey@rodarmor.com>_
|
||||||
|
- :sparkles: [`deca555ac3b3`](https://github.com/casey/intermodal/commit/deca555ac3b3b8f665ee6415f80e05b2bb5e4af7) Allow suppressing output with `--quiet` - Fixes [#174](https://github.com/casey/intermodal/issues/174) - _Celeo <celeodor@gmail.com>_
|
||||||
- :books: [`838167c4d3bc`](https://github.com/casey/intermodal/commit/838167c4d3bcbe2fa28f27a00bd94b959ad31e15) Describe in FAQ creating torrent from git repo - _Casey Rodarmor <casey@rodarmor.com>_
|
- :books: [`838167c4d3bc`](https://github.com/casey/intermodal/commit/838167c4d3bcbe2fa28f27a00bd94b959ad31e15) Describe in FAQ creating torrent from git repo - _Casey Rodarmor <casey@rodarmor.com>_
|
||||||
- :sparkles: [`9b72873ed13e`](https://github.com/casey/intermodal/commit/9b72873ed13e8f0ae747714545c48c6e37c67dd0) Optionally respect `.gitignore` in `imdl torrent create` - Fixes [#378](https://github.com/casey/intermodal/issues/378) - _Celeo <celeodor@gmail.com>_
|
- :sparkles: [`9b72873ed13e`](https://github.com/casey/intermodal/commit/9b72873ed13e8f0ae747714545c48c6e37c67dd0) Optionally respect `.gitignore` in `imdl torrent create` - Fixes [#378](https://github.com/casey/intermodal/issues/378) - _Celeo <celeodor@gmail.com>_
|
||||||
- :books: [`9f480624616b`](https://github.com/casey/intermodal/commit/9f480624616b77995befec722effda22cc2d06ad) Improve FAQ template - _Casey Rodarmor <casey@rodarmor.com>_
|
- :books: [`9f480624616b`](https://github.com/casey/intermodal/commit/9f480624616b77995befec722effda22cc2d06ad) Improve FAQ template - _Casey Rodarmor <casey@rodarmor.com>_
|
||||||
|
|
|
@ -17,29 +17,13 @@ impl PlatformInterface for Platform {
|
||||||
#[cfg(target_os = "macos")]
|
#[cfg(target_os = "macos")]
|
||||||
impl PlatformInterface for Platform {
|
impl PlatformInterface for Platform {
|
||||||
fn hidden(path: &Path) -> Result<bool, Error> {
|
fn hidden(path: &Path) -> Result<bool, Error> {
|
||||||
use std::{ffi::CString, mem, os::unix::ffi::OsStrExt};
|
use std::os::macos::fs::MetadataExt;
|
||||||
|
|
||||||
const HIDDEN_MASK_MAC: u32 = 0x0000_8000;
|
const HIDDEN_MASK_MAC: u32 = 0x0000_8000;
|
||||||
|
|
||||||
let mut stat: libc::stat = unsafe { mem::zeroed() };
|
let metadata = path.metadata().context(error::Filesystem { path })?;
|
||||||
|
|
||||||
let cpath = if let Ok(cstr) = CString::new(path.as_os_str().as_bytes()) {
|
Ok(metadata.st_flags() & HIDDEN_MASK_MAC != 0)
|
||||||
cstr
|
|
||||||
} else {
|
|
||||||
// Consider paths containing null bytes to be hidden
|
|
||||||
return Ok(true);
|
|
||||||
};
|
|
||||||
|
|
||||||
let error_code = unsafe { libc::stat(cpath.as_ptr(), &mut stat) };
|
|
||||||
|
|
||||||
if error_code != 0 {
|
|
||||||
return Err(Error::Filesystem {
|
|
||||||
source: io::Error::from_raw_os_error(error_code),
|
|
||||||
path: path.to_owned(),
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok(stat.st_flags & HIDDEN_MASK_MAC != 0)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,3 +33,35 @@ impl PlatformInterface for Platform {
|
||||||
Ok(false)
|
Ok(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[cfg(tests)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn hidden() {
|
||||||
|
let tmp = tempdir().unwrap();
|
||||||
|
|
||||||
|
let file = tmp.path().join("file");
|
||||||
|
|
||||||
|
assert!(!Platform::hidden(&file));
|
||||||
|
|
||||||
|
if cfg!(target_os = "windows") {
|
||||||
|
Command::new("attrib")
|
||||||
|
.arg("+h")
|
||||||
|
.arg(&file)
|
||||||
|
.status()
|
||||||
|
.unwrap();
|
||||||
|
} else if cfg!(target_os = "macos") {
|
||||||
|
Command::new("chflags")
|
||||||
|
.arg("hidden")
|
||||||
|
.arg(&file)
|
||||||
|
.status()
|
||||||
|
.unwrap();
|
||||||
|
} else {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert!(Platform::hidden(&file));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user