| #!/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 | |
| ' | |
| test_expect_success 'push to repo path with path separator (colon)' ' | |
| # 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. | |
| test-tool genrandom foo 4096 >file.bin && | |
| git add file.bin && | |
| git commit -m bin && | |
| if test_have_prereq MINGW | |
| then | |
| pathsep=";" | |
| else | |
| pathsep=":" | |
| fi && | |
| git clone --bare . "xxx${pathsep}yyy.git" && | |
| 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. | |
| git push "$(pwd)/xxx${pathsep}yyy.git" HEAD | |
| ' | |
| 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 | |
| ' | |
| test_done |