Subject: Re: "Branch exists" error while trying to rename a non-existing branch to an existing one

From: Kaartic Sivaraam <[email-masked]>
Date: Mon, 10 Jul 2017 19:44:31 +0530

On Sun, 2017-07-09 at 11:57 -0700, Junio C Hamano wrote:
> This is borderline "meh" at least to me.  An argument against a
> hypothetical version of Git that "fixes" your issue would be that no
> matter what the source of renaming is, as long as 'master' exists,
> "branch -m" shouldn't overwrite it, and it is a good thing to remind
> the user that 'master' exists and the user meant to rename it to
> something else.
> 
I'm not against the fact of reminding the user about an existing
branch. I'm with the fact that, warn him when he really has to care
about a branch being overwritten i.e., when he tries to rename an
"existing" branch to one that refers to another existing branch.

I found this behaviour odd as I try to relate it with the 'mv' command.
It's behaviour is as follows,

    $ ls
    file  some_file
    $ mv nothing file
    mv: cannot stat 'nothing': No such file or directory

If I haven't missed anything the following patch seems to fix the
problem,

diff --git a/builtin/branch.c b/builtin/branch.c
index 48a513a84..2869aaca8 100644
--- a/builtin/branch.c
+++ b/builtin/branch.c
@@ -476,7 +476,10 @@ static void rename_branch(const char *oldname, const char *newname, int force)
         */
        clobber_head_ok = !strcmp(oldname, newname);
 
-       validate_new_branchname(newname, &newref, force, clobber_head_ok);
+       if(ref_exists(oldref.buf))
+               validate_new_branchname(newname, &newref, force, clobber_head_ok);
+       else
+               die(_("Branch '%s' does not exist."), oldname);
 
        reject_rebase_or_bisect_branch(oldref.buf);

-- 
Kaartic