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