Rollup merge of #104901 - krtab:filetype_compare, r=the8472
Implement masking in FileType comparison on Unix Fixes: https://github.com/rust-lang/rust/issues/104900
This commit is contained in:
commit
eb1159cbd8
2 changed files with 34 additions and 2 deletions
|
@ -1551,3 +1551,19 @@ fn hiberfil_sys() {
|
||||||
fs::metadata(hiberfil).unwrap();
|
fs::metadata(hiberfil).unwrap();
|
||||||
assert_eq!(true, hiberfil.exists());
|
assert_eq!(true, hiberfil.exists());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Test that two different ways of obtaining the FileType give the same result.
|
||||||
|
/// Cf. https://github.com/rust-lang/rust/issues/104900
|
||||||
|
#[test]
|
||||||
|
fn test_eq_direntry_metadata() {
|
||||||
|
let tmpdir = tmpdir();
|
||||||
|
let file_path = tmpdir.join("file");
|
||||||
|
File::create(file_path).unwrap();
|
||||||
|
for e in fs::read_dir(tmpdir.path()).unwrap() {
|
||||||
|
let e = e.unwrap();
|
||||||
|
let p = e.path();
|
||||||
|
let ft1 = e.file_type().unwrap();
|
||||||
|
let ft2 = p.metadata().unwrap().file_type();
|
||||||
|
assert_eq!(ft1, ft2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -332,11 +332,23 @@ pub struct FileTimes {
|
||||||
modified: Option<SystemTime>,
|
modified: Option<SystemTime>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
|
#[derive(Copy, Clone, Eq, Debug)]
|
||||||
pub struct FileType {
|
pub struct FileType {
|
||||||
mode: mode_t,
|
mode: mode_t,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PartialEq for FileType {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.masked() == other.masked()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl core::hash::Hash for FileType {
|
||||||
|
fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
|
||||||
|
self.masked().hash(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct DirBuilder {
|
pub struct DirBuilder {
|
||||||
mode: mode_t,
|
mode: mode_t,
|
||||||
|
@ -548,7 +560,11 @@ impl FileType {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is(&self, mode: mode_t) -> bool {
|
pub fn is(&self, mode: mode_t) -> bool {
|
||||||
self.mode & libc::S_IFMT == mode
|
self.masked() == mode
|
||||||
|
}
|
||||||
|
|
||||||
|
fn masked(&self) -> mode_t {
|
||||||
|
self.mode & libc::S_IFMT
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue