🎨 Use fs::Metadata in fs::FakeFsEntry

This commit is contained in:
Max Brunsfeld
2021-07-13 16:03:54 -07:00
parent 7260442d42
commit c18ca77d14
2 changed files with 38 additions and 34 deletions
+36 -32
View File
@@ -31,8 +31,9 @@ pub trait Fs: Send + Sync {
fn is_fake(&self) -> bool;
}
#[derive(Clone, Debug)]
pub struct Metadata {
pub ino: u64,
pub inode: u64,
pub mtime: SystemTime,
pub is_symlink: bool,
pub is_dir: bool,
@@ -89,7 +90,7 @@ impl Fs for RealFs {
symlink_metadata
};
Ok(Some(Metadata {
ino: metadata.ino(),
inode: metadata.ino(),
mtime: metadata.modified().unwrap(),
is_symlink,
is_dir: metadata.file_type().is_dir(),
@@ -128,10 +129,7 @@ impl Fs for RealFs {
#[derive(Clone, Debug)]
struct FakeFsEntry {
inode: u64,
mtime: SystemTime,
is_dir: bool,
is_symlink: bool,
metadata: Metadata,
content: Option<String>,
}
@@ -149,7 +147,7 @@ impl FakeFsState {
&& path
.parent()
.and_then(|path| self.entries.get(path))
.map_or(false, |e| e.is_dir)
.map_or(false, |e| e.metadata.is_dir)
{
Ok(())
} else {
@@ -185,10 +183,12 @@ impl FakeFs {
entries.insert(
Path::new("/").to_path_buf(),
FakeFsEntry {
inode: 0,
mtime: SystemTime::now(),
is_dir: true,
is_symlink: false,
metadata: Metadata {
inode: 0,
mtime: SystemTime::now(),
is_dir: true,
is_symlink: false,
},
content: None,
},
);
@@ -211,10 +211,12 @@ impl FakeFs {
state.entries.insert(
path.to_path_buf(),
FakeFsEntry {
inode,
mtime: SystemTime::now(),
is_dir: true,
is_symlink: false,
metadata: Metadata {
inode,
mtime: SystemTime::now(),
is_dir: true,
is_symlink: false,
},
content: None,
},
);
@@ -232,10 +234,12 @@ impl FakeFs {
state.entries.insert(
path.to_path_buf(),
FakeFsEntry {
inode,
mtime: SystemTime::now(),
is_dir: false,
is_symlink: false,
metadata: Metadata {
inode,
mtime: SystemTime::now(),
is_dir: false,
is_symlink: false,
},
content: Some(content),
},
);
@@ -331,11 +335,11 @@ impl Fs for FakeFs {
let mut state = self.state.lock().await;
state.validate_path(path)?;
if let Some(entry) = state.entries.get_mut(path) {
if entry.is_dir {
if entry.metadata.is_dir {
Err(anyhow!("cannot overwrite a directory with a file"))
} else {
entry.content = Some(text.chunks().collect());
entry.mtime = SystemTime::now();
entry.metadata.mtime = SystemTime::now();
state.emit_event(&[path]).await;
Ok(())
}
@@ -343,10 +347,12 @@ impl Fs for FakeFs {
let inode = state.next_inode;
state.next_inode += 1;
let entry = FakeFsEntry {
inode,
mtime: SystemTime::now(),
is_dir: false,
is_symlink: false,
metadata: Metadata {
inode,
mtime: SystemTime::now(),
is_dir: false,
is_symlink: false,
},
content: Some(text.chunks().collect()),
};
state.entries.insert(path.to_path_buf(), entry);
@@ -361,17 +367,15 @@ impl Fs for FakeFs {
async fn is_file(&self, path: &Path) -> bool {
let state = self.state.lock().await;
state.entries.get(path).map_or(false, |entry| !entry.is_dir)
state
.entries
.get(path)
.map_or(false, |entry| !entry.metadata.is_dir)
}
async fn metadata(&self, path: &Path) -> Result<Option<Metadata>> {
let state = self.state.lock().await;
Ok(state.entries.get(path).map(|entry| Metadata {
ino: entry.inode,
mtime: entry.mtime,
is_dir: entry.is_dir,
is_symlink: entry.is_symlink,
}))
Ok(state.entries.get(path).map(|entry| entry.metadata.clone()))
}
async fn read_dir(
+2 -2
View File
@@ -621,7 +621,7 @@ impl LocalWorktree {
EntryKind::File(char_bag_for_path(root_char_bag, &path))
},
path: Arc::from(path),
inode: metadata.ino,
inode: metadata.inode,
mtime: metadata.mtime,
is_symlink: metadata.is_symlink,
is_ignored: false,
@@ -1585,7 +1585,7 @@ impl Entry {
EntryKind::File(char_bag_for_path(root_char_bag, &path))
},
path,
inode: metadata.ino,
inode: metadata.inode,
mtime: metadata.mtime,
is_symlink: metadata.is_symlink,
is_ignored: false,