diff options
-rw-r--r-- | builtin/branch.c | 10 | ||||
-rwxr-xr-x | t/t3200-branch.sh | 9 |
2 files changed, 17 insertions, 2 deletions
diff --git a/builtin/branch.c b/builtin/branch.c index 5e1e5b4d68..d87035a2f4 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -214,6 +214,9 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, die(_("Couldn't look up commit object for HEAD")); } for (i = 0; i < argc; i++, strbuf_release(&bname)) { + const char *target; + int flags = 0; + strbuf_branchname(&bname, argv[i]); if (kinds == REF_LOCAL_BRANCH && !strcmp(head, bname.buf)) { error(_("Cannot delete the branch '%s' " @@ -225,7 +228,9 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, free(name); name = mkpathdup(fmt, bname.buf); - if (read_ref(name, sha1)) { + target = resolve_ref_unsafe(name, sha1, 0, &flags); + if (!target || + (!(flags & REF_ISSYMREF) && is_null_sha1(sha1))) { error(remote_branch ? _("remote branch '%s' not found.") : _("branch '%s' not found."), bname.buf); @@ -233,7 +238,8 @@ static int delete_branches(int argc, const char **argv, int force, int kinds, continue; } - if (check_branch_commit(bname.buf, name, sha1, head_rev, kinds, + if (!(flags & REF_ISSYMREF) && + check_branch_commit(bname.buf, name, sha1, head_rev, kinds, force)) { ret = 1; continue; diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh index ec5f70eeba..1323f6ff71 100755 --- a/t/t3200-branch.sh +++ b/t/t3200-branch.sh @@ -273,6 +273,15 @@ test_expect_success 'deleting a symref' ' test_i18ncmp expect actual ' +test_expect_success 'deleting a dangling symref' ' + git symbolic-ref refs/heads/dangling-symref nowhere && + test_path_is_file .git/refs/heads/dangling-symref && + echo "Deleted branch dangling-symref (was 0000000)." >expect && + git branch -d dangling-symref >actual && + test_path_is_missing .git/refs/heads/dangling-symref && + test_i18ncmp expect actual +' + test_expect_success 'renaming a symref is not allowed' \ ' git symbolic-ref refs/heads/master2 refs/heads/master && |