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
@ -1551,3 +1551,19 @@ fn hiberfil_sys() {
|
||||
fs::metadata(hiberfil).unwrap();
|
||||
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>,
|
||||
}
|
||||
|
||||
#[derive(Copy, Clone, PartialEq, Eq, Hash, Debug)]
|
||||
#[derive(Copy, Clone, Eq, Debug)]
|
||||
pub struct FileType {
|
||||
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)]
|
||||
pub struct DirBuilder {
|
||||
mode: mode_t,
|
||||
@ -548,7 +560,11 @@ impl FileType {
|
||||
}
|
||||
|
||||
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…
x
Reference in New Issue
Block a user