| #!/bin/sh | |
| test_description='clone --branch option' | |
| GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main | |
| export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME | |
| . ./test-lib.sh | |
| check_HEAD() { | |
| echo refs/heads/"$1" >expect && | |
| git symbolic-ref HEAD >actual && | |
| test_cmp expect actual | |
| } | |
| check_file() { | |
| echo "$1" >expect && | |
| test_cmp expect file | |
| } | |
| test_expect_success 'setup' ' | |
| mkdir parent && | |
| (cd parent && git init && | |
| echo one >file && git add file && git commit -m one && | |
| git checkout -b two && | |
| echo two >file && git add file && git commit -m two && | |
| git checkout main) && | |
| mkdir empty && | |
| (cd empty && git init) | |
| ' | |
| test_expect_success 'vanilla clone chooses HEAD' ' | |
| git clone parent clone && | |
| (cd clone && | |
| check_HEAD main && | |
| check_file one | |
| ) | |
| ' | |
| test_expect_success 'clone -b chooses specified branch' ' | |
| git clone -b two parent clone-two && | |
| (cd clone-two && | |
| check_HEAD two && | |
| check_file two | |
| ) | |
| ' | |
| test_expect_success 'clone -b sets up tracking' ' | |
| (cd clone-two && | |
| echo origin >expect && | |
| git config branch.two.remote >actual && | |
| echo refs/heads/two >>expect && | |
| git config branch.two.merge >>actual && | |
| test_cmp expect actual | |
| ) | |
| ' | |
| test_expect_success 'clone -b does not munge remotes/origin/HEAD' ' | |
| (cd clone-two && | |
| echo refs/remotes/origin/main >expect && | |
| git symbolic-ref refs/remotes/origin/HEAD >actual && | |
| test_cmp expect actual | |
| ) | |
| ' | |
| test_expect_success 'clone -b with bogus branch' ' | |
| test_must_fail git clone -b bogus parent clone-bogus | |
| ' | |
| test_expect_success 'clone -b not allowed with empty repos' ' | |
| test_must_fail git clone -b branch empty clone-branch-empty | |
| ' | |
| test_done |