From 271e774713478389f9b9e5f31d5260244cff6bdd Mon Sep 17 00:00:00 2001 From: Mikayla Maki Date: Wed, 14 Aug 2024 12:43:00 -0700 Subject: [PATCH] Fix a bug where directories were not matching in the fuzzy matcher, when query contains the worktree root name (#16242) Release Notes: - N/A Co-authored-by: Max --- crates/project/src/project.rs | 20 +++++++------------- crates/project_panel/src/project_panel.rs | 5 +++-- crates/worktree/src/worktree.rs | 15 +++++++++------ 3 files changed, 19 insertions(+), 21 deletions(-) diff --git a/crates/project/src/project.rs b/crates/project/src/project.rs index e3ad2d74a7..0b08071ca2 100644 --- a/crates/project/src/project.rs +++ b/crates/project/src/project.rs @@ -32,7 +32,7 @@ use futures::{ stream::FuturesUnordered, AsyncWriteExt, Future, FutureExt, StreamExt, }; -use fuzzy::CharBag; + use git::{blame::Blame, repository::GitRepository}; use globset::{Glob, GlobSet, GlobSetBuilder}; use gpui::{ @@ -11030,19 +11030,13 @@ impl<'a> Iterator for PathMatchCandidateSetIter<'a> { type Item = fuzzy::PathMatchCandidate<'a>; fn next(&mut self) -> Option { - self.traversal.next().map(|entry| match entry.kind { - EntryKind::Dir => fuzzy::PathMatchCandidate { - is_dir: true, + self.traversal + .next() + .map(|entry| fuzzy::PathMatchCandidate { + is_dir: entry.kind.is_dir(), path: &entry.path, - char_bag: CharBag::from_iter(entry.path.to_string_lossy().to_lowercase().chars()), - }, - EntryKind::File(char_bag) => fuzzy::PathMatchCandidate { - is_dir: false, - path: &entry.path, - char_bag, - }, - EntryKind::UnloadedDir | EntryKind::PendingDir => unreachable!(), - }) + char_bag: entry.char_bag, + }) } } diff --git a/crates/project_panel/src/project_panel.rs b/crates/project_panel/src/project_panel.rs index d9202fab07..9a09660fd6 100644 --- a/crates/project_panel/src/project_panel.rs +++ b/crates/project_panel/src/project_panel.rs @@ -1612,7 +1612,7 @@ impl ProjectPanel { new_entry_kind = if edit_state.is_dir { EntryKind::Dir } else { - EntryKind::File(Default::default()) + EntryKind::File }; } } @@ -1652,6 +1652,7 @@ impl ProjectPanel { git_status: entry.git_status, canonical_path: entry.canonical_path.clone(), is_symlink: entry.is_symlink, + char_bag: entry.char_bag, }); } if expanded_dir_ids.binary_search(&entry.id).is_err() @@ -1875,7 +1876,7 @@ impl ProjectPanel { let status = git_status_setting.then(|| entry.git_status).flatten(); let is_expanded = expanded_entry_ids.binary_search(&entry.id).is_ok(); let icon = match entry.kind { - EntryKind::File(_) => { + EntryKind::File => { if show_file_icons { FileIcons::get_icon(&entry.path, cx) } else { diff --git a/crates/worktree/src/worktree.rs b/crates/worktree/src/worktree.rs index bfe952b38a..0461db4bf7 100644 --- a/crates/worktree/src/worktree.rs +++ b/crates/worktree/src/worktree.rs @@ -3164,6 +3164,7 @@ pub struct Entry { pub git_status: Option, /// Whether this entry is considered to be a `.env` file. pub is_private: bool, + pub char_bag: CharBag, } #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] @@ -3171,7 +3172,7 @@ pub enum EntryKind { UnloadedDir, PendingDir, Dir, - File(CharBag), + File, } #[derive(Clone, Copy, Debug, PartialEq)] @@ -3206,12 +3207,13 @@ impl Entry { root_char_bag: CharBag, canonical_path: Option>, ) -> Self { + let char_bag = char_bag_for_path(root_char_bag, &path); Self { id: ProjectEntryId::new(next_entry_id), kind: if metadata.is_dir { EntryKind::PendingDir } else { - EntryKind::File(char_bag_for_path(root_char_bag, &path)) + EntryKind::File }, path, inode: metadata.inode, @@ -3222,6 +3224,7 @@ impl Entry { is_external: false, is_private: false, git_status: None, + char_bag, } } @@ -3255,7 +3258,7 @@ impl EntryKind { } pub fn is_file(&self) -> bool { - matches!(self, EntryKind::File(_)) + matches!(self, EntryKind::File) } } @@ -5093,11 +5096,10 @@ impl<'a> TryFrom<(&'a CharBag, proto::Entry)> for Entry { let kind = if entry.is_dir { EntryKind::Dir } else { - let mut char_bag = *root_char_bag; - char_bag.extend(entry.path.chars().map(|c| c.to_ascii_lowercase())); - EntryKind::File(char_bag) + EntryKind::File }; let path: Arc = PathBuf::from(entry.path).into(); + let char_bag = char_bag_for_path(*root_char_bag, &path); Ok(Entry { id: ProjectEntryId::from_proto(entry.id), kind, @@ -5110,6 +5112,7 @@ impl<'a> TryFrom<(&'a CharBag, proto::Entry)> for Entry { git_status: git_status_from_proto(entry.git_status), is_private: false, is_symlink: entry.is_symlink, + char_bag, }) } }