Worktree paths in git panel, take 2 (#26047)
Modified version of #25950. We still use worktree paths, but repo paths with a status that lie outside the worktree are not excluded; instead, we relativize them by adding `..`. This makes the list in the git panel match what you'd get from running `git status` (with the repo's worktree root as the working directory). - [x] Implement + test new unrelativization logic - [x] ~~When collecting repositories, dedup by .git abs path, so worktrees can share a repo at the project level~~ dedup repos at the repository selector layer, with repos coming from larger worktrees being preferred - [x] Open single-file worktree with diff when activating a path not in the worktree Release Notes: - N/A
This commit is contained in:
parent
330e799293
commit
1763dd714b
23 changed files with 724 additions and 184 deletions
|
@ -3412,6 +3412,43 @@ async fn test_private_single_file_worktree(cx: &mut TestAppContext) {
|
|||
});
|
||||
}
|
||||
|
||||
#[gpui::test]
|
||||
fn test_unrelativize() {
|
||||
let work_directory = WorkDirectory::in_project("");
|
||||
pretty_assertions::assert_eq!(
|
||||
work_directory.try_unrelativize(&"crates/gpui/gpui.rs".into()),
|
||||
Some(Path::new("crates/gpui/gpui.rs").into())
|
||||
);
|
||||
|
||||
let work_directory = WorkDirectory::in_project("vendor/some-submodule");
|
||||
pretty_assertions::assert_eq!(
|
||||
work_directory.try_unrelativize(&"src/thing.c".into()),
|
||||
Some(Path::new("vendor/some-submodule/src/thing.c").into())
|
||||
);
|
||||
|
||||
let work_directory = WorkDirectory::AboveProject {
|
||||
absolute_path: Path::new("/projects/zed").into(),
|
||||
location_in_repo: Path::new("crates/gpui").into(),
|
||||
};
|
||||
|
||||
pretty_assertions::assert_eq!(
|
||||
work_directory.try_unrelativize(&"crates/util/util.rs".into()),
|
||||
None,
|
||||
);
|
||||
|
||||
pretty_assertions::assert_eq!(
|
||||
work_directory.unrelativize(&"crates/util/util.rs".into()),
|
||||
Path::new("../util/util.rs").into()
|
||||
);
|
||||
|
||||
pretty_assertions::assert_eq!(work_directory.try_unrelativize(&"README.md".into()), None,);
|
||||
|
||||
pretty_assertions::assert_eq!(
|
||||
work_directory.unrelativize(&"README.md".into()),
|
||||
Path::new("../../README.md").into()
|
||||
);
|
||||
}
|
||||
|
||||
#[track_caller]
|
||||
fn check_git_statuses(snapshot: &Snapshot, expected_statuses: &[(&Path, GitSummary)]) {
|
||||
let mut traversal = snapshot
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue