3 test_description='fetching and pushing, with or without wildcard'
15 mv .git/hooks .git/hooks-disabled
24 git push testrepo $the_first_commit:refs/$ref || {
25 echo "Oops, push refs/$ref failure"
32 r=$(git show-ref -s --verify refs/$ref) &&
33 test "z$r" = "z$the_first_commit" || {
34 echo "Oops, refs/$ref is wrong"
44 git clone testrepo "$1"
47 check_push_result () {
54 r=$(git show-ref -s --verify refs/$ref) &&
55 test "z$r" = "z$it" || {
56 echo "Oops, refs/$ref is wrong"
64 test_expect_success setup '
69 git commit -a -m repo &&
70 the_first_commit=$(git show-ref -s --verify refs/heads/master) &&
75 git commit -a -m second &&
76 the_commit=$(git show-ref -s --verify refs/heads/master)
80 test_expect_success 'fetch without wildcard' '
84 git fetch .. refs/heads/master:refs/remotes/origin/master &&
86 r=$(git show-ref -s --verify refs/remotes/origin/master) &&
87 test "z$r" = "z$the_commit" &&
89 test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
93 test_expect_success 'fetch with wildcard' '
97 git config remote.up.url .. &&
98 git config remote.up.fetch "refs/heads/*:refs/remotes/origin/*" &&
101 r=$(git show-ref -s --verify refs/remotes/origin/master) &&
102 test "z$r" = "z$the_commit" &&
104 test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
108 test_expect_success 'fetch with insteadOf' '
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/*" &&
118 r=$(git show-ref -s --verify refs/remotes/origin/master) &&
119 test "z$r" = "z$the_commit" &&
121 test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
125 test_expect_success 'push without wildcard' '
128 git push testrepo refs/heads/master:refs/remotes/origin/master &&
131 r=$(git show-ref -s --verify refs/remotes/origin/master) &&
132 test "z$r" = "z$the_commit" &&
134 test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
138 test_expect_success 'push with wildcard' '
141 git push testrepo "refs/heads/*:refs/remotes/origin/*" &&
144 r=$(git show-ref -s --verify refs/remotes/origin/master) &&
145 test "z$r" = "z$the_commit" &&
147 test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
151 test_expect_success 'push with insteadOf' '
154 git config "url.$TRASH.insteadOf" trash/ &&
155 git push trash/testrepo refs/heads/master:refs/remotes/origin/master &&
158 r=$(git show-ref -s --verify refs/remotes/origin/master) &&
159 test "z$r" = "z$the_commit" &&
161 test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
165 test_expect_success 'push with matching heads' '
167 mk_test heads/master &&
169 check_push_result $the_commit heads/master
173 test_expect_success 'push with matching heads on the command line' '
175 mk_test heads/master &&
176 git push testrepo : &&
177 check_push_result $the_commit heads/master
181 test_expect_success 'failed (non-fast-forward) push with matching heads' '
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
192 test_expect_success 'push --force with matching heads' '
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
203 test_expect_success 'push with matching heads and forced update' '
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
214 test_expect_success 'push with no ambiguity (1)' '
216 mk_test heads/master &&
217 git push testrepo master:master &&
218 check_push_result $the_commit heads/master
222 test_expect_success 'push with no ambiguity (2)' '
224 mk_test remotes/origin/master &&
225 git push testrepo master:origin/master &&
226 check_push_result $the_commit remotes/origin/master
230 test_expect_success 'push with colon-less refspec, no ambiguity' '
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
240 test_expect_success 'push with weak ambiguity (1)' '
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
249 test_expect_success 'push with weak ambiguity (2)' '
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
258 test_expect_success 'push with ambiguity' '
260 mk_test heads/frotz tags/frotz &&
261 if git push testrepo master:frotz
263 echo "Oops, should have failed"
266 check_push_result $the_first_commit heads/frotz tags/frotz
271 test_expect_success 'push with colon-less refspec (1)' '
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
281 test_expect_success 'push with colon-less refspec (2)' '
283 mk_test heads/frotz tags/frotz &&
284 if git show-ref --verify -q refs/heads/frotz
289 git push testrepo frotz &&
290 check_push_result $the_commit tags/frotz &&
291 check_push_result $the_first_commit heads/frotz
295 test_expect_success 'push with colon-less refspec (3)' '
298 if git show-ref --verify -q refs/tags/frotz
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 )
308 test_expect_success 'push with colon-less refspec (4)' '
311 if git show-ref --verify -q refs/heads/frotz
316 git push testrepo frotz &&
317 check_push_result $the_commit tags/frotz &&
318 test 1 = $( cd testrepo && git show-ref | wc -l )
322 test_expect_success 'push head with non-existant, incomplete dest' '
325 git push testrepo master:branch &&
326 check_push_result $the_commit heads/branch
330 test_expect_success 'push tag with non-existant, incomplete dest' '
334 git push testrepo v1.0:tag &&
335 check_push_result $the_commit tags/tag
339 test_expect_success 'push sha1 with non-existant, incomplete dest' '
342 test_must_fail git push testrepo `git rev-parse master`:foo
346 test_expect_success 'push ref expression with non-existant, incomplete dest' '
349 test_must_fail git push testrepo master^:branch
353 test_expect_success 'push with HEAD' '
355 mk_test heads/master &&
356 git checkout master &&
357 git push testrepo HEAD &&
358 check_push_result $the_commit heads/master
362 test_expect_success 'push with HEAD nonexisting at remote' '
364 mk_test heads/master &&
365 git checkout -b local master &&
366 git push testrepo HEAD &&
367 check_push_result $the_commit heads/local
370 test_expect_success 'push with +HEAD' '
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 &&
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 &&
385 # With force rewinding should succeed
386 git push testrepo +HEAD &&
387 check_push_result $the_first_commit heads/local
391 test_expect_success 'push HEAD with non-existant, incomplete dest' '
394 git checkout master &&
395 git push testrepo HEAD:branch &&
396 check_push_result $the_commit heads/branch
400 test_expect_success 'push with config remote.*.push = HEAD' '
402 mk_test heads/local &&
403 git checkout master &&
404 git branch -f local $the_commit &&
407 git checkout local &&
408 git reset --hard $the_first_commit
410 git config remote.there.url testrepo &&
411 git config remote.there.push HEAD &&
412 git config branch.master.remote there &&
414 check_push_result $the_commit heads/master &&
415 check_push_result $the_first_commit heads/local
418 # clean up the cruft left with the previous one
419 git config --remove-section remote.there
420 git config --remove-section branch.master
422 test_expect_success 'push with dry-run' '
424 mk_test heads/master &&
426 old_commit=$(git show-ref -s --verify refs/heads/master)) &&
427 git push --dry-run testrepo &&
428 check_push_result $old_commit heads/master
431 test_expect_success 'push updates local refs' '
433 mk_test heads/master &&
436 git pull .. master &&
438 test $(git rev-parse master) = $(git rev-parse remotes/origin/master))
442 test_expect_success 'push updates up-to-date local refs' '
444 mk_test heads/master &&
447 (cd child1 && git pull .. master && git push) &&
449 git pull ../child1 master &&
451 test $(git rev-parse master) = $(git rev-parse remotes/origin/master))
455 test_expect_success 'push preserves up-to-date packed refs' '
457 mk_test heads/master &&
461 ! test -f .git/refs/remotes/origin/master)
465 test_expect_success 'push does not update local refs on failure' '
467 mk_test heads/master &&
469 mkdir testrepo/.git/hooks &&
470 echo exit 1 >testrepo/.git/hooks/pre-receive &&
471 chmod +x testrepo/.git/hooks/pre-receive &&
474 test_must_fail git push &&
475 test $(git rev-parse master) != \
476 $(git rev-parse remotes/origin/master))
480 test_expect_success 'allow deleting an invalid remote ref' '
482 mk_test heads/master &&
483 rm -f testrepo/.git/objects/??/* &&
484 git push testrepo :refs/heads/master &&
485 (cd testrepo && test_must_fail git rev-parse --verify refs/heads/master)
489 test_expect_success 'warn on push to HEAD of non-bare repository' '
492 git checkout master &&
493 git config receive.denyCurrentBranch warn) &&
494 git push testrepo master 2>stderr &&
495 grep "warning.*this may cause confusion" stderr
498 test_expect_success 'deny push to HEAD of non-bare repository' '
501 git checkout master &&
502 git config receive.denyCurrentBranch true) &&
503 test_must_fail git push testrepo master
506 test_expect_success 'allow push to HEAD of bare repository (bare)' '
509 git checkout master &&
510 git config receive.denyCurrentBranch true &&
511 git config core.bare true) &&
512 git push testrepo master 2>stderr &&
513 ! grep "warning.*this may cause confusion" stderr
516 test_expect_success 'allow push to HEAD of non-bare repository (config)' '
519 git checkout master &&
520 git config receive.denyCurrentBranch false
522 git push testrepo master 2>stderr &&
523 ! grep "warning.*this may cause confusion" stderr
526 test_expect_success 'fetch with branches' '
528 git branch second $the_first_commit &&
529 git checkout second &&
530 echo ".." > testrepo/.git/branches/branch1 &&
533 r=$(git show-ref -s --verify refs/heads/branch1) &&
534 test "z$r" = "z$the_commit" &&
535 test 1 = $(git for-each-ref refs/heads | wc -l)
540 test_expect_success 'fetch with branches containing #' '
542 echo "..#second" > testrepo/.git/branches/branch2 &&
545 r=$(git show-ref -s --verify refs/heads/branch2) &&
546 test "z$r" = "z$the_first_commit" &&
547 test 1 = $(git for-each-ref refs/heads | wc -l)
552 test_expect_success 'push with branches' '
554 git checkout second &&
555 echo "testrepo" > .git/branches/branch1 &&
558 r=$(git show-ref -s --verify refs/heads/master) &&
559 test "z$r" = "z$the_first_commit" &&
560 test 1 = $(git for-each-ref refs/heads | wc -l)
564 test_expect_success 'push with branches containing #' '
566 echo "testrepo#branch3" > .git/branches/branch2 &&
569 r=$(git show-ref -s --verify refs/heads/branch3) &&
570 test "z$r" = "z$the_first_commit" &&
571 test 1 = $(git for-each-ref refs/heads | wc -l)