Merge branch 'af/tcsh-completion-noclobber'
[git] / t / t5801-remote-helpers.sh
1 #!/bin/sh
2 #
3 # Copyright (c) 2010 Sverre Rabbelier
4 #
5
6 test_description='Test remote-helper import and export commands'
7
8 . ./test-lib.sh
9 . "$TEST_DIRECTORY"/lib-gpg.sh
10
11 compare_refs() {
12         git --git-dir="$1/.git" rev-parse --verify $2 >expect &&
13         git --git-dir="$3/.git" rev-parse --verify $4 >actual &&
14         test_cmp expect actual
15 }
16
17 test_expect_success 'setup repository' '
18         git init server &&
19         (cd server &&
20          echo content >file &&
21          git add file &&
22          git commit -m one)
23 '
24
25 test_expect_success 'cloning from local repo' '
26         git clone "testgit::${PWD}/server" local &&
27         test_cmp server/file local/file
28 '
29
30 test_expect_success 'create new commit on remote' '
31         (cd server &&
32          echo content >>file &&
33          git commit -a -m two)
34 '
35
36 test_expect_success 'pulling from local repo' '
37         (cd local && git pull) &&
38         test_cmp server/file local/file
39 '
40
41 test_expect_success 'pushing to local repo' '
42         (cd local &&
43         echo content >>file &&
44         git commit -a -m three &&
45         git push) &&
46         compare_refs local HEAD server HEAD
47 '
48
49 test_expect_success 'fetch new branch' '
50         (cd server &&
51          git reset --hard &&
52          git checkout -b new &&
53          echo content >>file &&
54          git commit -a -m five
55         ) &&
56         (cd local &&
57          git fetch origin new
58         ) &&
59         compare_refs server HEAD local FETCH_HEAD
60 '
61
62 test_expect_success 'fetch multiple branches' '
63         (cd local &&
64          git fetch
65         ) &&
66         compare_refs server master local refs/remotes/origin/master &&
67         compare_refs server new local refs/remotes/origin/new
68 '
69
70 test_expect_success 'push when remote has extra refs' '
71         (cd local &&
72          git reset --hard origin/master &&
73          echo content >>file &&
74          git commit -a -m six &&
75          git push
76         ) &&
77         compare_refs local master server master
78 '
79
80 test_expect_success 'push new branch by name' '
81         (cd local &&
82          git checkout -b new-name  &&
83          echo content >>file &&
84          git commit -a -m seven &&
85          git push origin new-name
86         ) &&
87         compare_refs local HEAD server refs/heads/new-name
88 '
89
90 test_expect_success 'push new branch with old:new refspec' '
91         (cd local &&
92          git push origin new-name:new-refspec
93         ) &&
94         compare_refs local HEAD server refs/heads/new-refspec
95 '
96
97 test_expect_success 'push new branch with HEAD:new refspec' '
98         (cd local &&
99          git checkout new-name
100          git push origin HEAD:new-refspec-2
101         ) &&
102         compare_refs local HEAD server refs/heads/new-refspec-2
103 '
104
105 test_expect_success 'push delete branch' '
106         (cd local &&
107          git push origin :new-name
108         ) &&
109         test_must_fail git --git-dir="server/.git" \
110          rev-parse --verify refs/heads/new-name
111 '
112
113 test_expect_success 'forced push' '
114         (cd local &&
115         git checkout -b force-test &&
116         echo content >> file &&
117         git commit -a -m eight &&
118         git push origin force-test &&
119         echo content >> file &&
120         git commit -a --amend -m eight-modified &&
121         git push --force origin force-test
122         ) &&
123         compare_refs local refs/heads/force-test server refs/heads/force-test
124 '
125
126 test_expect_success 'cloning without refspec' '
127         GIT_REMOTE_TESTGIT_REFSPEC="" \
128         git clone "testgit::${PWD}/server" local2 2>error &&
129         grep "This remote helper should implement refspec capability" error &&
130         compare_refs local2 HEAD server HEAD
131 '
132
133 test_expect_success 'pulling without refspecs' '
134         (cd local2 &&
135         git reset --hard &&
136         GIT_REMOTE_TESTGIT_REFSPEC="" git pull 2>../error) &&
137         grep "This remote helper should implement refspec capability" error &&
138         compare_refs local2 HEAD server HEAD
139 '
140
141 test_expect_success 'pushing without refspecs' '
142         test_when_finished "(cd local2 && git reset --hard origin)" &&
143         (cd local2 &&
144         echo content >>file &&
145         git commit -a -m ten &&
146         GIT_REMOTE_TESTGIT_REFSPEC="" &&
147         export GIT_REMOTE_TESTGIT_REFSPEC &&
148         test_must_fail git push 2>../error) &&
149         grep "remote-helper doesn.t support push; refspec needed" error
150 '
151
152 test_expect_success 'pulling without marks' '
153         (cd local2 &&
154         GIT_REMOTE_TESTGIT_NO_MARKS=1 git pull) &&
155         compare_refs local2 HEAD server HEAD
156 '
157
158 test_expect_failure 'pushing without marks' '
159         test_when_finished "(cd local2 && git reset --hard origin)" &&
160         (cd local2 &&
161         echo content >>file &&
162         git commit -a -m twelve &&
163         GIT_REMOTE_TESTGIT_NO_MARKS=1 git push) &&
164         compare_refs local2 HEAD server HEAD
165 '
166
167 test_expect_success 'push all with existing object' '
168         (cd local &&
169         git branch dup2 master &&
170         git push origin --all
171         ) &&
172         compare_refs local dup2 server dup2
173 '
174
175 test_expect_success 'push ref with existing object' '
176         (cd local &&
177         git branch dup master &&
178         git push origin dup
179         ) &&
180         compare_refs local dup server dup
181 '
182
183 test_expect_success GPG 'push signed tag' '
184         (cd local &&
185         git checkout master &&
186         git tag -s -m signed-tag signed-tag &&
187         git push origin signed-tag
188         ) &&
189         compare_refs local signed-tag^{} server signed-tag^{} &&
190         test_must_fail compare_refs local signed-tag server signed-tag
191 '
192
193 test_expect_success GPG 'push signed tag with signed-tags capability' '
194         (cd local &&
195         git checkout master &&
196         git tag -s -m signed-tag signed-tag-2 &&
197         GIT_REMOTE_TESTGIT_SIGNED_TAGS=1 git push origin signed-tag-2
198         ) &&
199         compare_refs local signed-tag-2 server signed-tag-2
200 '
201
202 test_expect_success 'push update refs' '
203         (cd local &&
204         git checkout -b update master &&
205         echo update >>file &&
206         git commit -a -m update &&
207         git push origin update &&
208         git rev-parse --verify remotes/origin/update >expect &&
209         git rev-parse --verify testgit/origin/heads/update >actual &&
210         test_cmp expect actual
211         )
212 '
213
214 test_expect_success 'push update refs disabled by no-private-update' '
215         (cd local &&
216         echo more-update >>file &&
217         git commit -a -m more-update &&
218         git rev-parse --verify testgit/origin/heads/update >expect &&
219         GIT_REMOTE_TESTGIT_NO_PRIVATE_UPDATE=t git push origin update &&
220         git rev-parse --verify testgit/origin/heads/update >actual &&
221         test_cmp expect actual
222         )
223 '
224
225 test_expect_success 'push update refs failure' '
226         (cd local &&
227         git checkout update &&
228         echo "update fail" >>file &&
229         git commit -a -m "update fail" &&
230         git rev-parse --verify testgit/origin/heads/update >expect &&
231         test_expect_code 1 env GIT_REMOTE_TESTGIT_FAILURE="non-fast forward" \
232                 git push origin update &&
233         git rev-parse --verify testgit/origin/heads/update >actual &&
234         test_cmp expect actual
235         )
236 '
237
238 clean_mark () {
239         cut -f 2 -d ' ' "$1" |
240         git cat-file --batch-check |
241         grep commit |
242         sort >$(basename "$1")
243 }
244
245 cmp_marks () {
246         test_when_finished "rm -rf git.marks testgit.marks" &&
247         clean_mark ".git/testgit/$1/git.marks" &&
248         clean_mark ".git/testgit/$1/testgit.marks" &&
249         test_cmp git.marks testgit.marks
250 }
251
252 test_expect_success 'proper failure checks for fetching' '
253         (cd local &&
254         test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git fetch 2>error &&
255         cat error &&
256         grep -q "Error while running fast-import" error
257         )
258 '
259
260 test_expect_success 'proper failure checks for pushing' '
261         (cd local &&
262         git checkout -b crash master &&
263         echo crash >>file &&
264         git commit -a -m crash &&
265         test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git push --all &&
266         cmp_marks origin
267         )
268 '
269
270 test_expect_success 'push messages' '
271         (cd local &&
272         git checkout -b new_branch master &&
273         echo new >>file &&
274         git commit -a -m new &&
275         git push origin new_branch &&
276         git fetch origin &&
277         echo new >>file &&
278         git commit -a -m new &&
279         git push origin new_branch 2> msg &&
280         ! grep "\[new branch\]" msg
281         )
282 '
283
284 test_expect_success 'fetch HEAD' '
285         (cd server &&
286         git checkout master &&
287         echo more >>file &&
288         git commit -a -m more
289         ) &&
290         (cd local &&
291         git fetch origin HEAD
292         ) &&
293         compare_refs server HEAD local FETCH_HEAD
294 '
295
296 test_expect_success 'fetch url' '
297         (cd server &&
298         git checkout master &&
299         echo more >>file &&
300         git commit -a -m more
301         ) &&
302         (cd local &&
303         git fetch "testgit::${PWD}/../server"
304         ) &&
305         compare_refs server HEAD local FETCH_HEAD
306 '
307
308 test_done