worktree: remove "the_repository" from is_current_worktree()

The "is_current" member of struct worktree was added in 750e8a60d69 (worktree.c: mark current worktree, 2016-04-22) and was used in 8d9fdd7087d (worktree.c: check whether branch is rebased in another worktree, 2016-04-22) to optionally skip the current worktree when seeing if a branch is already checked out in die_if_checked_out(). To determine if a worktree is "current" is_current_worktree() compares the gitdir of the worktree to the gitdir of "the_repository" and returns true when they match. To get the gitdir of the worktree it calls get_workree_git_dir() which also depends on "the_repository". This means that even if "wt->path" matches "wt->repo->worktree" is_current_worktree(wt) will return false when "wt->repo" is not "the_repository". Consequently die_if_checked_out() will fail to skip such a worktree when checking if a branch is already checked out and may die errounously. Fix this by using the worktree's repository instance instead of "the_repository" when comparing gitdirs. The use of "the_repository" in is_current_wortree() comes from replacing get_git_dir() with repo_get_git_dir() in 246deeac951 (environment: make `get_git_dir()` accept a repository, 2024-09-12). In get_worktree_git_dir() it comes from replacing git_common_path() with repo_common_path() in 07242c2a5af (path: drop `git_common_path()` in favor of `repo_common_path()`, 2025-02-07). In both cases the replacements appear to have been mechanical. Signed-off-by: Phillip Wood <phillip.wood@dunelm.org.uk> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Phillip Wood committed Mar 26, 2026 at 14:16 UTC 0f7791476029b73ca9b7dfc0816bfee5f21c0dbb
2 files changed +5 -5
worktree.c
+4 -4
@@ -58,7 +58,7 @@ static void add_head_info(struct worktree *wt)
58
59 static int is_current_worktree(struct worktree *wt)
60 {
61 - char *git_dir = absolute_pathdup(repo_get_git_dir(the_repository));
61 + char *git_dir = absolute_pathdup(repo_get_git_dir(wt->repo));
62 char *wt_git_dir = get_worktree_git_dir(wt);
63 int is_current = !fspathcmp(git_dir, absolute_path(wt_git_dir));
64 free(wt_git_dir);
@@ -78,7 +78,7 @@ struct worktree *get_worktree_from_repository(struct repository *repo)
78 wt->is_bare = !repo->worktree;
79 if (fspathcmp(gitdir, commondir))
80 wt->id = xstrdup(find_last_dir_sep(gitdir) + 1);
81 - wt->is_current = is_current_worktree(wt);
81 + wt->is_current = true;
82 add_head_info(wt);
83
84 free(gitdir);
@@ -229,9 +229,9 @@ char *get_worktree_git_dir(const struct worktree *wt)
229 if (!wt)
230 return xstrdup(repo_get_git_dir(the_repository));
231 else if (!wt->id)
232 - return xstrdup(repo_get_common_dir(the_repository));
232 + return xstrdup(repo_get_common_dir(wt->repo));
233 else
234 - return repo_common_path(the_repository, "worktrees/%s", wt->id);
234 + return repo_common_path(wt->repo, "worktrees/%s", wt->id);
235 }
236
237 static struct worktree *find_worktree_by_suffix(struct worktree **list,
worktree.h
+1 -1
@@ -16,7 +16,7 @@ struct worktree {
16 struct object_id head_oid;
17 int is_detached;
18 int is_bare;
19 - int is_current;
19 + int is_current; /* does `path` match `repo->worktree` */
20 int lock_reason_valid; /* private */
21 int prune_reason_valid; /* private */
22 };