Rename entry atomically in LocalWorktree::rename

This commit is contained in:
Max Brunsfeld 2022-05-02 17:16:55 -07:00
parent 8fdc5c9be3
commit a19766931d

View file

@ -628,7 +628,8 @@ impl LocalWorktree {
cx.spawn(|this, mut cx| async move {
let text = fs.load(&abs_path).await?;
// Eagerly populate the snapshot with an updated entry for the loaded file
let entry = refresh_entry(fs.as_ref(), &background_snapshot, path, &abs_path).await?;
let entry =
refresh_entry(fs.as_ref(), &background_snapshot, path, &abs_path, None).await?;
this.update(&mut cx, |this, cx| this.poll_snapshot(cx));
Ok((
File {
@ -684,7 +685,14 @@ impl LocalWorktree {
let fs = self.fs.clone();
let save = cx.background().spawn(async move {
fs.save(&abs_path, &text).await?;
refresh_entry(fs.as_ref(), &background_snapshot, path.clone(), &abs_path).await
refresh_entry(
fs.as_ref(),
&background_snapshot,
path.clone(),
&abs_path,
None,
)
.await
});
cx.spawn(|this, mut cx| async move {
@ -709,12 +717,12 @@ impl LocalWorktree {
let rename = cx.background().spawn(async move {
fs.rename(&abs_old_path, &abs_new_path, Default::default())
.await?;
background_snapshot.lock().remove_path(&old_path);
refresh_entry(
fs.as_ref(),
&background_snapshot,
new_path.clone(),
&abs_new_path,
Some(old_path),
)
.await
});
@ -2144,6 +2152,7 @@ async fn refresh_entry(
snapshot: &Mutex<LocalSnapshot>,
path: Arc<Path>,
abs_path: &Path,
old_path: Option<Arc<Path>>,
) -> Result<Entry> {
let root_char_bag;
let next_entry_id;
@ -2160,7 +2169,11 @@ async fn refresh_entry(
&next_entry_id,
root_char_bag,
);
Ok(snapshot.lock().insert_entry(entry, fs))
let mut snapshot = snapshot.lock();
if let Some(old_path) = old_path {
snapshot.remove_path(&old_path);
}
Ok(snapshot.insert_entry(entry, fs))
}
fn char_bag_for_path(root_char_bag: CharBag, path: &Path) -> CharBag {