-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
git-checkout: improve error messages, detect ambiguities.
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
- Loading branch information
Showing
2 changed files
with
115 additions
and
17 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 |