| #!/bin/sh |
| |
| test_description='checkout switching away from an invalid branch' |
| |
| 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 && |
| git add world && |
| git commit -m initial |
| ' |
| |
| test_expect_success 'checkout should not start branch from a tree' ' |
| test_must_fail git checkout -b newbranch main^{tree} |
| ' |
| |
| test_expect_success 'checkout main from invalid HEAD' ' |
| echo $ZERO_OID >.git/HEAD && |
| git checkout main -- |
| ' |
| |
| test_expect_success 'checkout notices failure to lock HEAD' ' |
| test_when_finished "rm -f .git/HEAD.lock" && |
| >.git/HEAD.lock && |
| test_must_fail git checkout -b other |
| ' |
| |
| test_expect_success 'create ref directory/file conflict scenario' ' |
| git update-ref refs/heads/outer/inner main && |
| |
| # do not rely on symbolic-ref to get a known state, |
| # as it may use the same code we are testing |
| reset_to_df () { |
| echo "ref: refs/heads/outer" >.git/HEAD |
| } |
| ' |
| |
| test_expect_success 'checkout away from d/f HEAD (unpacked, to branch)' ' |
| reset_to_df && |
| git checkout main |
| ' |
| |
| test_expect_success 'checkout away from d/f HEAD (unpacked, to detached)' ' |
| reset_to_df && |
| git checkout --detach main |
| ' |
| |
| test_expect_success 'pack refs' ' |
| git pack-refs --all --prune |
| ' |
| |
| test_expect_success 'checkout away from d/f HEAD (packed, to branch)' ' |
| reset_to_df && |
| git checkout main |
| ' |
| |
| test_expect_success 'checkout away from d/f HEAD (packed, to detached)' ' |
| reset_to_df && |
| git checkout --detach main |
| ' |
| test_done |