checkout: restrict @-expansions when finding branch
commitfd4692ff7040e690546ed139a419995e76a96196
authorJeff King <peff@peff.net>
Thu, 2 Mar 2017 08:23:18 +0000 (2 03:23 -0500)
committerJunio C Hamano <gitster@pobox.com>
Thu, 2 Mar 2017 19:05:04 +0000 (2 11:05 -0800)
tree22b7d5f9415dd2a1d74f885d95af2e29608f9a88
parent7d5c960bf6f98601dce992f1ffaf4c7ab932e6dc
checkout: restrict @-expansions when finding branch

When we parse "git checkout $NAME", we try to interpret
$NAME as a local branch-name. If it is, then we point HEAD
to that branch. Otherwise, we detach the HEAD at whatever
commit $NAME points to.

We do the interpretation by calling strbuf_branchname(), and
then blindly sticking "refs/heads/" on the front. This leads
to nonsense results when expansions like "@{upstream}" or
"@" point to something besides a local branch. We end up
with a local branch name like "refs/heads/origin/master" or
"refs/heads/HEAD".

Normally this has no user-visible effect because those
branches don't exist, and so we fallback to feeding the
result to get_sha1(), which resolves them correctly.

But as the new test in t3204 shows, there are corner cases
where the effect is observable, and we check out the wrong
local branch rather than detaching to the correct one.

Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/checkout.c
t/t3204-branch-name-interpretation.sh