Sync with maint
[git] / t / t5800-remote-testpy.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2010 Sverre Rabbelier
4 #
5
6 test_description='Test python remote-helper framework'
7
8 . ./test-lib.sh
9
10 if ! test_have_prereq PYTHON ; then
11         skip_all='skipping python remote-helper tests, python not available'
12         test_done
13 fi
14
15 "$PYTHON_PATH" -c '
16 import sys
17 if sys.hexversion < 0x02040000:
18     sys.exit(1)
19 ' || {
20         skip_all='skipping python remote-helper tests, python version < 2.4'
21         test_done
22 }
23
24 compare_refs() {
25         git --git-dir="$1/.git" rev-parse --verify $2 >expect &&
26         git --git-dir="$3/.git" rev-parse --verify $4 >actual &&
27         test_cmp expect actual
28 }
29
30 test_expect_success 'setup repository' '
31         git init --bare server/.git &&
32         git clone server public &&
33         (cd public &&
34          echo content >file &&
35          git add file &&
36          git commit -m one &&
37          git push origin master)
38 '
39
40 test_expect_success 'cloning from local repo' '
41         git clone "testpy::${PWD}/server" localclone &&
42         test_cmp public/file localclone/file
43 '
44
45 test_expect_success 'cloning from remote repo' '
46         git clone "testpy::file://${PWD}/server" clone &&
47         test_cmp public/file clone/file
48 '
49
50 test_expect_success 'create new commit on remote' '
51         (cd public &&
52          echo content >>file &&
53          git commit -a -m two &&
54          git push)
55 '
56
57 test_expect_success 'pulling from local repo' '
58         (cd localclone && git pull) &&
59         test_cmp public/file localclone/file
60 '
61
62 test_expect_success 'pulling from remote remote' '
63         (cd clone && git pull) &&
64         test_cmp public/file clone/file
65 '
66
67 test_expect_success 'pushing to local repo' '
68         (cd localclone &&
69         echo content >>file &&
70         git commit -a -m three &&
71         git push) &&
72         compare_refs localclone HEAD server HEAD
73 '
74
75 # Generally, skip this test.  It demonstrates a now-fixed race in
76 # git-remote-testpy, but is too slow to leave in for general use.
77 : test_expect_success 'racily pushing to local repo' '
78         test_when_finished "rm -rf server2 localclone2" &&
79         cp -R server server2 &&
80         git clone "testpy::${PWD}/server2" localclone2 &&
81         (cd localclone2 &&
82         echo content >>file &&
83         git commit -a -m three &&
84         GIT_REMOTE_TESTGIT_SLEEPY=2 git push) &&
85         compare_refs localclone2 HEAD server2 HEAD
86 '
87
88 test_expect_success 'synch with changes from localclone' '
89         (cd clone &&
90          git pull)
91 '
92
93 test_expect_success 'pushing remote local repo' '
94         (cd clone &&
95         echo content >>file &&
96         git commit -a -m four &&
97         git push) &&
98         compare_refs clone HEAD server HEAD
99 '
100
101 test_expect_success 'fetch new branch' '
102         (cd public &&
103          git checkout -b new &&
104          echo content >>file &&
105          git commit -a -m five &&
106          git push origin new
107         ) &&
108         (cd localclone &&
109          git fetch origin new
110         ) &&
111         compare_refs public HEAD localclone FETCH_HEAD
112 '
113
114 test_expect_success 'fetch multiple branches' '
115         (cd localclone &&
116          git fetch
117         ) &&
118         compare_refs server master localclone refs/remotes/origin/master &&
119         compare_refs server new localclone refs/remotes/origin/new
120 '
121
122 test_expect_success 'push when remote has extra refs' '
123         (cd clone &&
124          echo content >>file &&
125          git commit -a -m six &&
126          git push
127         ) &&
128         compare_refs clone master server master
129 '
130
131 test_expect_success 'push new branch by name' '
132         (cd clone &&
133          git checkout -b new-name  &&
134          echo content >>file &&
135          git commit -a -m seven &&
136          git push origin new-name
137         ) &&
138         compare_refs clone HEAD server refs/heads/new-name
139 '
140
141 test_expect_failure 'push new branch with old:new refspec' '
142         (cd clone &&
143          git push origin new-name:new-refspec
144         ) &&
145         compare_refs clone HEAD server refs/heads/new-refspec
146 '
147
148 test_expect_success 'proper failure checks for fetching' '
149         (GIT_REMOTE_TESTGIT_FAILURE=1 &&
150         export GIT_REMOTE_TESTGIT_FAILURE &&
151         cd localclone &&
152         test_must_fail git fetch 2>&1 | \
153                 grep "Error while running fast-import"
154         )
155 '
156
157 # We sleep to give fast-export a chance to catch the SIGPIPE
158 test_expect_failure 'proper failure checks for pushing' '
159         (GIT_REMOTE_TESTGIT_FAILURE=1 &&
160         export GIT_REMOTE_TESTGIT_FAILURE &&
161         GIT_REMOTE_TESTGIT_SLEEPY=1 &&
162         export GIT_REMOTE_TESTGIT_SLEEPY &&
163         cd localclone &&
164         test_must_fail git push --all 2>&1 | \
165                 grep "Error while running fast-export"
166         )
167 '
168
169 test_done