|  | #!/bin/sh | 
|  |  | 
|  | test_description='checkout and pathspecs/refspecs ambiguities' | 
|  |  | 
|  | GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | 
|  | export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | 
|  |  | 
|  | . ./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/main" = "$(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 'check ambiguity in subdir' ' | 
|  | mkdir sub && | 
|  | # not ambiguous because sub/world does not exist | 
|  | git -C sub checkout world ../all && | 
|  | echo hello >sub/world && | 
|  | # ambiguous because sub/world does exist | 
|  | test_must_fail git -C sub 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_expect_success 'accurate error message with more than one ref' ' | 
|  | test_must_fail git checkout HEAD main -- 2>actual && | 
|  | test_grep 2 actual && | 
|  | test_grep "one reference expected, 2 given" actual | 
|  | ' | 
|  |  | 
|  | test_done |