1#!/bin/sh
2
3test_description='fetching and pushing, with or without wildcard'
4
5. ./test-lib.sh
6
7D=`pwd`
8
9mk_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
19mk_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
42mk_child() {
43 rm -rf "$1" &&
44 git clone testrepo "$1"
45}
46
47check_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
64test_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
80test_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
93test_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
108test_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
125test_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
138test_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
151test_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
165test_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
173test_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
181test_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
192test_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
203test_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
214test_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
222test_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
230test_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
240test_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
249test_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
258test_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
271test_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
281test_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
295test_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
308test_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
322test_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
330test_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
339test_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
346test_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
353test_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
362test_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
370test_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
391test_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
400test_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
419git config --remove-section remote.there
420git config --remove-section branch.master
421
422test_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
433git config --remove-section remote.there
434
435test_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
444test_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
455test_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
468test_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
478test_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
493test_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
502test_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
511test_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
519test_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
529test_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
539test_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
553test_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
565test_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
577test_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
589test_done