Merge branch 'nd/worktree-move'
[git] / t / t5547-push-quarantine.sh
1 #!/bin/sh
2
3 test_description='check quarantine of objects during push'
4 . ./test-lib.sh
5
6 test_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
16 test_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
23 test_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
30 test_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
36 test_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-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
61 test_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
72 test_done