| #!/bin/sh |
| |
| test_description='checkout and pathspecs/refspecs ambiguities' |
| |
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main |
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME |
| |
| TEST_PASSES_SANITIZE_LEAK=true |
| . ./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 |