diff --git a/zed/src/worktree.rs b/zed/src/worktree.rs index 93074a13cf80767c9ae72301b4584003b1f41921..82e17233705858b3f3fd04d144c9a7c116c17096 100644 --- a/zed/src/worktree.rs +++ b/zed/src/worktree.rs @@ -466,11 +466,18 @@ impl LocalWorktree { } fn load(&self, path: &Path, cx: &AppContext) -> Task> { - let abs_path = self.absolutize(path); + let path = Arc::from(path); + let abs_path = self.absolutize(&path); + let background_snapshot = self.background_snapshot.clone(); + cx.background().spawn(async move { let mut file = fs::File::open(&abs_path)?; let mut contents = String::new(); file.read_to_string(&mut contents)?; + + // Eagerly populate the snapshot with an updated entry for the loaded file + refresh_entry(&background_snapshot, path, &abs_path)?; + Result::<_, anyhow::Error>::Ok(contents) }) } @@ -496,32 +503,17 @@ impl LocalWorktree { writer.flush()?; // Eagerly populate the snapshot with an updated entry for the saved file - let root_char_bag; - let next_entry_id; - { - let snapshot = background_snapshot.lock(); - root_char_bag = snapshot.root_char_bag; - next_entry_id = snapshot.next_entry_id.clone(); - } - let entry = fs_entry_for_path(root_char_bag, &next_entry_id, path, &abs_path)? - .ok_or_else(|| anyhow!("could not read saved file metadata"))?; - let added = background_snapshot.lock().insert_entry(entry); + refresh_entry(&background_snapshot, path.clone(), &abs_path)?; - Ok::(added) + Ok::<_, anyhow::Error>(()) }) }; cx.spawn(|worktree, mut cx| async move { - let added = save.await?; + save.await?; worktree.update(&mut cx, |worktree, cx| { let worktree = worktree.as_local_mut().unwrap(); worktree.poll_snapshot(cx); - let mut diff = Diff::default(); - if added { - diff.added.insert(path.clone()); - } - diff.modified.insert(path); - worktree.observe_snapshot_diff(diff, cx) }); Ok(()) }) @@ -1684,6 +1676,20 @@ impl BackgroundScanner { } } +fn refresh_entry(snapshot: &Mutex, path: Arc, abs_path: &Path) -> Result<()> { + let root_char_bag; + let next_entry_id; + { + let snapshot = snapshot.lock(); + root_char_bag = snapshot.root_char_bag; + next_entry_id = snapshot.next_entry_id.clone(); + } + let entry = fs_entry_for_path(root_char_bag, &next_entry_id, path, &abs_path)? + .ok_or_else(|| anyhow!("could not read saved file metadata"))?; + snapshot.lock().insert_entry(entry); + Ok(()) +} + fn fs_entry_for_path( root_char_bag: CharBag, next_entry_id: &AtomicUsize,