branch: force-copy a branch to itself via @{-1} is a no-op
commitcfbd173ccb4dbf9cbaae0640b17d96d7b2ee5a19
authorRubén Justo <rjusto@gmail.com>
Thu, 17 Nov 2022 01:36:52 +0000 (17 02:36 +0100)
committerTaylor Blau <me@ttaylorr.com>
Thu, 17 Nov 2022 22:16:21 +0000 (17 17:16 -0500)
tree4a7e58a5ca4f911f9ed44a436b4d79c252cefbae
parenteea7033409a0ed713c78437fc76486983d211e25
branch: force-copy a branch to itself via @{-1} is a no-op

Since 52d59cc645 (branch: add a --copy (-c) option to go with --move
(-m), 2017-06-18) we can copy a branch to make a new branch with the
'-c' (copy) option or to overwrite an existing branch using the '-C'
(force copy) option.  A no-op possibility is considered when we are
asked to copy a branch to itself, to follow the same no-op introduced
for the rename (-M) operation in 3f59481e33 (branch: allow a no-op
"branch -M <current-branch> HEAD", 2011-11-25).  To check for this, in
52d59cc645 we compared the branch names provided by the user, source
(HEAD if omitted) and destination, and a match is considered as this
no-op.

Since ae5a6c3684 (checkout: implement "@{-N}" shortcut name for N-th
last branch, 2009-01-17) a branch can be specified using shortcuts like
@{-1}.  This allows this usage:

$ git checkout -b test
$ git checkout -
$ git branch -C test test  # no-op
$ git branch -C test @{-1} # oops
$ git branch -C @{-1} test # oops

As we are using the branch name provided by the user to do the
comparison, if one of the branches is provided using a shortcut we are
not going to have a match and a call to git_config_copy_section() will
happen.  This will make a duplicate of the configuration for that
branch, and with this progression the second call will produce four
copies of the configuration, and so on.

Let's use the interpreted branch name instead for this comparison.

The rename operation is not affected.

Signed-off-by: Rubén Justo <rjusto@gmail.com>
Signed-off-by: Taylor Blau <me@ttaylorr.com>
builtin/branch.c
t/t3204-branch-name-interpretation.sh