Jeff King [off-list ref] writes:
Here is the test script I worked out which shows the issue (and checks
that the right messages are shown to the user):
This is a band-aid that is not quite right (even though it passes the
tests). Attempting to check out a branch "frotz" in a repository with a
tag "frotz" that point at a non-commit would still fail, which is not a
new problem.
builtin/checkout.c | 7 +++++++
t/t2019-checkout-amiguous-ref.sh | 23 ++++++++++++++++++++++-
2 files changed, 29 insertions(+), 1 deletions(-)
diff --git a/builtin/checkout.c b/builtin/checkout.c
index a54583b..f6fea2f 100644
--- a/builtin/checkout.c
+++ b/builtin/checkout.c
@@ -840,6 +840,13 @@ int cmd_checkout(int argc, const char **argv, const char *prefix)
;
else
new.path = NULL;
+ if (hashcmp(new.commit->object.sha1, rev))
+ /*
+ * Yikes, arg is an ambiguous and higher
+ * precedence SHA-1 expression than the
+ * branch name
+ */
+ new.commit = lookup_commit_reference_gently(rev, 1);
parse_commit(new.commit);
source_tree = new.commit->tree;
} else
diff --git a/t/t2019-checkout-amiguous-ref.sh b/t/t2019-checkout-amiguous-ref.sh
index 0981f11..fa1d4e6 100755
--- a/t/t2019-checkout-amiguous-ref.sh
+++ b/t/t2019-checkout-amiguous-ref.sh
@@ -6,8 +6,10 @@ test_description='checkout handling of ambiguous (branch/tag) refs'
test_expect_success 'setup ambiguous refs' '
test_commit branch file &&
git branch ambiguity &&
+ git branch vagueness &&
test_commit tag file &&
git tag ambiguity &&
+ git tag vagueness HEAD:file &&
test_commit other file
'
@@ -19,7 +21,7 @@ test_expect_success 'checkout produces ambiguity warning' '
grep "warning.*ambiguous" stderr
'
-test_expect_failure 'checkout chooses branch over tag' '
+test_expect_success 'checkout chooses branch over tag' '
echo branch >expect &&
test_cmp expect file
'
@@ -29,4 +31,23 @@ test_expect_success 'checkout reports switch to detached HEAD' '
! grep "^HEAD is now at" stderr
'
+test_expect_failure 'checkout vague ref succeeds' '
+ git checkout vagueness >stdout 2>stderr &&
+ test_set_prereq VAGUENESS_SUCCESS
+'
+
+test_expect_success VAGUENESS_SUCCESS 'checkout produces ambiguity warning' '
+ grep "warning.*ambiguous" stderr
+'
+
+test_expect_success VAGUENESS_SUCCESS 'checkout chooses branch over tag' '
+ echo branch >expect &&
+ test_cmp expect file
+'
+
+test_expect_success VAGUENESS_SUCCESS 'checkout reports switch to detached HEAD' '
+ grep "Switched to branch" stderr &&
+ ! grep "^HEAD is now at" stderr
+'
+
test_done