2016-10-03 23:49:14 +03:00
|
|
|
#!/bin/sh
|
|
|
|
|
|
|
|
test_description='check quarantine of objects during push'
|
|
|
|
. ./test-lib.sh
|
|
|
|
|
|
|
|
test_expect_success 'create picky dest repo' '
|
|
|
|
git init --bare dest.git &&
|
|
|
|
write_script dest.git/hooks/pre-receive <<-\EOF
|
|
|
|
while read old new ref; do
|
|
|
|
test "$(git log -1 --format=%s $new)" = reject && exit 1
|
|
|
|
done
|
|
|
|
exit 0
|
|
|
|
EOF
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'accepted objects work' '
|
|
|
|
test_commit ok &&
|
|
|
|
git push dest.git HEAD &&
|
|
|
|
commit=$(git rev-parse HEAD) &&
|
|
|
|
git --git-dir=dest.git cat-file commit $commit
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'rejected objects are not installed' '
|
|
|
|
test_commit reject &&
|
|
|
|
commit=$(git rev-parse HEAD) &&
|
|
|
|
test_must_fail git push dest.git reject &&
|
|
|
|
test_must_fail git --git-dir=dest.git cat-file commit $commit
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'rejected objects are removed' '
|
|
|
|
echo "incoming-*" >expect &&
|
|
|
|
(cd dest.git/objects && echo incoming-*) >actual &&
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2016-12-13 22:09:31 +03:00
|
|
|
test_expect_success 'push to repo path with path separator (colon)' '
|
2016-12-12 22:53:55 +03:00
|
|
|
# The interesting failure case here is when the
|
|
|
|
# receiving end cannot access its original object directory,
|
|
|
|
# so make it likely for us to generate a delta by having
|
|
|
|
# a non-trivial file with multiple versions.
|
|
|
|
|
2018-03-24 10:44:42 +03:00
|
|
|
test-tool genrandom foo 4096 >file.bin &&
|
2016-12-12 22:53:55 +03:00
|
|
|
git add file.bin &&
|
|
|
|
git commit -m bin &&
|
2016-12-13 22:09:31 +03:00
|
|
|
|
|
|
|
if test_have_prereq MINGW
|
|
|
|
then
|
|
|
|
pathsep=";"
|
|
|
|
else
|
|
|
|
pathsep=":"
|
|
|
|
fi &&
|
|
|
|
git clone --bare . "xxx${pathsep}yyy.git" &&
|
2016-12-12 22:53:55 +03:00
|
|
|
|
|
|
|
echo change >>file.bin &&
|
|
|
|
git commit -am change &&
|
|
|
|
# Note that we have to use the full path here, or it gets confused
|
|
|
|
# with the ssh host:path syntax.
|
2016-12-13 22:09:31 +03:00
|
|
|
git push "$(pwd)/xxx${pathsep}yyy.git" HEAD
|
2016-12-12 22:53:55 +03:00
|
|
|
'
|
|
|
|
|
2017-04-11 01:14:12 +03:00
|
|
|
test_expect_success 'updating a ref from quarantine is forbidden' '
|
|
|
|
git init --bare update.git &&
|
|
|
|
write_script update.git/hooks/pre-receive <<-\EOF &&
|
|
|
|
read old new refname
|
|
|
|
git update-ref refs/heads/unrelated $new
|
|
|
|
exit 1
|
|
|
|
EOF
|
|
|
|
test_must_fail git push update.git HEAD &&
|
|
|
|
git -C update.git fsck
|
|
|
|
'
|
|
|
|
|
2016-10-03 23:49:14 +03:00
|
|
|
test_done
|