Browse Source
The patch is twofold: it moves the option consistency checks just under the parse_options call so that it doesn't get in the way of the tree reference vs. pathspecs desambiguation. The other part rewrites the way to understand arguments so that when git-checkout fails it does with an understandable message. Compared to the previous behavior we now have: - a better error message when doing: git checkout <blob reference> -- now complains about the reference not pointing to a tree, instead of things like: error: pathspec <blob reference> did not match any file(s) known to git. error: pathspec '--' did not match any file(s) known to git. - a better error message when doing: git checkout <path> -- It now complains about <path> not being a reference instead of the completely obscure: error: pathspec '--' did not match any file(s) known to git. - an error when -- wasn't used, and the first argument is ambiguous (i.e. can be interpreted as both ref and as path). Signed-off-by: Pierre Habouzit <madcoder@debian.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint
Pierre Habouzit
17 years ago
committed by
Junio C Hamano
2 changed files with 115 additions and 17 deletions
@ -0,0 +1,50 @@
@@ -0,0 +1,50 @@
|
||||
#!/bin/sh |
||||
|
||||
test_description='checkout and pathspecs/refspecs ambiguities' |
||||
|
||||
. ./test-lib.sh |
||||
|
||||
test_expect_success 'setup' ' |
||||
echo hello >world && |
||||
echo hello >all && |
||||
git add all world && |
||||
git commit -m initial && |
||||
git branch world |
||||
' |
||||
|
||||
test_expect_success 'reference must be a tree' ' |
||||
test_must_fail git checkout $(git hash-object ./all) -- |
||||
' |
||||
|
||||
test_expect_success 'branch switching' ' |
||||
test "refs/heads/master" = "$(git symbolic-ref HEAD)" && |
||||
git checkout world -- && |
||||
test "refs/heads/world" = "$(git symbolic-ref HEAD)" |
||||
' |
||||
|
||||
test_expect_success 'checkout world from the index' ' |
||||
echo bye > world && |
||||
git checkout -- world && |
||||
git diff --exit-code --quiet |
||||
' |
||||
|
||||
test_expect_success 'non ambiguous call' ' |
||||
git checkout all |
||||
' |
||||
|
||||
test_expect_success 'allow the most common case' ' |
||||
git checkout world && |
||||
test "refs/heads/world" = "$(git symbolic-ref HEAD)" |
||||
' |
||||
|
||||
test_expect_success 'check ambiguity' ' |
||||
test_must_fail git checkout world all |
||||
' |
||||
|
||||
test_expect_success 'disambiguate checking out from a tree-ish' ' |
||||
echo bye > world && |
||||
git checkout world -- world && |
||||
git diff --exit-code --quiet |
||||
' |
||||
|
||||
test_done |
Loading…
Reference in new issue