mirror of
https://github.com/git-for-windows/git.git
synced 2026-04-10 16:54:08 -05:00
worktree: remove "the_repository" from is_current_worktree()
The "is_current" member of struct worktree was added in750e8a60d6(worktree.c: mark current worktree, 2016-04-22) and was used in8d9fdd7087(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() in246deeac95(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() in07242c2a5a(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>
This commit is contained in:
committed by
Junio C Hamano
parent
7f19e4e1b6
commit
0f77914760
@@ -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,
|
||||
|
||||
@@ -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 */
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user