From: Junio C Hamano <gitster@pobox.com>
To: Phillip Wood <phillip.wood123@gmail.com>
Cc: Shreyansh Paliwal <shreyanshpaliwalcmsmn@gmail.com>,
git@vger.kernel.org, karthik.188@gmail.com,
Eric Sunshine <sunshine@sunshineco.com>
Subject: Re: [RFC][PATCH 2/2] worktree: stop passing NULL as primary worktree
Date: Sat, 14 Feb 2026 07:34:34 -0800 [thread overview]
Message-ID: <xmqqqzqngwz9.fsf@gitster.g> (raw)
In-Reply-To: <ebc16a74-0555-4951-8ec6-ff7fce6b6fcc@gmail.com> (Phillip Wood's message of "Sat, 14 Feb 2026 14:30:22 +0000")
Phillip Wood <phillip.wood123@gmail.com> writes:
> I've cc'd Eric for a second opinion
>
> On 13/02/2026 22:29, Junio C Hamano wrote:
>> Shreyansh Paliwal <shreyanshpaliwalcmsmn@gmail.com> writes:
>>
>>> diff --git a/path.c b/path.c
>>> index d726537622..4ac86e1e58 100644
>>> --- a/path.c
>>> +++ b/path.c
>>> @@ -408,9 +408,7 @@ static void strbuf_worktree_gitdir(struct strbuf *buf,
>>> const struct repository *repo,
>>> const struct worktree *wt)
>>> {
>>> - if (!wt)
>>> - strbuf_addstr(buf, repo->gitdir);
>>> - else if (!wt->id)
>>> + if (is_main_worktree(wt))
>>> strbuf_addstr(buf, repo->commondir);
>>> else
>>> repo_common_path_append(repo, buf, "worktrees/%s", wt->id);
>>
>> This is curious.
>>
>> We used to treat "wt==NULL" and "wt->id==NULL" differently. Now we
>> use repo->commondir for both. For the primary worktree, it ought to
>> be the same as repo->gitdir, so it should not matter, but makes me
>> wonder what the reason behind this difference in the original.
>>
>> We have been assuming that wt==NULL and wt->id==NULL both meant the
>> same thing: "we are talking about the primary worktree". But the
>> code around here before this patch seems to behave differently. Is
>> our assumption incorrect and are we making a mistake by conflating
>> these two conditions into one?
>
> My understanding is that wt==NULL means "use the current worktree" and
> wt->id==NULL means "this is the main worktree". That would explain why
> we use repo->gitdir above when wt==NULL and repo->commondir when
> wt->id==NULL, as repo->gitdir is the gitdir of the current worktree and
> repo->commondir will be the gitdir of the main worktree. If we look at
> the code in wt-status.c that's passing a NULL worktree it wants to know
> about the status of the current worktree, not the main worktree.
Oh, boy. If that is what wt==NULL means, the above confusion about
the original is perfectly cleared. We have been operating under a
totally wrong assumption.
> I think that we should add a new function
>
> struct worktree *get_current_worktree(struct repository*);
>
> to worktree.c that constructs a struct worktree using repo->gitdir etc.
Certainly.
> We should also think about whether we should
> change wt_status_get_state() to take a "struct worktree *" rather than a
> "struct repository *" instead (I've not looked at the callers to see if
> that's sensible).
>
> With that, we can gradually clean up uses of wt==NULL in the rest of the
> codebase overtime and eventually remove support for it from worktree.c
> rather than having a big flag-day patch. I don't think we need to change
> uses of wt-id==NULL.
OK. I think wt->id==NULL vs wt->id=="/" is about correcting
inconsistencies between the worktree.c and refs.c and certainly can
be done in a separate patch.
We probably should think about how often we use the current one
(presumably almost all the time, given that even wt-status.c API
functions seem to take one), and if the current implementation is
the best way to signal, among a list of worktrees, which one is the
current and which one is the primary.
I do not mind too much about "the primary sits at the beginning of
the resulting list all the time" convention, but wt->is_current bit
looks like a disaster waiting to happen. To find the current one,
you need to construct a full list and then iterate over the list to
find one with that bit on? What if there is nobody with the bit or
more than one? Are callers prepared to notice and report such bugs?
As you said, comparison between gitdir and commondir is sufficient,
then we can lose that bit. One fewer thing that can go out of sync
takes us one step closer to a cleaner world.
Thanks.
next prev parent reply other threads:[~2026-02-14 15:34 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-13 11:59 [RFC][PATCH 0/2] worktree: change representation and usage of primary worktree Shreyansh Paliwal
2026-02-13 11:59 ` [RFC][PATCH 1/2] worktree: represent the primary worktree with '/' instead of NULL Shreyansh Paliwal
2026-02-13 21:35 ` Junio C Hamano
2026-02-14 9:54 ` Shreyansh Paliwal
2026-02-13 11:59 ` [RFC][PATCH 2/2] worktree: stop passing NULL as primary worktree Shreyansh Paliwal
2026-02-13 22:29 ` Junio C Hamano
2026-02-14 9:59 ` Shreyansh Paliwal
2026-02-14 14:30 ` Phillip Wood
2026-02-14 15:34 ` Junio C Hamano [this message]
2026-02-15 8:56 ` Shreyansh Paliwal
2026-02-16 16:18 ` Phillip Wood
2026-02-17 5:21 ` Junio C Hamano
2026-02-17 10:09 ` Shreyansh Paliwal
2026-02-16 16:18 ` [PATCH 0/2] worktree_git_path(): remove repository argument Phillip Wood
2026-02-16 16:18 ` [PATCH 1/2] wt-status: avoid passing NULL worktree Phillip Wood
2026-02-17 9:23 ` Phillip Wood
2026-02-17 10:18 ` Shreyansh Paliwal
2026-02-17 15:20 ` Phillip Wood
2026-02-17 16:38 ` Shreyansh Paliwal
2026-02-17 18:29 ` Junio C Hamano
2026-02-17 17:46 ` Karthik Nayak
2026-02-18 14:19 ` Phillip Wood
2026-02-17 18:47 ` Junio C Hamano
2026-02-18 14:18 ` Phillip Wood
2026-02-16 16:18 ` [PATCH 2/2] path: remove repository argument from worktree_git_path() Phillip Wood
2026-02-17 17:48 ` Karthik Nayak
2026-02-17 10:12 ` [PATCH 0/2] worktree_git_path(): remove repository argument Shreyansh Paliwal
2026-02-17 15:22 ` Phillip Wood
2026-02-17 16:45 ` Shreyansh Paliwal
2026-02-19 14:26 ` [PATCH v2 " Phillip Wood
2026-02-19 14:26 ` [PATCH v2 1/2] wt-status: avoid passing NULL worktree Phillip Wood
2026-02-19 19:30 ` Junio C Hamano
2026-02-19 20:37 ` Junio C Hamano
2026-02-25 16:39 ` Phillip Wood
2026-02-25 17:11 ` Junio C Hamano
2026-02-26 16:09 ` Phillip Wood
2026-02-26 16:15 ` Junio C Hamano
2026-02-19 14:26 ` [PATCH v2 2/2] path: remove repository argument from worktree_git_path() Phillip Wood
2026-02-19 19:34 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqqzqngwz9.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=karthik.188@gmail.com \
--cc=phillip.wood123@gmail.com \
--cc=shreyanshpaliwalcmsmn@gmail.com \
--cc=sunshine@sunshineco.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox