1#!/bin/sh 2 3test_description='check quarantine of objects during push' 4. ./test-lib.sh 5 6test_expect_success 'create picky dest repo' ' 7 git init --bare dest.git && 8 write_script dest.git/hooks/pre-receive <<-\EOF 9 while read old new ref; do 10 test "$(git log -1 --format=%s $new)" = reject && exit 1 11 done 12 exit 0 13 EOF 14' 15 16test_expect_success 'accepted objects work' ' 17 test_commit ok && 18 git push dest.git HEAD && 19 commit=$(git rev-parse HEAD) && 20 git --git-dir=dest.git cat-file commit $commit 21' 22 23test_expect_success 'rejected objects are not installed' ' 24 test_commit reject && 25 commit=$(git rev-parse HEAD) && 26 test_must_fail git push dest.git reject && 27 test_must_fail git --git-dir=dest.git cat-file commit $commit 28' 29 30test_expect_success 'rejected objects are removed' ' 31 echo "incoming-*" >expect && 32 (cd dest.git/objects && echo incoming-*) >actual && 33 test_cmp expect actual 34' 35 36test_expect_success 'push to repo path with path separator (colon)' ' 37 # The interesting failure case here is when the 38 # receiving end cannot access its original object directory, 39 # so make it likely for us to generate a delta by having 40 # a non-trivial file with multiple versions. 41 42 test-tool genrandom foo 4096 >file.bin && 43 git add file.bin && 44 git commit -m bin && 45 46 if test_have_prereq MINGW 47 then 48 pathsep=";" 49 else 50 pathsep=":" 51 fi && 52 git clone --bare . "xxx${pathsep}yyy.git" && 53 54 echo change >>file.bin && 55 git commit -am change && 56 # Note that we have to use the full path here, or it gets confused 57 # with the ssh host:path syntax. 58 git push "$(pwd)/xxx${pathsep}yyy.git" HEAD 59' 60 61test_expect_success 'updating a ref from quarantine is forbidden' ' 62 git init --bare update.git && 63 write_script update.git/hooks/pre-receive <<-\EOF && 64 read old new refname 65 git update-ref refs/heads/unrelated $new 66 exit 1 67 EOF 68 test_must_fail git push update.git HEAD && 69 git -C update.git fsck 70' 71 72test_done 73