From: Junio C Hamano <gitster@pobox.com>
To: "Ævar Arnfjörð Bjarmason" <avarab@gmail.com>
Cc: git@vger.kernel.org, "Todd Zullinger" <tmz@pobox.com>,
"Petr Šplíchal" <psplicha@redhat.com>
Subject: Re: [PATCH] checkout: fix BUG() case in 9081a421a6
Date: Thu, 20 Jan 2022 14:29:51 -0800 [thread overview]
Message-ID: <xmqqee52ghwg.fsf@gitster.g> (raw)
In-Reply-To: <patch-1.1-21ddf7c628d-20220120T212233Z-avarab@gmail.com> ("Ævar Arnfjörð Bjarmason"'s message of "Thu, 20 Jan 2022 22:26:57 +0100")
Ævar Arnfjörð Bjarmason <avarab@gmail.com> writes:
> Fix a regression in my 9081a421a6d (checkout: fix "branch info" memory
> leaks, 2021-11-16) where I'd assumed that the old_branch_info.path
> would have to start with refs/heads/*, but as has been reported[1]
> that's not the case.
>
> As a test case[2] to reproduce this shows the second "git checkout"
> here runs into the BUG() in the pre-image. The test being added is
> amended from[2] and will pass both with this change, and before
> 9081a421a6. I.e. our behavior now is again the same as before that
> commit.
> +test_expect_success REFFILES 'checkout a branch without refs/heads/* prefix' '
> + git clone --no-tags . repo-odd-prefix &&
> + (
> + cd repo-odd-prefix &&
> +
> + cp .git/refs/remotes/origin/HEAD .git/refs/heads/a-branch &&
I am not sure if this is a sensible test case to begin with.
It sets up recursive symbolic ref in this way:
HEAD points at refs/heads/a-branch
refs/heads/a-branch points at refs/remotes/origin/HEAD
refs/remotes/origin/HEAD points at refs/remotes/origin/branch1
The checked out branch (i.e. what HEAD points at) is nominally a
local branch, but it totally violates the spirit of the safety valve
that says "HEAD" MUST point at a local branch or otherwise it is
detached. Creating a commit while "a-branch" is checked out would
not affect *ANY* local branch state and instead makes an update to
the remote tracking branch that does not reflect *any* past states
at the remote repository. Even worse, a "git fetch" that updates
the remote tracking branches will make the HEAD, the index and the
working tree into an inconsistent state.
Simply put, I think the BUG() is catching a case where we should
have been diagnosing as a broken repository.
So from my point of view, BUG() is indeed inappropriate because what
the conditional statement noticed was a broken repository, and not a
programming bug.
What we should never do is to promise this "only kosher in letter
but not in spirit" violation of "HEAD must point at a local branch"
rule will be supported.
So, unless I hear more convincing arguments (and Todd's example or
anything similar that makes "git commit" from that state update a
ref outside local branches is *not*), I am hesitant to call the new
behaviour and 9081a421a6d a regression.
What did the code before that BUG() do when faced with this nonsense
configuration? If forbidding outright broke a sensible workflow
that happened to have been "working", I am OK to demote it to
warning() and restore the previous behaviour temporarily, whatever
it was (I think it was just old_branch_info.name was left unset
because we were not on local branch, but I don't know if the missing
.name was making any irrecoverable damage). But the longer term
direction should be that we treat the "update HEAD ends up updating
some ref outside refs/heads/" a longstanding bug that needs to be
fixed.
Thanks.
next prev parent reply other threads:[~2022-01-20 22:29 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-20 16:51 [BUG] builtin/checkout.c:1098: should be able to skip past 'refs/heads/' Todd Zullinger
2022-01-20 17:04 ` Todd Zullinger
2022-01-20 21:26 ` [PATCH] checkout: fix BUG() case in 9081a421a6 Ævar Arnfjörð Bjarmason
2022-01-20 22:29 ` Junio C Hamano [this message]
2022-01-20 22:33 ` Junio C Hamano
2022-01-21 11:14 ` Ævar Arnfjörð Bjarmason
2022-01-21 14:29 ` Petr Šplíchal
2022-01-21 21:58 ` Todd Zullinger
2022-01-21 21:19 ` Junio C Hamano
2022-01-20 22:33 ` Todd Zullinger
2022-01-22 0:33 ` Junio C Hamano
2022-01-22 0:45 ` Junio C Hamano
2022-01-22 0:58 ` [PATCH] checkout: avoid BUG() when hitting a broken repository Junio C Hamano
2022-01-22 8:10 ` Johannes Sixt
2022-01-22 11:55 ` Ævar Arnfjörð Bjarmason
2022-01-23 16:38 ` Johannes Schindelin
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=xmqqee52ghwg.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=avarab@gmail.com \
--cc=git@vger.kernel.org \
--cc=psplicha@redhat.com \
--cc=tmz@pobox.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.