Prune the set of expanded dir ids as entries are removed

Max Brunsfeld created

Change summary

crates/project/src/worktree.rs | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)

Detailed changes

crates/project/src/worktree.rs 🔗

@@ -3030,7 +3030,7 @@ impl BackgroundScanner {
                 // these before handling changes reported by the filesystem.
                 request = self.scan_requests_rx.recv().fuse() => {
                     let Ok(request) = request else { break };
-                    if !self.process_scan_request(request).await {
+                    if !self.process_scan_request(request, false).await {
                         return;
                     }
                 }
@@ -3047,7 +3047,7 @@ impl BackgroundScanner {
         }
     }
 
-    async fn process_scan_request(&self, request: ScanRequest) -> bool {
+    async fn process_scan_request(&self, request: ScanRequest, scanning: bool) -> bool {
         log::debug!("rescanning paths {:?}", request.relative_paths);
 
         let root_path = self.expand_paths(&request.relative_paths).await;
@@ -3072,7 +3072,7 @@ impl BackgroundScanner {
             .collect::<Vec<_>>();
         self.reload_entries_for_paths(root_path, root_canonical_path, abs_paths, None)
             .await;
-        self.send_status_update(false, Some(request.done))
+        self.send_status_update(scanning, Some(request.done))
     }
 
     async fn process_events(&mut self, abs_paths: Vec<PathBuf>) {
@@ -3107,6 +3107,9 @@ impl BackgroundScanner {
             let mut state = self.state.lock();
             state.reload_repositories(&paths, self.fs.as_ref());
             state.snapshot.completed_scan_id = state.snapshot.scan_id;
+            for (_, entry_id) in mem::take(&mut state.removed_entry_ids) {
+                state.expanded_dirs.remove(&entry_id);
+            }
         }
 
         self.send_status_update(false, None);
@@ -3182,7 +3185,7 @@ impl BackgroundScanner {
                                 // the scan queue, so that user operations are prioritized.
                                 request = self.scan_requests_rx.recv().fuse() => {
                                     let Ok(request) = request else { break };
-                                    if !self.process_scan_request(request).await {
+                                    if !self.process_scan_request(request, true).await {
                                         return;
                                     }
                                 }
@@ -3664,7 +3667,7 @@ impl BackgroundScanner {
                                 // the queue of ignore statuses.
                                 request = self.scan_requests_rx.recv().fuse() => {
                                     let Ok(request) = request else { break };
-                                    if !self.process_scan_request(request).await {
+                                    if !self.process_scan_request(request, true).await {
                                         return;
                                     }
                                 }