Skip to content

Commit 519947b

Browse files
committed
checkout: avoid BUG() when hitting a broken repository
When 9081a42 (checkout: fix "branch info" memory leaks, 2021-11-16) cleaned up existing memory leaks, we added an unrelated sanity check to ensure that a local branch is truly local and not a symref to elsewhere that dies with BUG() otherwise. This was misguided in two ways. First of all, such a tightening did not belong to a leak-fix patch. And the condition it detected was *not* a bug in our program but a problem in user data, where warning() or die() would have been more appropriate. As the condition is not fatal (the result of computing the local branch name in the code that is involved in the faulty check is only used as a textual label for the commit), let's revert the code to the original state, i.e. strip "refs/heads/" to compute the local branch name if possible, and otherwise leave it NULL. The consumer of the information in merge_working_tree() is prepared to see NULL in there and act accordingly. cf. https://bugzilla.redhat.com/show_bug.cgi?id=2042920 Reported-by: Petr Šplíchal <[email protected]> Reported-by: Todd Zullinger <[email protected]> Helped-by: Ævar Arnfjörð Bjarmason <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 9081a42 commit 519947b

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

builtin/checkout.c

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1094,9 +1094,6 @@ static int switch_branches(const struct checkout_opts *opts,
10941094
const char *p;
10951095
if (skip_prefix(old_branch_info.path, prefix, &p))
10961096
old_branch_info.name = xstrdup(p);
1097-
else
1098-
BUG("should be able to skip past '%s' in '%s'!",
1099-
prefix, old_branch_info.path);
11001097
}
11011098

11021099
if (opts->new_orphan_branch && opts->orphan_from_empty_tree) {

t/t2018-checkout-branch.sh

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,19 @@ test_expect_success 'setup' '
8585
git branch -m branch1
8686
'
8787

88+
test_expect_success 'checkout a branch without refs/heads/* prefix' '
89+
git clone --no-tags . repo-odd-prefix &&
90+
(
91+
cd repo-odd-prefix &&
92+
93+
origin=$(git symbolic-ref refs/remotes/origin/HEAD) &&
94+
git symbolic-ref refs/heads/a-branch "$origin" &&
95+
96+
git checkout -f a-branch &&
97+
git checkout -f a-branch
98+
)
99+
'
100+
88101
test_expect_success 'checkout -b to a new branch, set to HEAD' '
89102
test_when_finished "
90103
git checkout branch1 &&

0 commit comments

Comments
 (0)