1
0
Fork 0
mirror of https://github.com/git/git.git synced 2024-06-02 00:06:11 +02:00
git/t/t5606-clone-options.sh
Ghanshyam Thakkar 8145a8fd02 setup: remove unnecessary variable
The TODO comment suggested to heed core.bare from template config file
if no command line override given. And the prev_bare_repository
variable seems to have been placed for this sole purpose as it is not
used anywhere else.

However, it was clarified by Junio [1] that such values (including
core.bare) are ignored intentionally and does not make sense to
propagate them from template config to repository config. Also, the
directories for the worktree and repository are already created, and
therefore the bare/non-bare decision has already been made, by the
point we reach the codepath where the TODO comment is placed.
Therefore, prev_bare_repository does not have a usecase with/without
supporting core.bare from template. And the removal of
prev_bare_repository is safe as proved by the later part of the
comment:

    "Unfortunately, the line above is equivalent to
        is_bare_repository_cfg = !work_tree;
    which ignores the config entirely even if no `--[no-]bare`
    command line option was present.

    To see why, note that before this function, there was this call:
        prev_bare_repository = is_bare_repository()
    expanding the right hand side:
        = is_bare_repository_cfg && !get_git_work_tree()
        = is_bare_repository_cfg && !work_tree
    note that the last simplification above is valid because nothing
    calls repo_init() or set_git_work_tree() between any of the
    relevant calls in the code, and thus the !get_git_work_tree()
    calls will return the same result each time.  So, what we are
    interested in computing is the right hand side of the line of
    code just above this comment:
        prev_bare_repository || !work_tree
        = is_bare_repository_cfg && !work_tree || !work_tree
        = !work_tree
    because "A && !B || !B == !B" for all boolean values of A & B."

Therefore, remove the TODO comment and remove prev_bare_repository
variable. Also, update relevant testcases and remove one redundant
testcase.

[1]: https://lore.kernel.org/git/xmqqjzonpy9l.fsf@gitster.g/

Helped-by: Elijah Newren <newren@gmail.com>
Helped-by: Junio C Hamano <gitster@pobox.com>
Signed-off-by: Ghanshyam Thakkar <shyamthakkar001@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2024-03-04 10:18:31 -08:00

202 lines
6.5 KiB
Bash
Executable File

#!/bin/sh
test_description='basic clone options'
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' '
mkdir parent &&
(cd parent && git init &&
echo one >file && git add file &&
git commit -m one) &&
git clone --depth=1 --no-local parent shallow-repo
'
test_expect_success 'submodule.stickyRecursiveClone flag manipulates submodule.recurse value' '
test_config_global submodule.stickyRecursiveClone true &&
git clone --recurse-submodules parent clone_recurse_true &&
test_cmp_config -C clone_recurse_true true submodule.recurse &&
test_config_global submodule.stickyRecursiveClone false &&
git clone --recurse-submodules parent clone_recurse_false &&
test_expect_code 1 git -C clone_recurse_false config --get submodule.recurse
'
test_expect_success 'clone -o' '
git clone -o foo parent clone-o &&
git -C clone-o rev-parse --verify refs/remotes/foo/main
'
test_expect_success 'rejects invalid -o/--origin' '
test_must_fail git clone -o "bad...name" parent clone-bad-name 2>err &&
test_grep "'\''bad...name'\'' is not a valid remote name" err
'
test_expect_success 'clone --bare -o' '
git clone -o foo --bare parent clone-bare-o &&
(cd parent && pwd) >expect &&
git -C clone-bare-o config remote.foo.url >actual &&
test_cmp expect actual
'
test_expect_success 'disallows --bare with --separate-git-dir' '
test_must_fail git clone --bare --separate-git-dir dot-git-destiation parent clone-bare-sgd 2>err &&
test_debug "cat err" &&
test_grep -e "options .--bare. and .--separate-git-dir. cannot be used together" err
'
test_expect_success 'disallows --bundle-uri with shallow options' '
for option in --depth=1 --shallow-since=01-01-2000 --shallow-exclude=HEAD
do
test_must_fail git clone --bundle-uri=bundle $option from to 2>err &&
grep "bundle-uri.* cannot be used together" err || return 1
done
'
test_expect_success 'reject cloning shallow repository' '
test_when_finished "rm -rf repo" &&
test_must_fail git clone --reject-shallow shallow-repo out 2>err &&
test_grep -e "source repository is shallow, reject to clone." err &&
git clone --no-reject-shallow shallow-repo repo
'
test_expect_success 'reject cloning non-local shallow repository' '
test_when_finished "rm -rf repo" &&
test_must_fail git clone --reject-shallow --no-local shallow-repo out 2>err &&
test_grep -e "source repository is shallow, reject to clone." err &&
git clone --no-reject-shallow --no-local shallow-repo repo
'
test_expect_success 'succeed cloning normal repository' '
test_when_finished "rm -rf chilad1 child2 child3 child4 " &&
git clone --reject-shallow parent child1 &&
git clone --reject-shallow --no-local parent child2 &&
git clone --no-reject-shallow parent child3 &&
git clone --no-reject-shallow --no-local parent child4
'
test_expect_success 'uses "origin" for default remote name' '
git clone parent clone-default-origin &&
git -C clone-default-origin rev-parse --verify refs/remotes/origin/main
'
test_expect_success 'prefers --template config over normal config' '
template="$TRASH_DIRECTORY/template-with-config" &&
mkdir "$template" &&
git config --file "$template/config" foo.bar from_template &&
test_config_global foo.bar from_global &&
git clone "--template=$template" parent clone-template-config &&
test "$(git -C clone-template-config config --local foo.bar)" = "from_template"
'
test_expect_success 'prefers -c config over --template config' '
template="$TRASH_DIRECTORY/template-with-ignored-config" &&
mkdir "$template" &&
git config --file "$template/config" foo.bar from_template &&
git clone "--template=$template" -c foo.bar=inline parent clone-template-inline-config &&
test "$(git -C clone-template-inline-config config --local foo.bar)" = "inline"
'
test_expect_success 'ignore --template config for core.bare' '
template="$TRASH_DIRECTORY/template-with-bare-config" &&
mkdir "$template" &&
git config --file "$template/config" core.bare true &&
git clone "--template=$template" parent clone-bare-config &&
test "$(git -C clone-bare-config config --local core.bare)" = "false" &&
test_path_is_missing clone-bare-config/HEAD
'
test_expect_success 'prefers config "clone.defaultRemoteName" over default' '
test_config_global clone.defaultRemoteName from_config &&
git clone parent clone-config-origin &&
git -C clone-config-origin rev-parse --verify refs/remotes/from_config/main
'
test_expect_success 'prefers --origin over -c config' '
git clone -c clone.defaultRemoteName=inline --origin from_option parent clone-o-and-inline-config &&
git -C clone-o-and-inline-config rev-parse --verify refs/remotes/from_option/main
'
test_expect_success 'redirected clone does not show progress' '
git clone "file://$(pwd)/parent" clone-redirected >out 2>err &&
! grep % err &&
test_grep ! "Checking connectivity" err
'
test_expect_success 'redirected clone -v does show progress' '
git clone --progress "file://$(pwd)/parent" clone-redirected-progress \
>out 2>err &&
grep % err
'
test_expect_success 'clone does not segfault with --bare and core.bare=false' '
test_config_global core.bare false &&
git clone --bare parent clone-bare &&
echo true >expect &&
git -C clone-bare rev-parse --is-bare-repository >actual &&
test_cmp expect actual
'
test_expect_success 'chooses correct default initial branch name' '
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \
git -c init.defaultBranch=foo init --bare empty &&
test_config -C empty lsrefs.unborn advertise &&
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \
git -c init.defaultBranch=up -c protocol.version=2 clone empty whats-up &&
test refs/heads/foo = $(git -C whats-up symbolic-ref HEAD) &&
test refs/heads/foo = $(git -C whats-up config branch.foo.merge)
'
test_expect_success 'guesses initial branch name correctly' '
git init --initial-branch=guess initial-branch &&
test_commit -C initial-branch no-spoilers &&
git -C initial-branch branch abc guess &&
git clone initial-branch is-it &&
test refs/heads/guess = $(git -C is-it symbolic-ref HEAD) &&
git -c init.defaultBranch=none init --bare no-head &&
git -C initial-branch push ../no-head guess abc &&
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \
git clone no-head is-it2 &&
test_must_fail git -C is-it2 symbolic-ref refs/remotes/origin/HEAD &&
git -C no-head update-ref --no-deref HEAD refs/heads/guess &&
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \
git -c init.defaultBranch=guess clone no-head is-it3 &&
test refs/remotes/origin/guess = \
$(git -C is-it3 symbolic-ref refs/remotes/origin/HEAD)
'
test_done