From 6fe74602ac0e1dce7843bd10635a444700ec3c56 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 16 Jun 2023 09:42:47 -0700 Subject: [PATCH] Fix detection of when refreshed paths are outside of worktree root --- crates/project/src/worktree.rs | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/crates/project/src/worktree.rs b/crates/project/src/worktree.rs index 04804615563ede969ee813f19c9e038a7c4f54de..c508b84f6cb2b10b2d838e9b6856abba62b161cc 100644 --- a/crates/project/src/worktree.rs +++ b/crates/project/src/worktree.rs @@ -3338,7 +3338,19 @@ impl BackgroundScanner { let metadata = futures::future::join_all( abs_paths .iter() - .map(|abs_path| self.fs.metadata(&abs_path)) + .map(|abs_path| async move { + let metadata = self.fs.metadata(&abs_path).await?; + anyhow::Ok(if let Some(metadata) = metadata { + let canonical_path = if metadata.is_symlink { + self.fs.canonicalize(&abs_path).await? + } else { + abs_path.clone() + }; + Some((metadata, canonical_path)) + } else { + None + }) + }) .collect::>(), ) .await; @@ -3376,7 +3388,7 @@ impl BackgroundScanner { let abs_path: Arc = root_abs_path.join(&path).into(); match metadata { - Ok(Some(metadata)) => { + Ok(Some((metadata, canonical_path))) => { let ignore_stack = state .snapshot .ignore_stack_for_abs_path(&abs_path, metadata.is_dir); @@ -3411,7 +3423,7 @@ impl BackgroundScanner { if let Some(scan_queue_tx) = &scan_queue_tx { let mut ancestor_inodes = state.snapshot.ancestor_inodes_for_path(&path); if metadata.is_dir && !ancestor_inodes.contains(&metadata.inode) { - let is_outside_root = !abs_path.starts_with(&root_canonical_path); + let is_outside_root = !canonical_path.starts_with(&root_canonical_path); ancestor_inodes.insert(metadata.inode); smol::block_on(scan_queue_tx.send(ScanJob { abs_path,