2007-12-19 15:43:50 +00:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='basic clone options'
|
2020-11-18 23:44:35 +00:00
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=main
|
tests: mark tests relying on the current default for `init.defaultBranch`
In addition to the manual adjustment to let the `linux-gcc` CI job run
the test suite with `master` and then with `main`, this patch makes sure
that GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME is set in all test scripts
that currently rely on the initial branch name being `master by default.
To determine which test scripts to mark up, the first step was to
force-set the default branch name to `master` in
- all test scripts that contain the keyword `master`,
- t4211, which expects `t/t4211/history.export` with a hard-coded ref to
initialize the default branch,
- t5560 because it sources `t/t556x_common` which uses `master`,
- t8002 and t8012 because both source `t/annotate-tests.sh` which also
uses `master`)
This trick was performed by this command:
$ sed -i '/^ *\. \.\/\(test-lib\|lib-\(bash\|cvs\|git-svn\)\|gitweb-lib\)\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' $(git grep -l master t/t[0-9]*.sh) \
t/t4211*.sh t/t5560*.sh t/t8002*.sh t/t8012*.sh
After that, careful, manual inspection revealed that some of the test
scripts containing the needle `master` do not actually rely on a
specific default branch name: either they mention `master` only in a
comment, or they initialize that branch specificially, or they do not
actually refer to the current default branch. Therefore, the
aforementioned modification was undone in those test scripts thusly:
$ git checkout HEAD -- \
t/t0027-auto-crlf.sh t/t0060-path-utils.sh \
t/t1011-read-tree-sparse-checkout.sh \
t/t1305-config-include.sh t/t1309-early-config.sh \
t/t1402-check-ref-format.sh t/t1450-fsck.sh \
t/t2024-checkout-dwim.sh \
t/t2106-update-index-assume-unchanged.sh \
t/t3040-subprojects-basic.sh t/t3301-notes.sh \
t/t3308-notes-merge.sh t/t3423-rebase-reword.sh \
t/t3436-rebase-more-options.sh \
t/t4015-diff-whitespace.sh t/t4257-am-interactive.sh \
t/t5323-pack-redundant.sh t/t5401-update-hooks.sh \
t/t5511-refspec.sh t/t5526-fetch-submodules.sh \
t/t5529-push-errors.sh t/t5530-upload-pack-error.sh \
t/t5548-push-porcelain.sh \
t/t5552-skipping-fetch-negotiator.sh \
t/t5572-pull-submodule.sh t/t5608-clone-2gb.sh \
t/t5614-clone-submodules-shallow.sh \
t/t7508-status.sh t/t7606-merge-custom.sh \
t/t9302-fast-import-unpack-limit.sh
We excluded one set of test scripts in these commands, though: the range
of `git p4` tests. The reason? `git p4` stores the (foreign) remote
branch in the branch called `p4/master`, which is obviously not the
default branch. Manual analysis revealed that only five of these tests
actually require a specific default branch name to pass; They were
modified thusly:
$ sed -i '/^ *\. \.\/lib-git-p4\.sh$/i\
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME=master\
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME\
' t/t980[0167]*.sh t/t9811*.sh
Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-11-18 23:44:19 +00:00
|
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
|
2023-02-06 23:07:54 +00:00
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
2007-12-19 15:43:50 +00:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
test_expect_success 'setup' '
|
|
|
|
|
|
|
|
mkdir parent &&
|
|
|
|
(cd parent && git init &&
|
|
|
|
echo one >file && git add file &&
|
2021-04-01 10:46:59 +00:00
|
|
|
git commit -m one) &&
|
|
|
|
git clone --depth=1 --no-local parent shallow-repo
|
2007-12-19 15:43:50 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
2021-08-14 01:09:56 +00:00
|
|
|
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
|
|
|
|
|
|
|
|
'
|
|
|
|
|
2007-12-19 15:43:50 +00:00
|
|
|
test_expect_success 'clone -o' '
|
|
|
|
|
|
|
|
git clone -o foo parent clone-o &&
|
2020-11-18 23:44:35 +00:00
|
|
|
git -C clone-o rev-parse --verify refs/remotes/foo/main
|
2020-09-29 03:36:49 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
2020-10-01 03:46:16 +00:00
|
|
|
test_expect_success 'rejects invalid -o/--origin' '
|
|
|
|
|
|
|
|
test_must_fail git clone -o "bad...name" parent clone-bad-name 2>err &&
|
2023-10-31 05:23:30 +00:00
|
|
|
test_grep "'\''bad...name'\'' is not a valid remote name" err
|
2020-10-01 03:46:16 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
clone: allow "--bare" with "-o"
We explicitly forbid the combination of "--bare" with "-o", but there
doesn't seem to be any good reason to do so. The original logic came as
part of e6489a1bdf (clone: do not accept more than one -o option.,
2006-01-22), but that commit does not give any reason.
Furthermore, the equivalent combination via config is allowed:
git -c clone.defaultRemoteName=foo clone ...
and works as expected. It may be that this combination was considered
useless, because a bare clone does not set remote.origin.fetch (and
hence there is no refs/remotes/origin hierarchy). But it does set
remote.origin.url, and that name is visible to the user via "git fetch
origin", etc.
Let's allow the options to be used together, and switch the "forbid"
test in t5606 to check that we use the requested name. That test came
much later in 349cff76de (clone: add tests for --template and some
disallowed option pairs, 2020-09-29), and does not offer any logic
beyond "let's test what the code currently does".
Reported-by: John A. Leuenhagen <john@zlima12.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-09-22 05:32:05 +00:00
|
|
|
test_expect_success 'clone --bare -o' '
|
2020-09-29 03:36:49 +00:00
|
|
|
|
clone: allow "--bare" with "-o"
We explicitly forbid the combination of "--bare" with "-o", but there
doesn't seem to be any good reason to do so. The original logic came as
part of e6489a1bdf (clone: do not accept more than one -o option.,
2006-01-22), but that commit does not give any reason.
Furthermore, the equivalent combination via config is allowed:
git -c clone.defaultRemoteName=foo clone ...
and works as expected. It may be that this combination was considered
useless, because a bare clone does not set remote.origin.fetch (and
hence there is no refs/remotes/origin hierarchy). But it does set
remote.origin.url, and that name is visible to the user via "git fetch
origin", etc.
Let's allow the options to be used together, and switch the "forbid"
test in t5606 to check that we use the requested name. That test came
much later in 349cff76de (clone: add tests for --template and some
disallowed option pairs, 2020-09-29), and does not offer any logic
beyond "let's test what the code currently does".
Reported-by: John A. Leuenhagen <john@zlima12.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-09-22 05:32:05 +00:00
|
|
|
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
|
2020-09-29 03:36:49 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
|
|
|
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" &&
|
2023-10-31 05:23:30 +00:00
|
|
|
test_grep -e "options .--bare. and .--separate-git-dir. cannot be used together" err
|
2020-09-29 03:36:49 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
2022-08-09 13:11:43 +00:00
|
|
|
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 &&
|
2023-11-26 11:57:43 +00:00
|
|
|
grep "bundle-uri.* cannot be used together" err || return 1
|
2022-08-09 13:11:43 +00:00
|
|
|
done
|
|
|
|
'
|
|
|
|
|
2021-04-01 10:46:59 +00:00
|
|
|
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 &&
|
2023-10-31 05:23:30 +00:00
|
|
|
test_grep -e "source repository is shallow, reject to clone." err &&
|
2021-04-01 10:46:59 +00:00
|
|
|
|
|
|
|
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 &&
|
2023-10-31 05:23:30 +00:00
|
|
|
test_grep -e "source repository is shallow, reject to clone." err &&
|
2021-04-01 10:46:59 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2020-09-29 03:36:49 +00:00
|
|
|
test_expect_success 'uses "origin" for default remote name' '
|
|
|
|
|
|
|
|
git clone parent clone-default-origin &&
|
2020-11-18 23:44:35 +00:00
|
|
|
git -C clone-default-origin rev-parse --verify refs/remotes/origin/main
|
2020-09-29 03:36:49 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
|
|
|
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"
|
2007-12-19 15:43:50 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
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 15:18:11 +00:00
|
|
|
test_expect_success 'ignore --template config for core.bare' '
|
2023-05-16 06:33:41 +00:00
|
|
|
|
|
|
|
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 &&
|
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 15:18:11 +00:00
|
|
|
test "$(git -C clone-bare-config config --local core.bare)" = "false" &&
|
|
|
|
test_path_is_missing clone-bare-config/HEAD
|
2023-05-16 06:33:41 +00:00
|
|
|
'
|
|
|
|
|
2020-10-01 03:46:16 +00:00
|
|
|
test_expect_success 'prefers config "clone.defaultRemoteName" over default' '
|
|
|
|
|
|
|
|
test_config_global clone.defaultRemoteName from_config &&
|
|
|
|
git clone parent clone-config-origin &&
|
2020-11-18 23:44:35 +00:00
|
|
|
git -C clone-config-origin rev-parse --verify refs/remotes/from_config/main
|
2020-10-01 03:46:16 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'prefers --origin over -c config' '
|
|
|
|
|
|
|
|
git clone -c clone.defaultRemoteName=inline --origin from_option parent clone-o-and-inline-config &&
|
2020-11-18 23:44:35 +00:00
|
|
|
git -C clone-o-and-inline-config rev-parse --verify refs/remotes/from_option/main
|
2020-10-01 03:46:16 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
2013-09-18 20:05:13 +00:00
|
|
|
test_expect_success 'redirected clone does not show progress' '
|
2008-10-08 23:40:32 +00:00
|
|
|
|
|
|
|
git clone "file://$(pwd)/parent" clone-redirected >out 2>err &&
|
2013-09-18 20:06:50 +00:00
|
|
|
! grep % err &&
|
2023-10-31 05:23:30 +00:00
|
|
|
test_grep ! "Checking connectivity" err
|
2008-10-08 23:40:32 +00:00
|
|
|
|
|
|
|
'
|
2013-09-18 20:05:13 +00:00
|
|
|
|
|
|
|
test_expect_success 'redirected clone -v does show progress' '
|
2008-10-08 23:40:32 +00:00
|
|
|
|
2009-12-25 17:12:06 +00:00
|
|
|
git clone --progress "file://$(pwd)/parent" clone-redirected-progress \
|
|
|
|
>out 2>err &&
|
2013-09-18 20:05:13 +00:00
|
|
|
grep % err
|
2008-10-08 23:40:32 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
builtin/init-db: handle bare clones when core.bare set to false
In 552955ed7f ("clone: use more conventional config/option layering",
2020-10-01), clone learned to read configuration options earlier in its
execution, before creating the new repository. However, that led to a
problem: if the core.bare setting is set to false in the global config,
cloning a bare repository segfaults. This happens because the
repository is falsely thought to be non-bare, but clone has set the work
tree to NULL, which is then dereferenced.
The code to initialize the repository already considers the fact that a
user might want to override the --bare option for git init, but it
doesn't take into account clone, which uses a different option. Let's
just check that the work tree is not NULL, since that's how clone
indicates that the repository is bare. This is also the case for git
init, so we won't be regressing that case.
Reported-by: Joseph Vusich <jvusich@amazon.com>
Signed-off-by: brian m. carlson <sandals@crustytoothpaste.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-03-10 01:11:20 +00:00
|
|
|
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
|
|
|
|
'
|
|
|
|
|
2020-06-24 14:46:34 +00:00
|
|
|
test_expect_success 'chooses correct default initial branch name' '
|
2021-02-05 20:48:49 +00:00
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \
|
|
|
|
git -c init.defaultBranch=foo init --bare empty &&
|
|
|
|
test_config -C empty lsrefs.unborn advertise &&
|
2020-10-23 14:00:00 +00:00
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \
|
2021-03-17 15:42:00 +00:00
|
|
|
git -c init.defaultBranch=up -c protocol.version=2 clone empty whats-up &&
|
2021-02-05 20:48:49 +00:00
|
|
|
test refs/heads/foo = $(git -C whats-up symbolic-ref HEAD) &&
|
|
|
|
test refs/heads/foo = $(git -C whats-up config branch.foo.merge)
|
2020-06-24 14:46:34 +00:00
|
|
|
'
|
|
|
|
|
|
|
|
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 &&
|
2020-06-24 14:46:35 +00:00
|
|
|
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 &&
|
2020-10-23 14:00:00 +00:00
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \
|
2020-06-24 14:46:35 +00:00
|
|
|
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 &&
|
2020-10-23 14:00:00 +00:00
|
|
|
GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME= \
|
2020-06-24 14:46:35 +00:00
|
|
|
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)
|
2020-06-24 14:46:34 +00:00
|
|
|
'
|
|
|
|
|
2007-12-19 15:43:50 +00:00
|
|
|
test_done
|