1
Fork 0

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:
Matthias Krüger 2022-12-10 09:24:42 +01:00 committed by GitHub
commit eb1159cbd8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 2 deletions

View file

@ -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);
}
}

View file

@ -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
} }
} }