2019-08-19 17:11:20 +08:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='"git fetch/pull --set-upstream" basic tests.'
|
2020-11-19 07:44:34 +08: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 07:44:19 +08:00
|
|
|
export GIT_TEST_DEFAULT_INITIAL_BRANCH_NAME
|
|
|
|
|
2019-08-19 17:11:20 +08:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
check_config () {
|
|
|
|
printf "%s\n" "$2" "$3" >"expect.$1" &&
|
|
|
|
{
|
|
|
|
git config "branch.$1.remote" && git config "branch.$1.merge"
|
|
|
|
} >"actual.$1" &&
|
|
|
|
test_cmp "expect.$1" "actual.$1"
|
|
|
|
}
|
|
|
|
|
|
|
|
check_config_missing () {
|
|
|
|
test_expect_code 1 git config "branch.$1.remote" &&
|
|
|
|
test_expect_code 1 git config "branch.$1.merge"
|
|
|
|
}
|
|
|
|
|
|
|
|
clear_config () {
|
|
|
|
for branch in "$@"; do
|
|
|
|
test_might_fail git config --unset-all "branch.$branch.remote"
|
|
|
|
test_might_fail git config --unset-all "branch.$branch.merge"
|
|
|
|
done
|
|
|
|
}
|
|
|
|
|
|
|
|
ensure_fresh_upstream () {
|
|
|
|
rm -rf parent && git init --bare parent
|
|
|
|
}
|
|
|
|
|
|
|
|
test_expect_success 'setup bare parent fetch' '
|
|
|
|
ensure_fresh_upstream &&
|
|
|
|
git remote add upstream parent
|
|
|
|
'
|
|
|
|
|
2020-11-19 07:44:34 +08:00
|
|
|
test_expect_success 'setup commit on main and other fetch' '
|
2019-08-19 17:11:20 +08:00
|
|
|
test_commit one &&
|
2020-11-19 07:44:34 +08:00
|
|
|
git push upstream main &&
|
2019-08-19 17:11:20 +08:00
|
|
|
git checkout -b other &&
|
|
|
|
test_commit two &&
|
|
|
|
git push upstream other
|
|
|
|
'
|
|
|
|
|
|
|
|
# tests for fetch --set-upstream
|
|
|
|
|
|
|
|
test_expect_success 'fetch --set-upstream does not set upstream w/o branch' '
|
2020-11-19 07:44:34 +08:00
|
|
|
clear_config main other &&
|
|
|
|
git checkout main &&
|
2019-08-19 17:11:20 +08:00
|
|
|
git fetch --set-upstream upstream &&
|
2020-11-19 07:44:34 +08:00
|
|
|
check_config_missing main &&
|
2019-08-19 17:11:20 +08:00
|
|
|
check_config_missing other
|
|
|
|
'
|
|
|
|
|
2020-11-19 07:44:34 +08:00
|
|
|
test_expect_success 'fetch --set-upstream upstream main sets branch main but not other' '
|
|
|
|
clear_config main other &&
|
|
|
|
git fetch --set-upstream upstream main &&
|
|
|
|
check_config main upstream refs/heads/main &&
|
2019-08-19 17:11:20 +08:00
|
|
|
check_config_missing other
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'fetch --set-upstream upstream other sets branch other' '
|
2020-11-19 07:44:34 +08:00
|
|
|
clear_config main other &&
|
2019-08-19 17:11:20 +08:00
|
|
|
git fetch --set-upstream upstream other &&
|
2020-11-19 07:44:34 +08:00
|
|
|
check_config main upstream refs/heads/other &&
|
2019-08-19 17:11:20 +08:00
|
|
|
check_config_missing other
|
|
|
|
'
|
|
|
|
|
2020-11-19 07:44:34 +08:00
|
|
|
test_expect_success 'fetch --set-upstream main:other does not set the branch other2' '
|
2019-08-19 17:11:20 +08:00
|
|
|
clear_config other2 &&
|
2020-11-19 07:44:34 +08:00
|
|
|
git fetch --set-upstream upstream main:other2 &&
|
2019-08-19 17:11:20 +08:00
|
|
|
check_config_missing other2
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'fetch --set-upstream http://nosuchdomain.example.com fails with invalid url' '
|
2020-11-19 07:44:34 +08:00
|
|
|
# main explicitly not cleared, we check that it is not touched from previous value
|
2019-08-19 17:11:20 +08:00
|
|
|
clear_config other other2 &&
|
|
|
|
test_must_fail git fetch --set-upstream http://nosuchdomain.example.com &&
|
2020-11-19 07:44:34 +08:00
|
|
|
check_config main upstream refs/heads/other &&
|
2019-08-19 17:11:20 +08:00
|
|
|
check_config_missing other &&
|
|
|
|
check_config_missing other2
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'fetch --set-upstream with valid URL sets upstream to URL' '
|
|
|
|
clear_config other other2 &&
|
t: don't spuriously close and reopen quotes
In the test scripts, the recommended style is, e.g.:
test_expect_success 'name' '
do-something somehow &&
do-some-more testing
'
When using this style, any single quote in the multi-line test section
is actually closing the lone single quotes that surround it.
It can be a non-issue in practice:
test_expect_success 'sed a little' '
sed -e 's/hi/lo/' in >out # "ok": no whitespace in s/hi/lo/
'
Or it can be a bug in the test, e.g., because variable interpolation
happens before the test even begins executing:
v=abc
test_expect_success 'variable interpolation' '
v=def &&
echo '"$v"' # abc
'
Change several such in-test single quotes to use double quotes instead
or, in a few cases, drop them altogether. These were identified using
some crude grepping. We're not fixing any test bugs here, but we're
hopefully making these tests slightly easier to grok and to maintain.
There are legitimate use cases for closing a quote and opening a new
one, e.g., both '\'' and '"'"' can be used to produce a literal single
quote. I'm not touching any of those here.
In t9401, tuck the redirecting ">" to the filename while we're touching
those lines.
Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-08-07 04:08:53 +08:00
|
|
|
url="file://$PWD" &&
|
2019-08-19 17:11:20 +08:00
|
|
|
git fetch --set-upstream "$url" &&
|
2020-11-19 07:44:34 +08:00
|
|
|
check_config main "$url" HEAD &&
|
2019-08-19 17:11:20 +08:00
|
|
|
check_config_missing other &&
|
|
|
|
check_config_missing other2
|
|
|
|
'
|
|
|
|
|
pull, fetch: fix segfault in --set-upstream option
Fix a segfault in the --set-upstream option added in
24bc1a12926 (pull, fetch: add --set-upstream option, 2019-08-19) added
in v2.24.0.
The code added there did not do the same checking we do for "git
branch" itself since 8efb8899cfe (branch: segfault fixes and
validation, 2013-02-23), which in turn fixed the same sort of segfault
I'm fixing now in "git branch --set-upstream-to", see
6183d826ba6 (branch: introduce --set-upstream-to, 2012-08-20).
The warning message I'm adding here is an amalgamation of the error
added for "git branch" in 8efb8899cfe, and the error output
install_branch_config() itself emits, i.e. it trims "refs/heads/" from
the name and says "branch X on remote", not "branch refs/heads/X on
remote".
I think it would make more sense to simply die() here, but in the
other checks for --set-upstream added in 24bc1a12926 we issue a
warning() instead. Let's do the same here for consistency for now.
There was an earlier submitted alternate way of fixing this in [1],
due to that patch breaking threading with the original report at [2] I
didn't notice it before authoring this version. I think the more
detailed warning message here is better, and we should also have tests
for this behavior.
The --no-rebase option to "git pull" is needed as of the recently
merged 7d0daf3f12f (Merge branch 'en/pull-conflicting-options',
2021-08-30).
1. https://lore.kernel.org/git/20210706162238.575988-1-clemens@endorphin.org/
2. https://lore.kernel.org/git/CAG6gW_uHhfNiHGQDgGmb1byMqBA7xa8kuH1mP-wAPEe5Tmi2Ew@mail.gmail.com/
Reported-by: Clemens Fruhwirth <clemens@endorphin.org>
Reported-by: Jan Pokorný <poki@fnusa.cz>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-12-08 06:04:30 +08:00
|
|
|
test_expect_success 'fetch --set-upstream with a detached HEAD' '
|
|
|
|
git checkout HEAD^0 &&
|
|
|
|
test_when_finished "git checkout -" &&
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
warning: could not set upstream of HEAD to '"'"'main'"'"' from '"'"'upstream'"'"' when it does not point to any branch.
|
|
|
|
EOF
|
|
|
|
git fetch --set-upstream upstream main 2>actual.raw &&
|
|
|
|
grep ^warning: actual.raw >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2019-08-19 17:11:20 +08:00
|
|
|
# tests for pull --set-upstream
|
|
|
|
|
|
|
|
test_expect_success 'setup bare parent pull' '
|
|
|
|
git remote rm upstream &&
|
|
|
|
ensure_fresh_upstream &&
|
|
|
|
git remote add upstream parent
|
|
|
|
'
|
|
|
|
|
2020-11-19 07:44:34 +08:00
|
|
|
test_expect_success 'setup commit on main and other pull' '
|
2019-08-19 17:11:20 +08:00
|
|
|
test_commit three &&
|
2020-11-19 07:44:34 +08:00
|
|
|
git push --tags upstream main &&
|
2019-08-19 17:11:20 +08:00
|
|
|
test_commit four &&
|
|
|
|
git push upstream other
|
|
|
|
'
|
|
|
|
|
2020-11-19 07:44:34 +08:00
|
|
|
test_expect_success 'pull --set-upstream upstream main sets branch main but not other' '
|
|
|
|
clear_config main other &&
|
2021-07-22 13:04:48 +08:00
|
|
|
git pull --no-rebase --set-upstream upstream main &&
|
2020-11-19 07:44:34 +08:00
|
|
|
check_config main upstream refs/heads/main &&
|
2019-08-19 17:11:20 +08:00
|
|
|
check_config_missing other
|
|
|
|
'
|
|
|
|
|
2020-11-19 07:44:34 +08:00
|
|
|
test_expect_success 'pull --set-upstream main:other2 does not set the branch other2' '
|
2019-08-19 17:11:20 +08:00
|
|
|
clear_config other2 &&
|
2021-07-22 13:04:48 +08:00
|
|
|
git pull --no-rebase --set-upstream upstream main:other2 &&
|
2019-08-19 17:11:20 +08:00
|
|
|
check_config_missing other2
|
|
|
|
'
|
|
|
|
|
2020-11-19 07:44:34 +08:00
|
|
|
test_expect_success 'pull --set-upstream upstream other sets branch main' '
|
|
|
|
clear_config main other &&
|
2021-07-22 13:04:48 +08:00
|
|
|
git pull --no-rebase --set-upstream upstream other &&
|
2020-11-19 07:44:34 +08:00
|
|
|
check_config main upstream refs/heads/other &&
|
2019-08-19 17:11:20 +08:00
|
|
|
check_config_missing other
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'pull --set-upstream upstream tag does not set the tag' '
|
|
|
|
clear_config three &&
|
2021-07-22 13:04:48 +08:00
|
|
|
git pull --no-rebase --tags --set-upstream upstream three &&
|
2019-08-19 17:11:20 +08:00
|
|
|
check_config_missing three
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'pull --set-upstream http://nosuchdomain.example.com fails with invalid url' '
|
2020-11-19 07:44:34 +08:00
|
|
|
# main explicitly not cleared, we check that it is not touched from previous value
|
2019-08-19 17:11:20 +08:00
|
|
|
clear_config other other2 three &&
|
|
|
|
test_must_fail git pull --set-upstream http://nosuchdomain.example.com &&
|
2020-11-19 07:44:34 +08:00
|
|
|
check_config main upstream refs/heads/other &&
|
2019-08-19 17:11:20 +08:00
|
|
|
check_config_missing other &&
|
|
|
|
check_config_missing other2 &&
|
|
|
|
check_config_missing three
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'pull --set-upstream upstream HEAD sets branch HEAD' '
|
2020-11-19 07:44:34 +08:00
|
|
|
clear_config main other &&
|
2021-07-22 13:04:48 +08:00
|
|
|
git pull --no-rebase --set-upstream upstream HEAD &&
|
2020-11-19 07:44:34 +08:00
|
|
|
check_config main upstream HEAD &&
|
2019-08-19 17:11:20 +08:00
|
|
|
git checkout other &&
|
2021-07-22 13:04:48 +08:00
|
|
|
git pull --no-rebase --set-upstream upstream HEAD &&
|
2019-08-19 17:11:20 +08:00
|
|
|
check_config other upstream HEAD
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'pull --set-upstream upstream with more than one branch does nothing' '
|
2020-11-19 07:44:34 +08:00
|
|
|
clear_config main three &&
|
2021-07-22 13:04:48 +08:00
|
|
|
git pull --no-rebase --set-upstream upstream main three &&
|
2020-11-19 07:44:34 +08:00
|
|
|
check_config_missing main &&
|
2019-08-19 17:11:20 +08:00
|
|
|
check_config_missing three
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'pull --set-upstream with valid URL sets upstream to URL' '
|
2020-11-19 07:44:34 +08:00
|
|
|
clear_config main other other2 &&
|
|
|
|
git checkout main &&
|
t: don't spuriously close and reopen quotes
In the test scripts, the recommended style is, e.g.:
test_expect_success 'name' '
do-something somehow &&
do-some-more testing
'
When using this style, any single quote in the multi-line test section
is actually closing the lone single quotes that surround it.
It can be a non-issue in practice:
test_expect_success 'sed a little' '
sed -e 's/hi/lo/' in >out # "ok": no whitespace in s/hi/lo/
'
Or it can be a bug in the test, e.g., because variable interpolation
happens before the test even begins executing:
v=abc
test_expect_success 'variable interpolation' '
v=def &&
echo '"$v"' # abc
'
Change several such in-test single quotes to use double quotes instead
or, in a few cases, drop them altogether. These were identified using
some crude grepping. We're not fixing any test bugs here, but we're
hopefully making these tests slightly easier to grok and to maintain.
There are legitimate use cases for closing a quote and opening a new
one, e.g., both '\'' and '"'"' can be used to produce a literal single
quote. I'm not touching any of those here.
In t9401, tuck the redirecting ">" to the filename while we're touching
those lines.
Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-08-07 04:08:53 +08:00
|
|
|
url="file://$PWD" &&
|
2019-08-19 17:11:20 +08:00
|
|
|
git pull --set-upstream "$url" &&
|
2020-11-19 07:44:34 +08:00
|
|
|
check_config main "$url" HEAD &&
|
2019-08-19 17:11:20 +08:00
|
|
|
check_config_missing other &&
|
|
|
|
check_config_missing other2
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'pull --set-upstream with valid URL and branch sets branch' '
|
2020-11-19 07:44:34 +08:00
|
|
|
clear_config main other other2 &&
|
|
|
|
git checkout main &&
|
t: don't spuriously close and reopen quotes
In the test scripts, the recommended style is, e.g.:
test_expect_success 'name' '
do-something somehow &&
do-some-more testing
'
When using this style, any single quote in the multi-line test section
is actually closing the lone single quotes that surround it.
It can be a non-issue in practice:
test_expect_success 'sed a little' '
sed -e 's/hi/lo/' in >out # "ok": no whitespace in s/hi/lo/
'
Or it can be a bug in the test, e.g., because variable interpolation
happens before the test even begins executing:
v=abc
test_expect_success 'variable interpolation' '
v=def &&
echo '"$v"' # abc
'
Change several such in-test single quotes to use double quotes instead
or, in a few cases, drop them altogether. These were identified using
some crude grepping. We're not fixing any test bugs here, but we're
hopefully making these tests slightly easier to grok and to maintain.
There are legitimate use cases for closing a quote and opening a new
one, e.g., both '\'' and '"'"' can be used to produce a literal single
quote. I'm not touching any of those here.
In t9401, tuck the redirecting ">" to the filename while we're touching
those lines.
Signed-off-by: Martin Ågren <martin.agren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2020-08-07 04:08:53 +08:00
|
|
|
url="file://$PWD" &&
|
2020-11-19 07:44:34 +08:00
|
|
|
git pull --set-upstream "$url" main &&
|
|
|
|
check_config main "$url" refs/heads/main &&
|
2019-08-19 17:11:20 +08:00
|
|
|
check_config_missing other &&
|
|
|
|
check_config_missing other2
|
|
|
|
'
|
|
|
|
|
pull, fetch: fix segfault in --set-upstream option
Fix a segfault in the --set-upstream option added in
24bc1a12926 (pull, fetch: add --set-upstream option, 2019-08-19) added
in v2.24.0.
The code added there did not do the same checking we do for "git
branch" itself since 8efb8899cfe (branch: segfault fixes and
validation, 2013-02-23), which in turn fixed the same sort of segfault
I'm fixing now in "git branch --set-upstream-to", see
6183d826ba6 (branch: introduce --set-upstream-to, 2012-08-20).
The warning message I'm adding here is an amalgamation of the error
added for "git branch" in 8efb8899cfe, and the error output
install_branch_config() itself emits, i.e. it trims "refs/heads/" from
the name and says "branch X on remote", not "branch refs/heads/X on
remote".
I think it would make more sense to simply die() here, but in the
other checks for --set-upstream added in 24bc1a12926 we issue a
warning() instead. Let's do the same here for consistency for now.
There was an earlier submitted alternate way of fixing this in [1],
due to that patch breaking threading with the original report at [2] I
didn't notice it before authoring this version. I think the more
detailed warning message here is better, and we should also have tests
for this behavior.
The --no-rebase option to "git pull" is needed as of the recently
merged 7d0daf3f12f (Merge branch 'en/pull-conflicting-options',
2021-08-30).
1. https://lore.kernel.org/git/20210706162238.575988-1-clemens@endorphin.org/
2. https://lore.kernel.org/git/CAG6gW_uHhfNiHGQDgGmb1byMqBA7xa8kuH1mP-wAPEe5Tmi2Ew@mail.gmail.com/
Reported-by: Clemens Fruhwirth <clemens@endorphin.org>
Reported-by: Jan Pokorný <poki@fnusa.cz>
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2021-12-08 06:04:30 +08:00
|
|
|
test_expect_success 'pull --set-upstream with a detached HEAD' '
|
|
|
|
git checkout HEAD^0 &&
|
|
|
|
test_when_finished "git checkout -" &&
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
warning: could not set upstream of HEAD to '"'"'main'"'"' from '"'"'upstream'"'"' when it does not point to any branch.
|
|
|
|
EOF
|
|
|
|
git pull --no-rebase --set-upstream upstream main 2>actual.raw &&
|
|
|
|
grep ^warning: actual.raw >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2019-08-19 17:11:20 +08:00
|
|
|
test_done
|