Merge branch 'jk/branch-delete-detached'

Fix a bug where `git branch -d` did not work on an orphaned HEAD.

* jk/branch-delete-detached:
  branch: gracefully handle '-d' on orphan HEAD
This commit is contained in:
Taylor Blau 2022-11-18 18:44:00 -05:00
commit 26734da056
2 changed files with 39 additions and 6 deletions

View file

@ -150,7 +150,7 @@ static int branch_merged(int kind, const char *name,
if (!reference_rev)
reference_rev = head_rev;
merged = in_merge_bases(rev, reference_rev);
merged = reference_rev ? in_merge_bases(rev, reference_rev) : 0;
/*
* After the safety valve is fully redefined to "check with
@ -160,7 +160,7 @@ static int branch_merged(int kind, const char *name,
* a gentle reminder is in order.
*/
if ((head_rev != reference_rev) &&
in_merge_bases(rev, head_rev) != merged) {
(head_rev ? in_merge_bases(rev, head_rev) : 0) != merged) {
if (merged)
warning(_("deleting branch '%s' that has been merged to\n"
" '%s', but not yet merged to HEAD."),
@ -235,11 +235,8 @@ static int delete_branches(int argc, const char **argv, int force, int kinds,
}
branch_name_pos = strcspn(fmt, "%");
if (!force) {
if (!force)
head_rev = lookup_commit_reference(the_repository, &head_oid);
if (!head_rev)
die(_("Couldn't look up commit object for HEAD"));
}
for (i = 0; i < argc; i++, strbuf_reset(&bname)) {
char *target = NULL;

View file

@ -279,6 +279,42 @@ test_expect_success 'git branch -M and -C fail on detached HEAD' '
test_cmp expect err
'
test_expect_success 'git branch -d on orphan HEAD (merged)' '
test_when_finished git checkout main &&
git checkout --orphan orphan &&
test_when_finished "rm -rf .git/objects/commit-graph*" &&
git commit-graph write --reachable &&
git branch --track to-delete main &&
git branch -d to-delete
'
test_expect_success 'git branch -d on orphan HEAD (merged, graph)' '
test_when_finished git checkout main &&
git checkout --orphan orphan &&
git branch --track to-delete main &&
git branch -d to-delete
'
test_expect_success 'git branch -d on orphan HEAD (unmerged)' '
test_when_finished git checkout main &&
git checkout --orphan orphan &&
test_when_finished "git branch -D to-delete" &&
git branch to-delete main &&
test_must_fail git branch -d to-delete 2>err &&
grep "not fully merged" err
'
test_expect_success 'git branch -d on orphan HEAD (unmerged, graph)' '
test_when_finished git checkout main &&
git checkout --orphan orphan &&
test_when_finished "git branch -D to-delete" &&
git branch to-delete main &&
test_when_finished "rm -rf .git/objects/commit-graph*" &&
git commit-graph write --reachable &&
test_must_fail git branch -d to-delete 2>err &&
grep "not fully merged" err
'
test_expect_success 'git branch -v -d t should work' '
git branch t &&
git rev-parse --verify refs/heads/t &&