Junio C Hamano <gitster@xxxxxxxxx> writes: > Jeff King <peff@xxxxxxxx> 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(-) ... And this comes on top (should probably be squashed into one) to really favor a branch over a tag. builtin/checkout.c | 26 ++++++++++---------------- t/t2019-checkout-amiguous-ref.sh | 2 +- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/builtin/checkout.c b/builtin/checkout.c index f6fea2f..48e547b 100644 --- a/builtin/checkout.c +++ b/builtin/checkout.c @@ -832,25 +832,19 @@ int cmd_checkout(int argc, const char **argv, const char *prefix) argc--; new.name = arg; - if ((new.commit = lookup_commit_reference_gently(rev, 1))) { - setup_branch_path(&new); + setup_branch_path(&new); - if ((check_ref_format(new.path) == CHECK_REF_FORMAT_OK) && - resolve_ref(new.path, rev, 1, NULL)) - ; - 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); + if ((check_ref_format(new.path) != CHECK_REF_FORMAT_OK) || + !resolve_ref(new.path, rev, 1, NULL)) + new.path = NULL; /* not an existing branch */ + + if (!(new.commit = lookup_commit_reference_gently(rev, 1))) { + /* not a commit */ + source_tree = parse_tree_indirect(rev); + } else { parse_commit(new.commit); source_tree = new.commit->tree; - } else - source_tree = parse_tree_indirect(rev); + } if (!source_tree) /* case (1): want a tree */ die("reference is not a tree: %s", arg); diff --git a/t/t2019-checkout-amiguous-ref.sh b/t/t2019-checkout-amiguous-ref.sh index fa1d4e6..e2b330b 100755 --- a/t/t2019-checkout-amiguous-ref.sh +++ b/t/t2019-checkout-amiguous-ref.sh @@ -31,7 +31,7 @@ test_expect_success 'checkout reports switch to detached HEAD' ' ! grep "^HEAD is now at" stderr ' -test_expect_failure 'checkout vague ref succeeds' ' +test_expect_success 'checkout vague ref succeeds' ' git checkout vagueness >stdout 2>stderr && test_set_prereq VAGUENESS_SUCCESS ' -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html