Re: [PATCH] branch: error copying or renaming a detached HEAD
From: Junio C Hamano <hidden>
Date: 2022-10-25 23:50:47
Rubén Justo [off-list ref] writes:
Let's remove the condition in copy_or_rename_branch() (the current function name) and check for HEAD before calling it, dying with the original intended error if we're in a detached HEAD.
Makes sense.
quoted hunk
@@ -827,24 +820,19 @@ int cmd_branch(int argc, const char **argv, const char *prefix) strbuf_release(&buf); return ret; - } else if (copy) { - if (!argc) - die(_("branch name required")); - else if (argc == 1) - copy_or_rename_branch(head, argv[0], 1, copy > 1); - else if (argc == 2) - copy_or_rename_branch(argv[0], argv[1], 1, copy > 1); - else - die(_("too many branches for a copy operation")); - } else if (rename) { + } else if (copy || rename) { if (!argc) die(_("branch name required")); + else if ((argc == 1) && filter.detached) + die(copy? _("cannot copy the current branch while not on any.") + : _("cannot rename the current branch while not on any."));
Missing " " before "?".
else if (argc == 1) - copy_or_rename_branch(head, argv[0], 0, rename > 1); + copy_or_rename_branch(head, argv[0], copy, copy + rename > 1);
The third argument being 'copy' makes sense (as the original has 1 for copy and 0 for rename). As we reject if rename and copy are both set, here we have either copy > 0 or rename > 0 but not both, so the fourth argument makes sense, too.
else if (argc == 2)
- copy_or_rename_branch(argv[0], argv[1], 0, rename > 1);
+ copy_or_rename_branch(argv[0], argv[1], copy, copy + rename > 1);
else
- die(_("too many arguments for a rename operation"));
+ die(copy? _("too many branches for a copy operation")
+ : _("too many arguments for a rename operation"));Ditto.
quoted hunk
diff --git a/t/t3200-branch.sh b/t/t3200-branch.sh index 7d8edff9c3..38c57de71b 100755 --- a/t/t3200-branch.sh +++ b/t/t3200-branch.sh@@ -268,6 +268,17 @@ test_expect_success 'git branch -M topic topic should work when main is checked git branch -M topic topic ' +test_expect_success 'git branch -M and -C fail on detached HEAD' ' + git checkout HEAD^{} && + test_when_finished git checkout - && + echo "fatal: cannot rename the current branch while not on any." >expect && + test_must_fail git branch -M must-fail 2>err && + test_cmp expect err && + echo "fatal: cannot copy the current branch while not on any." >expect && + test_must_fail git branch -C must-fail 2>err && + test_cmp expect err +'
Excellent. I'll do the whitespace tweak while queueing, so there is no need to resend only to fix them. Thanks.