2012-09-20 20:04:08 +02:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='test refspec written by clone-command'
|
2020-11-19 00:44:35 +01: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-19 00:44:19 +01:00
|
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
|
2012-09-20 20:04:08 +02:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
test_expect_success 'setup' '
|
2020-11-19 00:44:35 +01:00
|
|
|
# Make two branches, "main" and "side"
|
2012-09-20 20:04:08 +02:00
|
|
|
echo one >file &&
|
|
|
|
git add file &&
|
|
|
|
git commit -m one &&
|
|
|
|
echo two >file &&
|
|
|
|
git commit -a -m two &&
|
|
|
|
git tag two &&
|
|
|
|
echo three >file &&
|
|
|
|
git commit -a -m three &&
|
|
|
|
git checkout -b side &&
|
|
|
|
echo four >file &&
|
|
|
|
git commit -a -m four &&
|
2020-11-19 00:44:35 +01:00
|
|
|
git checkout main &&
|
2017-04-27 01:12:33 +02:00
|
|
|
git tag five &&
|
2012-09-20 20:04:08 +02:00
|
|
|
|
|
|
|
# default clone
|
|
|
|
git clone . dir_all &&
|
|
|
|
|
2017-04-27 01:12:33 +02:00
|
|
|
# default clone --no-tags
|
|
|
|
git clone --no-tags . dir_all_no_tags &&
|
|
|
|
|
2020-11-19 00:44:35 +01:00
|
|
|
# default --single that follows HEAD=main
|
|
|
|
git clone --single-branch . dir_main &&
|
2012-09-20 20:04:08 +02:00
|
|
|
|
2020-11-19 00:44:35 +01:00
|
|
|
# default --single that follows HEAD=main with no tags
|
|
|
|
git clone --single-branch --no-tags . dir_main_no_tags &&
|
2017-04-27 01:12:33 +02:00
|
|
|
|
2012-09-20 20:04:08 +02:00
|
|
|
# default --single that follows HEAD=side
|
|
|
|
git checkout side &&
|
|
|
|
git clone --single-branch . dir_side &&
|
|
|
|
|
|
|
|
# explicit --single that follows side
|
2020-11-19 00:44:35 +01:00
|
|
|
git checkout main &&
|
2012-09-20 20:04:08 +02:00
|
|
|
git clone --single-branch --branch side . dir_side2 &&
|
|
|
|
|
|
|
|
# default --single with --mirror
|
|
|
|
git clone --single-branch --mirror . dir_mirror &&
|
|
|
|
|
|
|
|
# default --single with --branch and --mirror
|
|
|
|
git clone --single-branch --mirror --branch side . dir_mirror_side &&
|
|
|
|
|
|
|
|
# --single that does not know what branch to follow
|
|
|
|
git checkout two^ &&
|
|
|
|
git clone --single-branch . dir_detached &&
|
|
|
|
|
|
|
|
# explicit --single with tag
|
|
|
|
git clone --single-branch --branch two . dir_tag &&
|
|
|
|
|
2017-04-27 01:12:33 +02:00
|
|
|
# explicit --single with tag and --no-tags
|
|
|
|
git clone --single-branch --no-tags --branch two . dir_tag_no_tags &&
|
|
|
|
|
2020-11-19 00:44:35 +01:00
|
|
|
# advance both "main" and "side" branches
|
2012-09-20 20:04:08 +02:00
|
|
|
git checkout side &&
|
|
|
|
echo five >file &&
|
|
|
|
git commit -a -m five &&
|
2020-11-19 00:44:35 +01:00
|
|
|
git checkout main &&
|
2012-09-20 20:04:08 +02:00
|
|
|
echo six >file &&
|
|
|
|
git commit -a -m six &&
|
|
|
|
|
|
|
|
# update tag
|
|
|
|
git tag -d two && git tag two
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'by default all branches will be kept updated' '
|
|
|
|
(
|
2017-04-27 01:12:32 +02:00
|
|
|
cd dir_all &&
|
|
|
|
git fetch &&
|
2020-03-26 09:27:54 +01:00
|
|
|
git for-each-ref refs/remotes/origin >refs &&
|
2012-09-20 20:04:08 +02:00
|
|
|
sed -e "/HEAD$/d" \
|
2020-03-26 09:27:54 +01:00
|
|
|
-e "s|/remotes/origin/|/heads/|" refs >../actual
|
2012-09-20 20:04:08 +02:00
|
|
|
) &&
|
2020-11-19 00:44:35 +01:00
|
|
|
# follow both main and side
|
2012-09-20 20:04:08 +02:00
|
|
|
git for-each-ref refs/heads >expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'by default no tags will be kept updated' '
|
|
|
|
(
|
2017-04-27 01:12:32 +02:00
|
|
|
cd dir_all &&
|
|
|
|
git fetch &&
|
2012-09-20 20:04:08 +02:00
|
|
|
git for-each-ref refs/tags >../actual
|
|
|
|
) &&
|
|
|
|
git for-each-ref refs/tags >expect &&
|
2020-03-26 09:27:53 +01:00
|
|
|
! test_cmp expect actual &&
|
2017-04-27 01:12:33 +02:00
|
|
|
test_line_count = 2 actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'clone with --no-tags' '
|
|
|
|
(
|
|
|
|
cd dir_all_no_tags &&
|
2021-02-25 02:21:16 +01:00
|
|
|
grep tagOpt .git/config &&
|
2017-04-27 01:12:33 +02:00
|
|
|
git fetch &&
|
|
|
|
git for-each-ref refs/tags >../actual
|
|
|
|
) &&
|
2018-07-27 19:48:11 +02:00
|
|
|
test_must_be_empty actual
|
2012-09-20 20:04:08 +02:00
|
|
|
'
|
|
|
|
|
2020-11-19 00:44:35 +01:00
|
|
|
test_expect_success '--single-branch while HEAD pointing at main' '
|
2012-09-20 20:04:08 +02:00
|
|
|
(
|
2020-11-19 00:44:35 +01:00
|
|
|
cd dir_main &&
|
fetch: stop clobbering existing tags without --force
Change "fetch" to treat "+" in refspecs (aka --force) to mean we
should clobber a local tag of the same name.
This changes the long-standing behavior of "fetch" added in
853a3697dc ("[PATCH] Multi-head fetch.", 2005-08-20). Before this
change, all tag fetches effectively had --force enabled. See the
git-fetch-script code in fast_forward_local() with the comment:
> Tags need not be pointing at commits so there is no way to
> guarantee "fast-forward" anyway.
That commit and the rest of the history of "fetch" shows that the
"+" (--force) part of refpecs was only conceived for branch updates,
while tags have accepted any changes from upstream unconditionally and
clobbered the local tag object. Changing this behavior has been
discussed as early as 2011[1].
The current behavior doesn't make sense to me, it easily results in
local tags accidentally being clobbered. We could namespace our tags
per-remote and not locally populate refs/tags/*, but as with my
97716d217c ("fetch: add a --prune-tags option and fetch.pruneTags
config", 2018-02-09) it's easier to work around the current
implementation than to fix the root cause.
So this change implements suggestion #1 from Jeff's 2011 E-Mail[1],
"fetch" now only clobbers the tag if either "+" is provided as part of
the refspec, or if "--force" is provided on the command-line.
This also makes it nicely symmetrical with how "tag" itself works when
creating tags. I.e. we refuse to clobber any existing tags unless
"--force" is supplied. Now we can refuse all such clobbering, whether
it would happen by clobbering a local tag with "tag", or by fetching
it from the remote with "fetch".
Ref updates outside refs/{tags,heads/* are still still not symmetrical
with how "git push" works, as discussed in the recently changed
pull-fetch-param.txt documentation. This change brings the two
divergent behaviors more into line with one another. I don't think
there's any reason "fetch" couldn't fully converge with the behavior
used by "push", but that's a topic for another change.
One of the tests added in 31b808a032 ("clone --single: limit the fetch
refspec to fetched branch", 2012-09-20) is being changed to use
--force where a clone would clobber a tag. This changes nothing about
the existing behavior of the test.
1. https://public-inbox.org/git/20111123221658.GA22313@sigill.intra.peff.net/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-08-31 22:10:04 +02:00
|
|
|
git fetch --force &&
|
2020-03-26 09:27:54 +01:00
|
|
|
git for-each-ref refs/remotes/origin >refs &&
|
2012-09-20 20:04:08 +02:00
|
|
|
sed -e "/HEAD$/d" \
|
2020-03-26 09:27:54 +01:00
|
|
|
-e "s|/remotes/origin/|/heads/|" refs >../actual
|
2012-09-20 20:04:08 +02:00
|
|
|
) &&
|
2020-11-19 00:44:35 +01:00
|
|
|
# only follow main
|
|
|
|
git for-each-ref refs/heads/main >expect &&
|
2017-04-27 01:12:33 +02:00
|
|
|
# get & check latest tags
|
|
|
|
test_cmp expect actual &&
|
|
|
|
(
|
2020-11-19 00:44:35 +01:00
|
|
|
cd dir_main &&
|
fetch: stop clobbering existing tags without --force
Change "fetch" to treat "+" in refspecs (aka --force) to mean we
should clobber a local tag of the same name.
This changes the long-standing behavior of "fetch" added in
853a3697dc ("[PATCH] Multi-head fetch.", 2005-08-20). Before this
change, all tag fetches effectively had --force enabled. See the
git-fetch-script code in fast_forward_local() with the comment:
> Tags need not be pointing at commits so there is no way to
> guarantee "fast-forward" anyway.
That commit and the rest of the history of "fetch" shows that the
"+" (--force) part of refpecs was only conceived for branch updates,
while tags have accepted any changes from upstream unconditionally and
clobbered the local tag object. Changing this behavior has been
discussed as early as 2011[1].
The current behavior doesn't make sense to me, it easily results in
local tags accidentally being clobbered. We could namespace our tags
per-remote and not locally populate refs/tags/*, but as with my
97716d217c ("fetch: add a --prune-tags option and fetch.pruneTags
config", 2018-02-09) it's easier to work around the current
implementation than to fix the root cause.
So this change implements suggestion #1 from Jeff's 2011 E-Mail[1],
"fetch" now only clobbers the tag if either "+" is provided as part of
the refspec, or if "--force" is provided on the command-line.
This also makes it nicely symmetrical with how "tag" itself works when
creating tags. I.e. we refuse to clobber any existing tags unless
"--force" is supplied. Now we can refuse all such clobbering, whether
it would happen by clobbering a local tag with "tag", or by fetching
it from the remote with "fetch".
Ref updates outside refs/{tags,heads/* are still still not symmetrical
with how "git push" works, as discussed in the recently changed
pull-fetch-param.txt documentation. This change brings the two
divergent behaviors more into line with one another. I don't think
there's any reason "fetch" couldn't fully converge with the behavior
used by "push", but that's a topic for another change.
One of the tests added in 31b808a032 ("clone --single: limit the fetch
refspec to fetched branch", 2012-09-20) is being changed to use
--force where a clone would clobber a tag. This changes nothing about
the existing behavior of the test.
1. https://public-inbox.org/git/20111123221658.GA22313@sigill.intra.peff.net/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-08-31 22:10:04 +02:00
|
|
|
git fetch --tags --force &&
|
2017-04-27 01:12:33 +02:00
|
|
|
git for-each-ref refs/tags >../actual
|
|
|
|
) &&
|
|
|
|
git for-each-ref refs/tags >expect &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
test_line_count = 2 actual
|
|
|
|
'
|
|
|
|
|
2020-11-19 00:44:35 +01:00
|
|
|
test_expect_success '--single-branch while HEAD pointing at main and --no-tags' '
|
2017-04-27 01:12:33 +02:00
|
|
|
(
|
2020-11-19 00:44:35 +01:00
|
|
|
cd dir_main_no_tags &&
|
2017-04-27 01:12:33 +02:00
|
|
|
git fetch &&
|
2020-03-26 09:27:54 +01:00
|
|
|
git for-each-ref refs/remotes/origin >refs &&
|
2017-04-27 01:12:33 +02:00
|
|
|
sed -e "/HEAD$/d" \
|
2020-03-26 09:27:54 +01:00
|
|
|
-e "s|/remotes/origin/|/heads/|" refs >../actual
|
2017-04-27 01:12:33 +02:00
|
|
|
) &&
|
2020-11-19 00:44:35 +01:00
|
|
|
# only follow main
|
|
|
|
git for-each-ref refs/heads/main >expect &&
|
2017-04-27 01:12:33 +02:00
|
|
|
test_cmp expect actual &&
|
|
|
|
# get tags (noop)
|
|
|
|
(
|
2020-11-19 00:44:35 +01:00
|
|
|
cd dir_main_no_tags &&
|
2017-04-27 01:12:33 +02:00
|
|
|
git fetch &&
|
|
|
|
git for-each-ref refs/tags >../actual
|
|
|
|
) &&
|
2018-07-27 19:48:11 +02:00
|
|
|
test_must_be_empty actual &&
|
2017-04-27 01:12:33 +02:00
|
|
|
test_line_count = 0 actual &&
|
|
|
|
# get tags with --tags overrides tagOpt
|
|
|
|
(
|
2020-11-19 00:44:35 +01:00
|
|
|
cd dir_main_no_tags &&
|
2017-04-27 01:12:33 +02:00
|
|
|
git fetch --tags &&
|
|
|
|
git for-each-ref refs/tags >../actual
|
|
|
|
) &&
|
|
|
|
git for-each-ref refs/tags >expect &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
test_line_count = 2 actual
|
2012-09-20 20:04:08 +02:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--single-branch while HEAD pointing at side' '
|
|
|
|
(
|
2017-04-27 01:12:32 +02:00
|
|
|
cd dir_side &&
|
|
|
|
git fetch &&
|
2020-03-26 09:27:54 +01:00
|
|
|
git for-each-ref refs/remotes/origin >refs &&
|
2012-09-20 20:04:08 +02:00
|
|
|
sed -e "/HEAD$/d" \
|
2020-03-26 09:27:54 +01:00
|
|
|
-e "s|/remotes/origin/|/heads/|" refs >../actual
|
2012-09-20 20:04:08 +02:00
|
|
|
) &&
|
|
|
|
# only follow side
|
|
|
|
git for-each-ref refs/heads/side >expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--single-branch with explicit --branch side' '
|
|
|
|
(
|
2017-04-27 01:12:32 +02:00
|
|
|
cd dir_side2 &&
|
|
|
|
git fetch &&
|
2020-03-26 09:27:54 +01:00
|
|
|
git for-each-ref refs/remotes/origin >refs &&
|
2012-09-20 20:04:08 +02:00
|
|
|
sed -e "/HEAD$/d" \
|
2020-03-26 09:27:54 +01:00
|
|
|
-e "s|/remotes/origin/|/heads/|" refs >../actual
|
2012-09-20 20:04:08 +02:00
|
|
|
) &&
|
|
|
|
# only follow side
|
|
|
|
git for-each-ref refs/heads/side >expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--single-branch with explicit --branch with tag fetches updated tag' '
|
|
|
|
(
|
2017-04-27 01:12:32 +02:00
|
|
|
cd dir_tag &&
|
|
|
|
git fetch &&
|
2012-09-20 20:04:08 +02:00
|
|
|
git for-each-ref refs/tags >../actual
|
|
|
|
) &&
|
|
|
|
git for-each-ref refs/tags >expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2017-04-27 01:12:33 +02:00
|
|
|
test_expect_success '--single-branch with explicit --branch with tag fetches updated tag despite --no-tags' '
|
|
|
|
(
|
|
|
|
cd dir_tag_no_tags &&
|
|
|
|
git fetch &&
|
|
|
|
git for-each-ref refs/tags >../actual
|
|
|
|
) &&
|
|
|
|
git for-each-ref refs/tags/two >expect &&
|
|
|
|
test_cmp expect actual &&
|
|
|
|
test_line_count = 1 actual
|
|
|
|
'
|
|
|
|
|
2012-09-20 20:04:08 +02:00
|
|
|
test_expect_success '--single-branch with --mirror' '
|
|
|
|
(
|
2017-04-27 01:12:32 +02:00
|
|
|
cd dir_mirror &&
|
|
|
|
git fetch &&
|
2012-09-20 20:04:08 +02:00
|
|
|
git for-each-ref refs > ../actual
|
|
|
|
) &&
|
|
|
|
git for-each-ref refs >expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--single-branch with explicit --branch and --mirror' '
|
|
|
|
(
|
2017-04-27 01:12:32 +02:00
|
|
|
cd dir_mirror_side &&
|
|
|
|
git fetch &&
|
2012-09-20 20:04:08 +02:00
|
|
|
git for-each-ref refs > ../actual
|
|
|
|
) &&
|
|
|
|
git for-each-ref refs >expect &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success '--single-branch with detached' '
|
|
|
|
(
|
2017-04-27 01:12:32 +02:00
|
|
|
cd dir_detached &&
|
|
|
|
git fetch &&
|
2020-03-26 09:27:54 +01:00
|
|
|
git for-each-ref refs/remotes/origin >refs &&
|
2012-09-20 20:04:08 +02:00
|
|
|
sed -e "/HEAD$/d" \
|
2020-03-26 09:27:54 +01:00
|
|
|
-e "s|/remotes/origin/|/heads/|" refs >../actual
|
2015-03-20 11:06:44 +01:00
|
|
|
) &&
|
2012-09-20 20:04:08 +02:00
|
|
|
# nothing
|
2018-07-27 19:48:11 +02:00
|
|
|
test_must_be_empty actual
|
2012-09-20 20:04:08 +02:00
|
|
|
'
|
|
|
|
|
|
|
|
test_done
|