]> git.ipfire.org Git - thirdparty/git.git/commitdiff
worktree: remove "the_repository" from is_current_worktree()
authorPhillip Wood <phillip.wood@dunelm.org.uk>
Thu, 26 Mar 2026 14:16:57 +0000 (14:16 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 26 Mar 2026 15:20:50 +0000 (08:20 -0700)
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>
worktree.c
worktree.h

index e9ff6e6ef2eb584853ed2b41e467b3b40a162b88..344ad0c031bf1ff3f6eb12d1aa475e87ba8bd484 100644 (file)
@@ -58,7 +58,7 @@ static void add_head_info(struct worktree *wt)
 
 static int is_current_worktree(struct worktree *wt)
 {
-       char *git_dir = absolute_pathdup(repo_get_git_dir(the_repository));
+       char *git_dir = absolute_pathdup(repo_get_git_dir(wt->repo));
        char *wt_git_dir = get_worktree_git_dir(wt);
        int is_current = !fspathcmp(git_dir, absolute_path(wt_git_dir));
        free(wt_git_dir);
@@ -78,7 +78,7 @@ struct worktree *get_worktree_from_repository(struct repository *repo)
        wt->is_bare = !repo->worktree;
        if (fspathcmp(gitdir, commondir))
                wt->id = xstrdup(find_last_dir_sep(gitdir) + 1);
-       wt->is_current = is_current_worktree(wt);
+       wt->is_current = true;
        add_head_info(wt);
 
        free(gitdir);
@@ -229,9 +229,9 @@ char *get_worktree_git_dir(const struct worktree *wt)
        if (!wt)
                return xstrdup(repo_get_git_dir(the_repository));
        else if (!wt->id)
-               return xstrdup(repo_get_common_dir(the_repository));
+               return xstrdup(repo_get_common_dir(wt->repo));
        else
-               return repo_common_path(the_repository, "worktrees/%s", wt->id);
+               return repo_common_path(wt->repo, "worktrees/%s", wt->id);
 }
 
 static struct worktree *find_worktree_by_suffix(struct worktree **list,
index e450d1a3317e23f3ad5f37e71b8110f08d112940..94ae58db973ec465ebcedc20839fd78f977853f5 100644 (file)
@@ -16,7 +16,7 @@ struct worktree {
        struct object_id head_oid;
        int is_detached;
        int is_bare;
-       int is_current;
+       int is_current;         /* does `path` match `repo->worktree` */
        int lock_reason_valid; /* private */
        int prune_reason_valid; /* private */
 };