2011-09-05 03:19:36 +02:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='fetch/receive strict mode'
|
2020-11-19 00:44:31 +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
|
|
|
|
|
2023-02-07 00:07:54 +01:00
|
|
|
TEST_PASSES_SANITIZE_LEAK=true
|
2011-09-05 03:19:36 +02:00
|
|
|
. ./test-lib.sh
|
|
|
|
|
2018-07-27 16:37:16 +02:00
|
|
|
test_expect_success 'setup and inject "corrupt or missing" object' '
|
2011-09-05 03:19:36 +02:00
|
|
|
echo hello >greetings &&
|
|
|
|
git add greetings &&
|
|
|
|
git commit -m greetings &&
|
|
|
|
|
|
|
|
S=$(git rev-parse :greetings | sed -e "s|^..|&/|") &&
|
|
|
|
X=$(echo bye | git hash-object -w --stdin | sed -e "s|^..|&/|") &&
|
2018-07-27 16:37:16 +02:00
|
|
|
echo $S >S &&
|
|
|
|
echo $X >X &&
|
|
|
|
cp .git/objects/$S .git/objects/$S.back &&
|
2011-09-05 03:19:36 +02:00
|
|
|
mv -f .git/objects/$X .git/objects/$S &&
|
|
|
|
|
|
|
|
test_must_fail git fsck
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'fetch without strict' '
|
|
|
|
rm -rf dst &&
|
|
|
|
git init dst &&
|
|
|
|
(
|
|
|
|
cd dst &&
|
|
|
|
git config fetch.fsckobjects false &&
|
|
|
|
git config transfer.fsckobjects false &&
|
2020-11-19 00:44:31 +01:00
|
|
|
test_must_fail git fetch ../.git main
|
2011-09-05 03:19:36 +02:00
|
|
|
)
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'fetch with !fetch.fsckobjects' '
|
|
|
|
rm -rf dst &&
|
|
|
|
git init dst &&
|
|
|
|
(
|
|
|
|
cd dst &&
|
|
|
|
git config fetch.fsckobjects false &&
|
|
|
|
git config transfer.fsckobjects true &&
|
2020-11-19 00:44:31 +01:00
|
|
|
test_must_fail git fetch ../.git main
|
2011-09-05 03:19:36 +02:00
|
|
|
)
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'fetch with fetch.fsckobjects' '
|
|
|
|
rm -rf dst &&
|
|
|
|
git init dst &&
|
|
|
|
(
|
|
|
|
cd dst &&
|
|
|
|
git config fetch.fsckobjects true &&
|
|
|
|
git config transfer.fsckobjects false &&
|
2020-11-19 00:44:31 +01:00
|
|
|
test_must_fail git fetch ../.git main
|
2011-09-05 03:19:36 +02:00
|
|
|
)
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'fetch with transfer.fsckobjects' '
|
|
|
|
rm -rf dst &&
|
|
|
|
git init dst &&
|
|
|
|
(
|
|
|
|
cd dst &&
|
|
|
|
git config transfer.fsckobjects true &&
|
2020-11-19 00:44:31 +01:00
|
|
|
test_must_fail git fetch ../.git main
|
2011-09-05 03:19:36 +02:00
|
|
|
)
|
|
|
|
'
|
|
|
|
|
2012-02-13 21:17:12 +01:00
|
|
|
cat >exp <<EOF
|
|
|
|
To dst
|
2020-11-19 00:44:31 +01:00
|
|
|
! refs/heads/main:refs/heads/test [remote rejected] (missing necessary objects)
|
2020-04-17 11:45:32 +02:00
|
|
|
Done
|
2012-02-13 21:17:12 +01:00
|
|
|
EOF
|
|
|
|
|
2011-09-05 03:19:36 +02:00
|
|
|
test_expect_success 'push without strict' '
|
|
|
|
rm -rf dst &&
|
|
|
|
git init dst &&
|
|
|
|
(
|
|
|
|
cd dst &&
|
|
|
|
git config fetch.fsckobjects false &&
|
|
|
|
git config transfer.fsckobjects false
|
|
|
|
) &&
|
2020-11-19 00:44:31 +01:00
|
|
|
test_must_fail git push --porcelain dst main:refs/heads/test >act &&
|
2012-02-13 21:17:12 +01:00
|
|
|
test_cmp exp act
|
2011-09-05 03:19:36 +02:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'push with !receive.fsckobjects' '
|
|
|
|
rm -rf dst &&
|
|
|
|
git init dst &&
|
|
|
|
(
|
|
|
|
cd dst &&
|
|
|
|
git config receive.fsckobjects false &&
|
|
|
|
git config transfer.fsckobjects true
|
|
|
|
) &&
|
2020-11-19 00:44:31 +01:00
|
|
|
test_must_fail git push --porcelain dst main:refs/heads/test >act &&
|
2012-02-13 21:17:12 +01:00
|
|
|
test_cmp exp act
|
2011-09-05 03:19:36 +02:00
|
|
|
'
|
|
|
|
|
2012-02-13 21:17:12 +01:00
|
|
|
cat >exp <<EOF
|
|
|
|
To dst
|
2020-11-19 00:44:31 +01:00
|
|
|
! refs/heads/main:refs/heads/test [remote rejected] (unpacker error)
|
2012-02-13 21:17:12 +01:00
|
|
|
EOF
|
|
|
|
|
2011-09-05 03:19:36 +02:00
|
|
|
test_expect_success 'push with receive.fsckobjects' '
|
|
|
|
rm -rf dst &&
|
|
|
|
git init dst &&
|
|
|
|
(
|
|
|
|
cd dst &&
|
|
|
|
git config receive.fsckobjects true &&
|
|
|
|
git config transfer.fsckobjects false
|
|
|
|
) &&
|
2020-11-19 00:44:31 +01:00
|
|
|
test_must_fail git push --porcelain dst main:refs/heads/test >act &&
|
2016-04-20 00:51:25 +02:00
|
|
|
test_cmp exp act
|
2011-09-05 03:19:36 +02:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'push with transfer.fsckobjects' '
|
|
|
|
rm -rf dst &&
|
|
|
|
git init dst &&
|
|
|
|
(
|
|
|
|
cd dst &&
|
|
|
|
git config transfer.fsckobjects true
|
|
|
|
) &&
|
2020-11-19 00:44:31 +01:00
|
|
|
test_must_fail git push --porcelain dst main:refs/heads/test >act &&
|
2016-04-20 00:51:25 +02:00
|
|
|
test_cmp exp act
|
2011-09-05 03:19:36 +02:00
|
|
|
'
|
|
|
|
|
2018-07-27 16:37:16 +02:00
|
|
|
test_expect_success 'repair the "corrupt or missing" object' '
|
|
|
|
mv -f .git/objects/$(cat S) .git/objects/$(cat X) &&
|
|
|
|
mv .git/objects/$(cat S).back .git/objects/$(cat S) &&
|
|
|
|
rm -rf .git/objects/$(cat X) &&
|
|
|
|
git fsck
|
|
|
|
'
|
|
|
|
|
2016-07-16 07:06:24 +02:00
|
|
|
cat >bogus-commit <<EOF
|
|
|
|
tree $EMPTY_TREE
|
2015-06-22 17:26:36 +02:00
|
|
|
author Bugs Bunny 1234567890 +0000
|
|
|
|
committer Bugs Bunny <bugs@bun.ni> 1234567890 +0000
|
|
|
|
|
|
|
|
This commit object intentionally broken
|
|
|
|
EOF
|
|
|
|
|
2018-09-03 16:49:19 +02:00
|
|
|
test_expect_success 'setup bogus commit' '
|
2023-01-18 21:41:56 +01:00
|
|
|
commit="$(git hash-object --literally -t commit -w --stdin <bogus-commit)"
|
2018-09-03 16:49:19 +02:00
|
|
|
'
|
|
|
|
|
2018-09-03 16:49:20 +02:00
|
|
|
test_expect_success 'fsck with no skipList input' '
|
|
|
|
test_must_fail git fsck 2>err &&
|
|
|
|
test_i18ngrep "missingEmail" err
|
|
|
|
'
|
|
|
|
|
fsck: document and test sorted skipList input
Ever since the skipList support was first added in cd94c6f91 ("fsck:
git receive-pack: support excluding objects from fsck'ing",
2015-06-22) the documentation for the format has that the file is a
sorted list of object names.
Thus, anyone using the feature would have thought the list needed to
be sorted. E.g. I recently in conjunction with my fetch.fsck.*
implementation in 1362df0d41 ("fetch: implement fetch.fsck.*",
2018-07-27) wrote some code to ship a skipList, and went out of my way
to sort it.
Doing so seems intuitive, since it contains fixed-width records, and
has no support for comments, so one might expect it to be binary
searched in-place on-disk.
However, as documented here this was never a requirement, so let's
change the documentation. Since this is a file format change let's
also document what was said about this in the past, so e.g. someone
like myself reading the new docs can see this never needed to be
sorted ("why do I have all this code to sort this thing...").
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-09-03 16:49:21 +02:00
|
|
|
test_expect_success 'setup sorted and unsorted skipLists' '
|
|
|
|
cat >SKIP.unsorted <<-EOF &&
|
2019-12-21 20:49:28 +01:00
|
|
|
$(test_oid 004)
|
|
|
|
$(test_oid 002)
|
fsck: document and test sorted skipList input
Ever since the skipList support was first added in cd94c6f91 ("fsck:
git receive-pack: support excluding objects from fsck'ing",
2015-06-22) the documentation for the format has that the file is a
sorted list of object names.
Thus, anyone using the feature would have thought the list needed to
be sorted. E.g. I recently in conjunction with my fetch.fsck.*
implementation in 1362df0d41 ("fetch: implement fetch.fsck.*",
2018-07-27) wrote some code to ship a skipList, and went out of my way
to sort it.
Doing so seems intuitive, since it contains fixed-width records, and
has no support for comments, so one might expect it to be binary
searched in-place on-disk.
However, as documented here this was never a requirement, so let's
change the documentation. Since this is a file format change let's
also document what was said about this in the past, so e.g. someone
like myself reading the new docs can see this never needed to be
sorted ("why do I have all this code to sort this thing...").
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-09-03 16:49:21 +02:00
|
|
|
$commit
|
2019-12-21 20:49:28 +01:00
|
|
|
$(test_oid 001)
|
|
|
|
$(test_oid 003)
|
fsck: document and test sorted skipList input
Ever since the skipList support was first added in cd94c6f91 ("fsck:
git receive-pack: support excluding objects from fsck'ing",
2015-06-22) the documentation for the format has that the file is a
sorted list of object names.
Thus, anyone using the feature would have thought the list needed to
be sorted. E.g. I recently in conjunction with my fetch.fsck.*
implementation in 1362df0d41 ("fetch: implement fetch.fsck.*",
2018-07-27) wrote some code to ship a skipList, and went out of my way
to sort it.
Doing so seems intuitive, since it contains fixed-width records, and
has no support for comments, so one might expect it to be binary
searched in-place on-disk.
However, as documented here this was never a requirement, so let's
change the documentation. Since this is a file format change let's
also document what was said about this in the past, so e.g. someone
like myself reading the new docs can see this never needed to be
sorted ("why do I have all this code to sort this thing...").
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2018-09-03 16:49:21 +02:00
|
|
|
EOF
|
|
|
|
sort SKIP.unsorted >SKIP.sorted
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'fsck with sorted skipList' '
|
|
|
|
git -c fsck.skipList=SKIP.sorted fsck
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'fsck with unsorted skipList' '
|
|
|
|
git -c fsck.skipList=SKIP.unsorted fsck
|
|
|
|
'
|
|
|
|
|
2018-07-27 16:37:19 +02:00
|
|
|
test_expect_success 'fsck with invalid or bogus skipList input' '
|
|
|
|
git -c fsck.skipList=/dev/null -c fsck.missingEmail=ignore fsck &&
|
|
|
|
test_must_fail git -c fsck.skipList=does-not-exist -c fsck.missingEmail=ignore fsck 2>err &&
|
2019-05-15 23:44:56 +02:00
|
|
|
test_i18ngrep "could not open.*: does-not-exist" err &&
|
2018-07-27 16:37:19 +02:00
|
|
|
test_must_fail git -c fsck.skipList=.git/config -c fsck.missingEmail=ignore fsck 2>err &&
|
2019-05-15 23:44:56 +02:00
|
|
|
test_i18ngrep "invalid object name: \[core\]" err
|
2018-07-27 16:37:19 +02:00
|
|
|
'
|
|
|
|
|
2018-09-03 16:49:28 +02:00
|
|
|
test_expect_success 'fsck with other accepted skipList input (comments & empty lines)' '
|
2018-09-03 16:49:22 +02:00
|
|
|
cat >SKIP.with-comment <<-EOF &&
|
|
|
|
# Some bad commit
|
2019-12-21 20:49:28 +01:00
|
|
|
$(test_oid 001)
|
2018-09-03 16:49:22 +02:00
|
|
|
EOF
|
|
|
|
test_must_fail git -c fsck.skipList=SKIP.with-comment fsck 2>err-with-comment &&
|
2018-09-03 16:49:28 +02:00
|
|
|
test_i18ngrep "missingEmail" err-with-comment &&
|
2018-09-03 16:49:22 +02:00
|
|
|
cat >SKIP.with-empty-line <<-EOF &&
|
2019-12-21 20:49:28 +01:00
|
|
|
$(test_oid 001)
|
2018-09-03 16:49:22 +02:00
|
|
|
|
2019-12-21 20:49:28 +01:00
|
|
|
$(test_oid 002)
|
2018-09-03 16:49:22 +02:00
|
|
|
EOF
|
|
|
|
test_must_fail git -c fsck.skipList=SKIP.with-empty-line fsck 2>err-with-empty-line &&
|
2018-09-03 16:49:28 +02:00
|
|
|
test_i18ngrep "missingEmail" err-with-empty-line
|
2018-09-03 16:49:22 +02:00
|
|
|
'
|
|
|
|
|
2018-09-03 16:49:26 +02:00
|
|
|
test_expect_success 'fsck no garbage output from comments & empty lines errors' '
|
2018-09-03 16:49:22 +02:00
|
|
|
test_line_count = 1 err-with-comment &&
|
|
|
|
test_line_count = 1 err-with-empty-line
|
|
|
|
'
|
|
|
|
|
2018-09-03 16:49:23 +02:00
|
|
|
test_expect_success 'fsck with invalid abbreviated skipList input' '
|
|
|
|
echo $commit | test_copy_bytes 20 >SKIP.abbreviated &&
|
|
|
|
test_must_fail git -c fsck.skipList=SKIP.abbreviated fsck 2>err-abbreviated &&
|
2019-05-15 23:44:56 +02:00
|
|
|
test_i18ngrep "^fatal: invalid object name: " err-abbreviated
|
2018-09-03 16:49:23 +02:00
|
|
|
'
|
|
|
|
|
2018-09-03 16:49:28 +02:00
|
|
|
test_expect_success 'fsck with exhaustive accepted skipList input (various types of comments etc.)' '
|
|
|
|
>SKIP.exhaustive &&
|
|
|
|
echo "# A commented line" >>SKIP.exhaustive &&
|
|
|
|
echo "" >>SKIP.exhaustive &&
|
|
|
|
echo " " >>SKIP.exhaustive &&
|
|
|
|
echo " # Comment after whitespace" >>SKIP.exhaustive &&
|
|
|
|
echo "$commit # Our bad commit (with leading whitespace and trailing comment)" >>SKIP.exhaustive &&
|
|
|
|
echo "# Some bad commit (leading whitespace)" >>SKIP.exhaustive &&
|
2019-12-21 20:49:28 +01:00
|
|
|
echo " $(test_oid 001)" >>SKIP.exhaustive &&
|
2018-09-03 16:49:28 +02:00
|
|
|
git -c fsck.skipList=SKIP.exhaustive fsck 2>err &&
|
|
|
|
test_must_be_empty err
|
|
|
|
'
|
|
|
|
|
2015-06-22 17:27:18 +02:00
|
|
|
test_expect_success 'push with receive.fsck.skipList' '
|
|
|
|
git push . $commit:refs/heads/bogus &&
|
|
|
|
rm -rf dst &&
|
|
|
|
git init dst &&
|
|
|
|
git --git-dir=dst/.git config receive.fsckObjects true &&
|
|
|
|
test_must_fail git push --porcelain dst bogus &&
|
|
|
|
echo $commit >dst/.git/SKIP &&
|
2018-07-27 16:37:18 +02:00
|
|
|
|
|
|
|
# receive.fsck.* does not fall back on fsck.*
|
|
|
|
git --git-dir=dst/.git config fsck.skipList SKIP &&
|
|
|
|
test_must_fail git push --porcelain dst bogus &&
|
|
|
|
|
2018-07-27 16:37:19 +02:00
|
|
|
# Invalid and/or bogus skipList input
|
|
|
|
git --git-dir=dst/.git config receive.fsck.skipList /dev/null &&
|
|
|
|
test_must_fail git push --porcelain dst bogus &&
|
|
|
|
git --git-dir=dst/.git config receive.fsck.skipList does-not-exist &&
|
|
|
|
test_must_fail git push --porcelain dst bogus 2>err &&
|
2019-05-15 23:44:56 +02:00
|
|
|
test_i18ngrep "could not open.*: does-not-exist" err &&
|
2018-07-27 16:37:19 +02:00
|
|
|
git --git-dir=dst/.git config receive.fsck.skipList config &&
|
|
|
|
test_must_fail git push --porcelain dst bogus 2>err &&
|
2019-05-15 23:44:56 +02:00
|
|
|
test_i18ngrep "invalid object name: \[core\]" err &&
|
2018-07-27 16:37:19 +02:00
|
|
|
|
2018-07-27 16:37:18 +02:00
|
|
|
git --git-dir=dst/.git config receive.fsck.skipList SKIP &&
|
2015-06-22 17:27:18 +02:00
|
|
|
git push --porcelain dst bogus
|
|
|
|
'
|
|
|
|
|
2018-07-27 16:37:17 +02:00
|
|
|
test_expect_success 'fetch with fetch.fsck.skipList' '
|
|
|
|
refspec=refs/heads/bogus:refs/heads/bogus &&
|
|
|
|
git push . $commit:refs/heads/bogus &&
|
|
|
|
rm -rf dst &&
|
|
|
|
git init dst &&
|
|
|
|
git --git-dir=dst/.git config fetch.fsckObjects true &&
|
|
|
|
test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" $refspec &&
|
2018-07-27 16:37:18 +02:00
|
|
|
git --git-dir=dst/.git config fetch.fsck.skipList /dev/null &&
|
|
|
|
test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" $refspec &&
|
2018-07-27 16:37:17 +02:00
|
|
|
echo $commit >dst/.git/SKIP &&
|
2018-07-27 16:37:18 +02:00
|
|
|
|
|
|
|
# fetch.fsck.* does not fall back on fsck.*
|
|
|
|
git --git-dir=dst/.git config fsck.skipList dst/.git/SKIP &&
|
|
|
|
test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" $refspec &&
|
|
|
|
|
2018-07-27 16:37:19 +02:00
|
|
|
# Invalid and/or bogus skipList input
|
|
|
|
git --git-dir=dst/.git config fetch.fsck.skipList /dev/null &&
|
|
|
|
test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" $refspec &&
|
|
|
|
git --git-dir=dst/.git config fetch.fsck.skipList does-not-exist &&
|
|
|
|
test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" $refspec 2>err &&
|
2019-05-15 23:44:56 +02:00
|
|
|
test_i18ngrep "could not open.*: does-not-exist" err &&
|
2018-07-27 16:37:19 +02:00
|
|
|
git --git-dir=dst/.git config fetch.fsck.skipList dst/.git/config &&
|
|
|
|
test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" $refspec 2>err &&
|
2019-05-15 23:44:56 +02:00
|
|
|
test_i18ngrep "invalid object name: \[core\]" err &&
|
2018-07-27 16:37:19 +02:00
|
|
|
|
2018-07-27 16:37:18 +02:00
|
|
|
git --git-dir=dst/.git config fetch.fsck.skipList dst/.git/SKIP &&
|
2018-07-27 16:37:17 +02:00
|
|
|
git --git-dir=dst/.git fetch "file://$(pwd)" $refspec
|
|
|
|
'
|
|
|
|
|
2018-07-27 16:37:20 +02:00
|
|
|
test_expect_success 'fsck.<unknownmsg-id> dies' '
|
|
|
|
test_must_fail git -c fsck.whatEver=ignore fsck 2>err &&
|
|
|
|
test_i18ngrep "Unhandled message id: whatever" err
|
|
|
|
'
|
2018-07-27 16:37:17 +02:00
|
|
|
|
2015-06-22 17:26:36 +02:00
|
|
|
test_expect_success 'push with receive.fsck.missingEmail=warn' '
|
|
|
|
git push . $commit:refs/heads/bogus &&
|
|
|
|
rm -rf dst &&
|
|
|
|
git init dst &&
|
|
|
|
git --git-dir=dst/.git config receive.fsckobjects true &&
|
|
|
|
test_must_fail git push --porcelain dst bogus &&
|
2018-07-27 16:37:18 +02:00
|
|
|
|
|
|
|
# receive.fsck.<msg-id> does not fall back on fsck.<msg-id>
|
|
|
|
git --git-dir=dst/.git config fsck.missingEmail warn &&
|
|
|
|
test_must_fail git push --porcelain dst bogus &&
|
|
|
|
|
2018-07-27 16:37:20 +02:00
|
|
|
# receive.fsck.<unknownmsg-id> warns
|
|
|
|
git --git-dir=dst/.git config \
|
|
|
|
receive.fsck.whatEver error &&
|
|
|
|
|
2015-06-22 17:26:36 +02:00
|
|
|
git --git-dir=dst/.git config \
|
|
|
|
receive.fsck.missingEmail warn &&
|
|
|
|
git push --porcelain dst bogus >act 2>&1 &&
|
2015-06-22 17:26:48 +02:00
|
|
|
grep "missingEmail" act &&
|
2021-12-01 23:15:41 +01:00
|
|
|
test_i18ngrep "skipping unknown msg id.*whatever" act &&
|
2015-06-22 17:26:48 +02:00
|
|
|
git --git-dir=dst/.git branch -D bogus &&
|
|
|
|
git --git-dir=dst/.git config --add \
|
|
|
|
receive.fsck.missingEmail ignore &&
|
|
|
|
git push --porcelain dst bogus >act 2>&1 &&
|
2017-01-03 20:57:07 +01:00
|
|
|
! grep "missingEmail" act
|
2015-06-22 17:26:36 +02:00
|
|
|
'
|
|
|
|
|
2018-07-27 16:37:17 +02:00
|
|
|
test_expect_success 'fetch with fetch.fsck.missingEmail=warn' '
|
|
|
|
refspec=refs/heads/bogus:refs/heads/bogus &&
|
|
|
|
git push . $commit:refs/heads/bogus &&
|
|
|
|
rm -rf dst &&
|
|
|
|
git init dst &&
|
|
|
|
git --git-dir=dst/.git config fetch.fsckobjects true &&
|
|
|
|
test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" $refspec &&
|
2018-07-27 16:37:18 +02:00
|
|
|
|
|
|
|
# fetch.fsck.<msg-id> does not fall back on fsck.<msg-id>
|
|
|
|
git --git-dir=dst/.git config fsck.missingEmail warn &&
|
|
|
|
test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" $refspec &&
|
|
|
|
|
2018-07-27 16:37:20 +02:00
|
|
|
# receive.fsck.<unknownmsg-id> warns
|
|
|
|
git --git-dir=dst/.git config \
|
|
|
|
fetch.fsck.whatEver error &&
|
|
|
|
|
2018-07-27 16:37:17 +02:00
|
|
|
git --git-dir=dst/.git config \
|
|
|
|
fetch.fsck.missingEmail warn &&
|
|
|
|
git --git-dir=dst/.git fetch "file://$(pwd)" $refspec >act 2>&1 &&
|
|
|
|
grep "missingEmail" act &&
|
2018-07-27 16:37:20 +02:00
|
|
|
test_i18ngrep "Skipping unknown msg id.*whatever" act &&
|
2018-07-27 16:37:17 +02:00
|
|
|
rm -rf dst &&
|
|
|
|
git init dst &&
|
|
|
|
git --git-dir=dst/.git config fetch.fsckobjects true &&
|
|
|
|
git --git-dir=dst/.git config \
|
|
|
|
fetch.fsck.missingEmail ignore &&
|
|
|
|
git --git-dir=dst/.git fetch "file://$(pwd)" $refspec >act 2>&1 &&
|
|
|
|
! grep "missingEmail" act
|
|
|
|
'
|
|
|
|
|
2015-06-22 17:26:42 +02:00
|
|
|
test_expect_success \
|
|
|
|
'receive.fsck.unterminatedHeader=warn triggers error' '
|
|
|
|
rm -rf dst &&
|
|
|
|
git init dst &&
|
|
|
|
git --git-dir=dst/.git config receive.fsckobjects true &&
|
|
|
|
git --git-dir=dst/.git config \
|
|
|
|
receive.fsck.unterminatedheader warn &&
|
|
|
|
test_must_fail git push --porcelain dst HEAD >act 2>&1 &&
|
|
|
|
grep "Cannot demote unterminatedheader" act
|
|
|
|
'
|
|
|
|
|
2018-07-27 16:37:17 +02:00
|
|
|
test_expect_success \
|
|
|
|
'fetch.fsck.unterminatedHeader=warn triggers error' '
|
|
|
|
rm -rf dst &&
|
|
|
|
git init dst &&
|
|
|
|
git --git-dir=dst/.git config fetch.fsckobjects true &&
|
|
|
|
git --git-dir=dst/.git config \
|
|
|
|
fetch.fsck.unterminatedheader warn &&
|
|
|
|
test_must_fail git --git-dir=dst/.git fetch "file://$(pwd)" HEAD &&
|
|
|
|
grep "Cannot demote unterminatedheader" act
|
|
|
|
'
|
|
|
|
|
fsck: downgrade tree badFilemode to "info"
The previous commit un-broke the "badFileMode" check; before then it was
literally testing nothing. And as far as I can tell, it has been so
since the very initial version of fsck.
The current severity of "badFileMode" is just "warning". But in the
--strict mode used by transfer.fsckObjects, that is elevated to an
error. This will potentially cause hassle for users, because historical
objects with bad modes will suddenly start causing pushes to many server
operators to be rejected.
At the same time, these bogus modes aren't actually a big risk. Because
we canonicalize them everywhere besides fsck, they can't cause too much
mischief in the real world. The worst thing you can do is end up with
two almost-identical trees that have different hashes but are
interpreted the same. That will generally cause things to be inefficient
rather than wrong, and is a bug somebody working on a Git implementation
would want to fix, but probably not worth inconveniencing users by
refusing to push or fetch.
So let's downgrade this to "info" by default, which is our setting for
"mention this when fscking, but don't ever reject, even under strict
mode". If somebody really wants to be paranoid, they can still adjust
the level using config.
Suggested-by: Xavier Morel <xavier.morel@masklinn.net>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2022-08-10 23:04:07 +02:00
|
|
|
test_expect_success 'badFilemode is not a strict error' '
|
|
|
|
git init --bare badmode.git &&
|
|
|
|
tree=$(
|
|
|
|
cd badmode.git &&
|
|
|
|
blob=$(echo blob | git hash-object -w --stdin | hex2oct) &&
|
|
|
|
printf "123456 foo\0${blob}" |
|
|
|
|
git hash-object -t tree --stdin -w --literally
|
|
|
|
) &&
|
|
|
|
|
|
|
|
rm -rf dst.git &&
|
|
|
|
git init --bare dst.git &&
|
|
|
|
git -C dst.git config transfer.fsckObjects true &&
|
|
|
|
|
|
|
|
git -C badmode.git push ../dst.git $tree:refs/tags/tree 2>err &&
|
|
|
|
grep "$tree: badFilemode" err
|
|
|
|
'
|
|
|
|
|
2011-09-05 03:19:36 +02:00
|
|
|
test_done
|