Merge branch 'js/fsck-name-object'
[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 test_expect_success 'proper failure checks for fetching' '
246         (cd local &&
247         test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git fetch 2>error &&
248         cat error &&
249         grep -q "Error while running fast-import" error
250         )
251 '
252
253 test_expect_success 'proper failure checks for pushing' '
254         test_when_finished "rm -rf local/git.marks local/testgit.marks" &&
255         (cd local &&
256         git checkout -b crash master &&
257         echo crash >>file &&
258         git commit -a -m crash &&
259         test_must_fail env GIT_REMOTE_TESTGIT_FAILURE=1 git push --all &&
260         clean_mark ".git/testgit/origin/git.marks" &&
261         clean_mark ".git/testgit/origin/testgit.marks" &&
262         test_cmp git.marks testgit.marks
263         )
264 '
265
266 test_expect_success 'push messages' '
267         (cd local &&
268         git checkout -b new_branch master &&
269         echo new >>file &&
270         git commit -a -m new &&
271         git push origin new_branch &&
272         git fetch origin &&
273         echo new >>file &&
274         git commit -a -m new &&
275         git push origin new_branch 2> msg &&
276         ! grep "\[new branch\]" msg
277         )
278 '
279
280 test_expect_success 'fetch HEAD' '
281         (cd server &&
282         git checkout master &&
283         echo more >>file &&
284         git commit -a -m more
285         ) &&
286         (cd local &&
287         git fetch origin HEAD
288         ) &&
289         compare_refs server HEAD local FETCH_HEAD
290 '
291
292 test_expect_success 'fetch url' '
293         (cd server &&
294         git checkout master &&
295         echo more >>file &&
296         git commit -a -m more
297         ) &&
298         (cd local &&
299         git fetch "testgit::${PWD}/../server"
300         ) &&
301         compare_refs server HEAD local FETCH_HEAD
302 '
303
304 test_done