In bcfc82bd48 (branch: description for non-existent branch errors, 2022-10-08) we used "strcmp(head, branch)" to check if we're asked to operate in a branch that is the current HEAD, and "ref_exists(branch_ref)" to check if it points to a valid ref, i.e. it is an orphan branch. We are doing this with the intention of avoiding the confusing error: "No branch named..." If we're asked to operate with an orphan branch, but it is on a different worktree, "strcmp(head, branch)" is not going to match: $ git worktree add orphan-worktree --detach $ git -C orphan-worktree checkout --orphan orpha-branch $ git branch -m orpha-branch orphan-branch fatal: No branch named 'orpha-branch'. Let's do the check for HEAD in any worktree in the repository, removing the "strcmp" and using the helper introduced in 31ad6b61bd (branch: add branch_checked_out() helper, 2022-06-15) This commit also extends the tests introduced on bcfc82bd48, in t3202-show-branch, to cover not just the initial branch but any orphan branch. Signed-off-by: Rubén Justo <rjusto@xxxxxxxxx> --- builtin/branch.c | 8 ++++---- t/t3202-show-branch.sh | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 4 deletions(-) diff --git a/builtin/branch.c b/builtin/branch.c index f63fd45edb..954008e51d 100644 --- a/builtin/branch.c +++ b/builtin/branch.c @@ -528,8 +528,8 @@ static void copy_or_rename_branch(const char *oldname, const char *newname, int die(_("Invalid branch name: '%s'"), oldname); } - if ((copy || strcmp(head, oldname)) && !ref_exists(oldref.buf)) { - if (copy && !strcmp(head, oldname)) + if ((copy || !branch_checked_out(oldref.buf)) && !ref_exists(oldref.buf)) { + if (copy && branch_checked_out(oldref.buf)) die(_("No commit on branch '%s' yet."), oldname); else die(_("No branch named '%s'."), oldname); @@ -806,7 +806,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix) strbuf_addf(&branch_ref, "refs/heads/%s", branch_name); if (!ref_exists(branch_ref.buf)) - error((!argc || !strcmp(head, branch_name)) + error((!argc || branch_checked_out(branch_ref.buf)) ? _("No commit on branch '%s' yet.") : _("No branch named '%s'."), branch_name); @@ -851,7 +851,7 @@ int cmd_branch(int argc, const char **argv, const char *prefix) } if (!ref_exists(branch->refname)) { - if (!argc || !strcmp(head, branch->name)) + if (!argc || branch_checked_out(branch->refname)) die(_("No commit on branch '%s' yet."), branch->name); die(_("branch '%s' does not exist"), branch->name); } diff --git a/t/t3202-show-branch.sh b/t/t3202-show-branch.sh index ea7cfd1951..acaedac34e 100755 --- a/t/t3202-show-branch.sh +++ b/t/t3202-show-branch.sh @@ -221,4 +221,40 @@ test_expect_success 'fatal descriptions on non-existent branch' ' test_cmp expect actual ' +test_expect_success 'error descriptions on orphan or unborn-yet branch' ' + cat >expect <<-EOF && + error: No commit on branch '\''orphan-branch'\'' yet. + EOF + test_when_finished git worktree remove -f orphan-worktree && + git worktree add orphan-worktree --detach && + git -C orphan-worktree checkout --orphan orphan-branch && + test_must_fail git -C orphan-worktree branch --edit-description 2>actual && # implicit branch + test_cmp expect actual && + test_must_fail git -C orphan-worktree branch --edit-description orphan-branch 2>actual && # explicit branch + test_cmp expect actual && + test_must_fail git branch --edit-description orphan-branch 2>actual && # different worktree + test_cmp expect actual +' + +test_expect_success 'fatal descriptions on orphan or unborn-yet branch' ' + cat >expect <<-EOF && + fatal: No commit on branch '\''orphan-branch'\'' yet. + EOF + test_when_finished git worktree remove -f orphan-worktree && + git worktree add orphan-worktree --detach && + git -C orphan-worktree checkout --orphan orphan-branch && + test_must_fail git -C orphan-worktree branch --set-upstream-to=non-existent 2>actual && # implicit branch + test_cmp expect actual && + test_must_fail git -C orphan-worktree branch --set-upstream-to=non-existent orphan-branch 2>actual && # explicit branch + test_cmp expect actual && + test_must_fail git branch --set-upstream-to=non-existent orphan-branch 2>actual && # different worktree + test_cmp expect actual && + test_must_fail git -C orphan-worktree branch -c new-branch 2>actual && # implicit branch + test_cmp expect actual && + test_must_fail git -C orphan-worktree branch -c orphan-branch new-branch 2>actual && # explicit branch + test_cmp expect actual && + test_must_fail git branch -c orphan-branch new-branch 2>actual && # different worktree + test_cmp expect actual +' + test_done -- 2.39.0