Merge branch 'ne/futz-upload-pack' into jch
[git] / t / t5516-fetch-push.sh
1 #!/bin/sh
2
3 test_description='fetching and pushing, with or without wildcard'
4
5 . ./test-lib.sh
6
7 D=`pwd`
8
9 mk_empty () {
10         rm -fr testrepo &&
11         mkdir testrepo &&
12         (
13                 cd testrepo &&
14                 git init &&
15                 mv .git/hooks .git/hooks-disabled
16         )
17 }
18
19 mk_test () {
20         mk_empty &&
21         (
22                 for ref in "$@"
23                 do
24                         git push testrepo $the_first_commit:refs/$ref || {
25                                 echo "Oops, push refs/$ref failure"
26                                 exit 1
27                         }
28                 done &&
29                 cd testrepo &&
30                 for ref in "$@"
31                 do
32                         r=$(git show-ref -s --verify refs/$ref) &&
33                         test "z$r" = "z$the_first_commit" || {
34                                 echo "Oops, refs/$ref is wrong"
35                                 exit 1
36                         }
37                 done &&
38                 git fsck --full
39         )
40 }
41
42 mk_child() {
43         rm -rf "$1" &&
44         git clone testrepo "$1"
45 }
46
47 check_push_result () {
48         (
49                 cd testrepo &&
50                 it="$1" &&
51                 shift
52                 for ref in "$@"
53                 do
54                         r=$(git show-ref -s --verify refs/$ref) &&
55                         test "z$r" = "z$it" || {
56                                 echo "Oops, refs/$ref is wrong"
57                                 exit 1
58                         }
59                 done &&
60                 git fsck --full
61         )
62 }
63
64 test_expect_success setup '
65
66         : >path1 &&
67         git add path1 &&
68         test_tick &&
69         git commit -a -m repo &&
70         the_first_commit=$(git show-ref -s --verify refs/heads/master) &&
71
72         : >path2 &&
73         git add path2 &&
74         test_tick &&
75         git commit -a -m second &&
76         the_commit=$(git show-ref -s --verify refs/heads/master)
77
78 '
79
80 test_expect_success 'fetch without wildcard' '
81         mk_empty &&
82         (
83                 cd testrepo &&
84                 git fetch .. refs/heads/master:refs/remotes/origin/master &&
85
86                 r=$(git show-ref -s --verify refs/remotes/origin/master) &&
87                 test "z$r" = "z$the_commit" &&
88
89                 test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
90         )
91 '
92
93 test_expect_success 'fetch with wildcard' '
94         mk_empty &&
95         (
96                 cd testrepo &&
97                 git config remote.up.url .. &&
98                 git config remote.up.fetch "refs/heads/*:refs/remotes/origin/*" &&
99                 git fetch up &&
100
101                 r=$(git show-ref -s --verify refs/remotes/origin/master) &&
102                 test "z$r" = "z$the_commit" &&
103
104                 test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
105         )
106 '
107
108 test_expect_success 'fetch with insteadOf' '
109         mk_empty &&
110         (
111                 TRASH=$(pwd)/ &&
112                 cd testrepo &&
113                 git config "url.$TRASH.insteadOf" trash/ &&
114                 git config remote.up.url trash/. &&
115                 git config remote.up.fetch "refs/heads/*:refs/remotes/origin/*" &&
116                 git fetch up &&
117
118                 r=$(git show-ref -s --verify refs/remotes/origin/master) &&
119                 test "z$r" = "z$the_commit" &&
120
121                 test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
122         )
123 '
124
125 test_expect_success 'push without wildcard' '
126         mk_empty &&
127
128         git push testrepo refs/heads/master:refs/remotes/origin/master &&
129         (
130                 cd testrepo &&
131                 r=$(git show-ref -s --verify refs/remotes/origin/master) &&
132                 test "z$r" = "z$the_commit" &&
133
134                 test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
135         )
136 '
137
138 test_expect_success 'push with wildcard' '
139         mk_empty &&
140
141         git push testrepo "refs/heads/*:refs/remotes/origin/*" &&
142         (
143                 cd testrepo &&
144                 r=$(git show-ref -s --verify refs/remotes/origin/master) &&
145                 test "z$r" = "z$the_commit" &&
146
147                 test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
148         )
149 '
150
151 test_expect_success 'push with insteadOf' '
152         mk_empty &&
153         TRASH="$(pwd)/" &&
154         git config "url.$TRASH.insteadOf" trash/ &&
155         git push trash/testrepo refs/heads/master:refs/remotes/origin/master &&
156         (
157                 cd testrepo &&
158                 r=$(git show-ref -s --verify refs/remotes/origin/master) &&
159                 test "z$r" = "z$the_commit" &&
160
161                 test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
162         )
163 '
164
165 test_expect_success 'push with matching heads' '
166
167         mk_test heads/master &&
168         git push testrepo &&
169         check_push_result $the_commit heads/master
170
171 '
172
173 test_expect_success 'push with matching heads on the command line' '
174
175         mk_test heads/master &&
176         git push testrepo : &&
177         check_push_result $the_commit heads/master
178
179 '
180
181 test_expect_success 'failed (non-fast-forward) push with matching heads' '
182
183         mk_test heads/master &&
184         git push testrepo : &&
185         git commit --amend -massaged &&
186         test_must_fail git push testrepo &&
187         check_push_result $the_commit heads/master &&
188         git reset --hard $the_commit
189
190 '
191
192 test_expect_success 'push --force with matching heads' '
193
194         mk_test heads/master &&
195         git push testrepo : &&
196         git commit --amend -massaged &&
197         git push --force testrepo &&
198         ! check_push_result $the_commit heads/master &&
199         git reset --hard $the_commit
200
201 '
202
203 test_expect_success 'push with matching heads and forced update' '
204
205         mk_test heads/master &&
206         git push testrepo : &&
207         git commit --amend -massaged &&
208         git push testrepo +: &&
209         ! check_push_result $the_commit heads/master &&
210         git reset --hard $the_commit
211
212 '
213
214 test_expect_success 'push with no ambiguity (1)' '
215
216         mk_test heads/master &&
217         git push testrepo master:master &&
218         check_push_result $the_commit heads/master
219
220 '
221
222 test_expect_success 'push with no ambiguity (2)' '
223
224         mk_test remotes/origin/master &&
225         git push testrepo master:origin/master &&
226         check_push_result $the_commit remotes/origin/master
227
228 '
229
230 test_expect_success 'push with colon-less refspec, no ambiguity' '
231
232         mk_test heads/master heads/t/master &&
233         git branch -f t/master master &&
234         git push testrepo master &&
235         check_push_result $the_commit heads/master &&
236         check_push_result $the_first_commit heads/t/master
237
238 '
239
240 test_expect_success 'push with weak ambiguity (1)' '
241
242         mk_test heads/master remotes/origin/master &&
243         git push testrepo master:master &&
244         check_push_result $the_commit heads/master &&
245         check_push_result $the_first_commit remotes/origin/master
246
247 '
248
249 test_expect_success 'push with weak ambiguity (2)' '
250
251         mk_test heads/master remotes/origin/master remotes/another/master &&
252         git push testrepo master:master &&
253         check_push_result $the_commit heads/master &&
254         check_push_result $the_first_commit remotes/origin/master remotes/another/master
255
256 '
257
258 test_expect_success 'push with ambiguity' '
259
260         mk_test heads/frotz tags/frotz &&
261         if git push testrepo master:frotz
262         then
263                 echo "Oops, should have failed"
264                 false
265         else
266                 check_push_result $the_first_commit heads/frotz tags/frotz
267         fi
268
269 '
270
271 test_expect_success 'push with colon-less refspec (1)' '
272
273         mk_test heads/frotz tags/frotz &&
274         git branch -f frotz master &&
275         git push testrepo frotz &&
276         check_push_result $the_commit heads/frotz &&
277         check_push_result $the_first_commit tags/frotz
278
279 '
280
281 test_expect_success 'push with colon-less refspec (2)' '
282
283         mk_test heads/frotz tags/frotz &&
284         if git show-ref --verify -q refs/heads/frotz
285         then
286                 git branch -D frotz
287         fi &&
288         git tag -f frotz &&
289         git push testrepo frotz &&
290         check_push_result $the_commit tags/frotz &&
291         check_push_result $the_first_commit heads/frotz
292
293 '
294
295 test_expect_success 'push with colon-less refspec (3)' '
296
297         mk_test &&
298         if git show-ref --verify -q refs/tags/frotz
299         then
300                 git tag -d frotz
301         fi &&
302         git branch -f frotz master &&
303         git push testrepo frotz &&
304         check_push_result $the_commit heads/frotz &&
305         test 1 = $( cd testrepo && git show-ref | wc -l )
306 '
307
308 test_expect_success 'push with colon-less refspec (4)' '
309
310         mk_test &&
311         if git show-ref --verify -q refs/heads/frotz
312         then
313                 git branch -D frotz
314         fi &&
315         git tag -f frotz &&
316         git push testrepo frotz &&
317         check_push_result $the_commit tags/frotz &&
318         test 1 = $( cd testrepo && git show-ref | wc -l )
319
320 '
321
322 test_expect_success 'push head with non-existant, incomplete dest' '
323
324         mk_test &&
325         git push testrepo master:branch &&
326         check_push_result $the_commit heads/branch
327
328 '
329
330 test_expect_success 'push tag with non-existant, incomplete dest' '
331
332         mk_test &&
333         git tag -f v1.0 &&
334         git push testrepo v1.0:tag &&
335         check_push_result $the_commit tags/tag
336
337 '
338
339 test_expect_success 'push sha1 with non-existant, incomplete dest' '
340
341         mk_test &&
342         test_must_fail git push testrepo `git rev-parse master`:foo
343
344 '
345
346 test_expect_success 'push ref expression with non-existant, incomplete dest' '
347
348         mk_test &&
349         test_must_fail git push testrepo master^:branch
350
351 '
352
353 test_expect_success 'push with HEAD' '
354
355         mk_test heads/master &&
356         git checkout master &&
357         git push testrepo HEAD &&
358         check_push_result $the_commit heads/master
359
360 '
361
362 test_expect_success 'push with HEAD nonexisting at remote' '
363
364         mk_test heads/master &&
365         git checkout -b local master &&
366         git push testrepo HEAD &&
367         check_push_result $the_commit heads/local
368 '
369
370 test_expect_success 'push with +HEAD' '
371
372         mk_test heads/master &&
373         git checkout master &&
374         git branch -D local &&
375         git checkout -b local &&
376         git push testrepo master local &&
377         check_push_result $the_commit heads/master &&
378         check_push_result $the_commit heads/local &&
379
380         # Without force rewinding should fail
381         git reset --hard HEAD^ &&
382         test_must_fail git push testrepo HEAD &&
383         check_push_result $the_commit heads/local &&
384
385         # With force rewinding should succeed
386         git push testrepo +HEAD &&
387         check_push_result $the_first_commit heads/local
388
389 '
390
391 test_expect_success 'push HEAD with non-existant, incomplete dest' '
392
393         mk_test &&
394         git checkout master &&
395         git push testrepo HEAD:branch &&
396         check_push_result $the_commit heads/branch
397
398 '
399
400 test_expect_success 'push with config remote.*.push = HEAD' '
401
402         mk_test heads/local &&
403         git checkout master &&
404         git branch -f local $the_commit &&
405         (
406                 cd testrepo &&
407                 git checkout local &&
408                 git reset --hard $the_first_commit
409         ) &&
410         git config remote.there.url testrepo &&
411         git config remote.there.push HEAD &&
412         git config branch.master.remote there &&
413         git push &&
414         check_push_result $the_commit heads/master &&
415         check_push_result $the_first_commit heads/local
416 '
417
418 # clean up the cruft left with the previous one
419 git config --remove-section remote.there
420 git config --remove-section branch.master
421
422 test_expect_success 'push with config remote.*.pushurl' '
423
424         mk_test heads/master &&
425         git checkout master &&
426         git config remote.there.url test2repo &&
427         git config remote.there.pushurl testrepo &&
428         git push there &&
429         check_push_result $the_commit heads/master
430 '
431
432 # clean up the cruft left with the previous one
433 git config --remove-section remote.there
434
435 test_expect_success 'push with dry-run' '
436
437         mk_test heads/master &&
438         (cd testrepo &&
439          old_commit=$(git show-ref -s --verify refs/heads/master)) &&
440         git push --dry-run testrepo &&
441         check_push_result $old_commit heads/master
442 '
443
444 test_expect_success 'push updates local refs' '
445
446         mk_test heads/master &&
447         mk_child child &&
448         (cd child &&
449                 git pull .. master &&
450                 git push &&
451         test $(git rev-parse master) = $(git rev-parse remotes/origin/master))
452
453 '
454
455 test_expect_success 'push updates up-to-date local refs' '
456
457         mk_test heads/master &&
458         mk_child child1 &&
459         mk_child child2 &&
460         (cd child1 && git pull .. master && git push) &&
461         (cd child2 &&
462                 git pull ../child1 master &&
463                 git push &&
464         test $(git rev-parse master) = $(git rev-parse remotes/origin/master))
465
466 '
467
468 test_expect_success 'push preserves up-to-date packed refs' '
469
470         mk_test heads/master &&
471         mk_child child &&
472         (cd child &&
473                 git push &&
474         ! test -f .git/refs/remotes/origin/master)
475
476 '
477
478 test_expect_success 'push does not update local refs on failure' '
479
480         mk_test heads/master &&
481         mk_child child &&
482         mkdir testrepo/.git/hooks &&
483         echo exit 1 >testrepo/.git/hooks/pre-receive &&
484         chmod +x testrepo/.git/hooks/pre-receive &&
485         (cd child &&
486                 git pull .. master
487                 test_must_fail git push &&
488                 test $(git rev-parse master) != \
489                         $(git rev-parse remotes/origin/master))
490
491 '
492
493 test_expect_success 'allow deleting an invalid remote ref' '
494
495         mk_test heads/master &&
496         rm -f testrepo/.git/objects/??/* &&
497         git push testrepo :refs/heads/master &&
498         (cd testrepo && test_must_fail git rev-parse --verify refs/heads/master)
499
500 '
501
502 test_expect_success 'warn on push to HEAD of non-bare repository' '
503         mk_test heads/master
504         (cd testrepo &&
505                 git checkout master &&
506                 git config receive.denyCurrentBranch warn) &&
507         git push testrepo master 2>stderr &&
508         grep "warning: updating the current branch" stderr
509 '
510
511 test_expect_success 'deny push to HEAD of non-bare repository' '
512         mk_test heads/master
513         (cd testrepo &&
514                 git checkout master &&
515                 git config receive.denyCurrentBranch true) &&
516         test_must_fail git push testrepo master
517 '
518
519 test_expect_success 'allow push to HEAD of bare repository (bare)' '
520         mk_test heads/master
521         (cd testrepo &&
522                 git checkout master &&
523                 git config receive.denyCurrentBranch true &&
524                 git config core.bare true) &&
525         git push testrepo master 2>stderr &&
526         ! grep "warning: updating the current branch" stderr
527 '
528
529 test_expect_success 'allow push to HEAD of non-bare repository (config)' '
530         mk_test heads/master
531         (cd testrepo &&
532                 git checkout master &&
533                 git config receive.denyCurrentBranch false
534         ) &&
535         git push testrepo master 2>stderr &&
536         ! grep "warning: updating the current branch" stderr
537 '
538
539 test_expect_success 'fetch with branches' '
540         mk_empty &&
541         git branch second $the_first_commit &&
542         git checkout second &&
543         echo ".." > testrepo/.git/branches/branch1 &&
544         (cd testrepo &&
545                 git fetch branch1 &&
546                 r=$(git show-ref -s --verify refs/heads/branch1) &&
547                 test "z$r" = "z$the_commit" &&
548                 test 1 = $(git for-each-ref refs/heads | wc -l)
549         ) &&
550         git checkout master
551 '
552
553 test_expect_success 'fetch with branches containing #' '
554         mk_empty &&
555         echo "..#second" > testrepo/.git/branches/branch2 &&
556         (cd testrepo &&
557                 git fetch branch2 &&
558                 r=$(git show-ref -s --verify refs/heads/branch2) &&
559                 test "z$r" = "z$the_first_commit" &&
560                 test 1 = $(git for-each-ref refs/heads | wc -l)
561         ) &&
562         git checkout master
563 '
564
565 test_expect_success 'push with branches' '
566         mk_empty &&
567         git checkout second &&
568         echo "testrepo" > .git/branches/branch1 &&
569         git push branch1 &&
570         (cd testrepo &&
571                 r=$(git show-ref -s --verify refs/heads/master) &&
572                 test "z$r" = "z$the_first_commit" &&
573                 test 1 = $(git for-each-ref refs/heads | wc -l)
574         )
575 '
576
577 test_expect_success 'push with branches containing #' '
578         mk_empty &&
579         echo "testrepo#branch3" > .git/branches/branch2 &&
580         git push branch2 &&
581         (cd testrepo &&
582                 r=$(git show-ref -s --verify refs/heads/branch3) &&
583                 test "z$r" = "z$the_first_commit" &&
584                 test 1 = $(git for-each-ref refs/heads | wc -l)
585         ) &&
586         git checkout master
587 '
588
589 test_done