Fix the worktree's repository_for_path (#24279)

Go back to a less optimized implementation for now since the custom
cursor target seems to have some bugs.

Release Notes:

- Fixed missing git blame and status output in some projects with
multiple git repositories
This commit is contained in:
Cole Miller 2025-02-05 10:37:51 -05:00 committed by GitHub
parent 868e3f75b2
commit 6b29616c95
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -2682,21 +2682,10 @@ impl Snapshot {
/// Get the repository whose work directory contains the given path.
pub fn repository_for_path(&self, path: &Path) -> Option<&RepositoryEntry> {
let mut cursor = self.repositories.cursor::<PathProgress>(&());
let mut repository = None;
// Git repositories may contain other git repositories. As a side effect of
// lexicographic sorting by path, deeper repositories will be after higher repositories
// So, let's loop through every matching repository until we can't find any more to find
// the deepest repository that could contain this path.
while cursor.seek_forward(&PathTarget::Contains(path), Bias::Left, &())
&& cursor.item().is_some()
{
repository = cursor.item();
cursor.next(&());
}
repository
self.repositories
.iter()
.filter(|repo| repo.work_directory.directory_contains(path))
.last()
}
/// Given an ordered iterator of entries, returns an iterator of those entries,
@ -5982,7 +5971,6 @@ impl<'a> Iterator for Traversal<'a> {
enum PathTarget<'a> {
Path(&'a Path),
Successor(&'a Path),
Contains(&'a Path),
}
impl<'a> PathTarget<'a> {
@ -5996,13 +5984,6 @@ impl<'a> PathTarget<'a> {
Ordering::Equal
}
}
PathTarget::Contains(path) => {
if path.starts_with(other) {
Ordering::Equal
} else {
Ordering::Greater
}
}
}
}
}