From 5268e7431513b5fdcb5e65272d11db1aee683361 Mon Sep 17 00:00:00 2001 From: Kirill Bulatov Date: Wed, 12 Mar 2025 21:38:21 +0200 Subject: [PATCH] Properly handle goto single file worktrees during terminal cmd-clicks (#26582) Closes https://github.com/zed-industries/zed/issues/26431 Follow-up of https://github.com/zed-industries/zed/pull/26174 `path_with_position.path.strip_prefix(&worktree_root)` used in the PR is wrong for cases of single-file worktrees, where it will return empty paths that will result in incorrect project and FS entries accessed. Release Notes: - Fixed goto single file worktrees during terminal cmd-clicks --- crates/terminal_view/src/terminal_view.rs | 42 ++++++++++++++++------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/crates/terminal_view/src/terminal_view.rs b/crates/terminal_view/src/terminal_view.rs index e810f7cffa..60e43ccafb 100644 --- a/crates/terminal_view/src/terminal_view.rs +++ b/crates/terminal_view/src/terminal_view.rs @@ -1064,18 +1064,36 @@ fn possible_open_target( for worktree in &worktree_candidates { let worktree_root = worktree.read(cx).abs_path(); - let paths_to_check = potential_paths - .iter() - .map(|path_with_position| PathWithPosition { - path: path_with_position - .path - .strip_prefix(&worktree_root) - .unwrap_or(&path_with_position.path) - .to_owned(), - row: path_with_position.row, - column: path_with_position.column, - }) - .collect::>(); + let mut paths_to_check = Vec::with_capacity(potential_paths.len()); + + for path_with_position in &potential_paths { + if worktree_root.ends_with(&path_with_position.path) { + let root_path_with_posiition = PathWithPosition { + path: worktree_root.to_path_buf(), + row: path_with_position.row, + column: path_with_position.column, + }; + match worktree.read(cx).root_entry() { + Some(root_entry) => { + return Task::ready(Some(OpenTarget::Worktree( + root_path_with_posiition, + root_entry.clone(), + ))) + } + None => paths_to_check.push(root_path_with_posiition), + } + } else { + paths_to_check.push(PathWithPosition { + path: path_with_position + .path + .strip_prefix(&worktree_root) + .unwrap_or(&path_with_position.path) + .to_owned(), + row: path_with_position.row, + column: path_with_position.column, + }); + }; + } let mut traversal = worktree .read(cx)