Code

Merge branch 'jc/quote'
[git.git] / t / t5516-fetch-push.sh
index dba018f667048d7bd5233136dfe70ee0f1305a9a..c0fa2ba404a7772af07d8546a51b05bd9b17ec2c 100755 (executable)
@@ -15,12 +15,58 @@ mk_empty () {
        )
 }
 
+mk_test () {
+       mk_empty &&
+       (
+               for ref in "$@"
+               do
+                       git push testrepo $the_first_commit:refs/$ref || {
+                               echo "Oops, push refs/$ref failure"
+                               exit 1
+                       }
+               done &&
+               cd testrepo &&
+               for ref in "$@"
+               do
+                       r=$(git show-ref -s --verify refs/$ref) &&
+                       test "z$r" = "z$the_first_commit" || {
+                               echo "Oops, refs/$ref is wrong"
+                               exit 1
+                       }
+               done &&
+               git fsck --full
+       )
+}
+
+check_push_result () {
+       (
+               cd testrepo &&
+               it="$1" &&
+               shift
+               for ref in "$@"
+               do
+                       r=$(git show-ref -s --verify refs/$ref) &&
+                       test "z$r" = "z$it" || {
+                               echo "Oops, refs/$ref is wrong"
+                               exit 1
+                       }
+               done &&
+               git fsck --full
+       )
+}
+
 test_expect_success setup '
 
        : >path1 &&
        git add path1 &&
        test_tick &&
        git commit -a -m repo &&
+       the_first_commit=$(git show-ref -s --verify refs/heads/master) &&
+
+       : >path2 &&
+       git add path2 &&
+       test_tick &&
+       git commit -a -m second &&
        the_commit=$(git show-ref -s --verify refs/heads/master)
 
 '
@@ -79,4 +125,122 @@ test_expect_success 'push with wildcard' '
        )
 '
 
+test_expect_success 'push with matching heads' '
+
+       mk_test heads/master &&
+       git push testrepo &&
+       check_push_result $the_commit heads/master
+
+'
+
+test_expect_success 'push with no ambiguity (1)' '
+
+       mk_test heads/master &&
+       git push testrepo master:master &&
+       check_push_result $the_commit heads/master
+
+'
+
+test_expect_success 'push with no ambiguity (2)' '
+
+       mk_test remotes/origin/master &&
+       git push testrepo master:master &&
+       check_push_result $the_commit remotes/origin/master
+
+'
+
+test_expect_success 'push with weak ambiguity (1)' '
+
+       mk_test heads/master remotes/origin/master &&
+       git push testrepo master:master &&
+       check_push_result $the_commit heads/master &&
+       check_push_result $the_first_commit remotes/origin/master
+
+'
+
+test_expect_success 'push with weak ambiguity (2)' '
+
+       mk_test heads/master remotes/origin/master remotes/another/master &&
+       git push testrepo master:master &&
+       check_push_result $the_commit heads/master &&
+       check_push_result $the_first_commit remotes/origin/master remotes/another/master
+
+'
+
+test_expect_success 'push with ambiguity (1)' '
+
+       mk_test remotes/origin/master remotes/frotz/master &&
+       if git push testrepo master:master
+       then
+               echo "Oops, should have failed"
+               false
+       else
+               check_push_result $the_first_commit remotes/origin/master remotes/frotz/master
+       fi
+'
+
+test_expect_success 'push with ambiguity (2)' '
+
+       mk_test heads/frotz tags/frotz &&
+       if git push testrepo master:frotz
+       then
+               echo "Oops, should have failed"
+               false
+       else
+               check_push_result $the_first_commit heads/frotz tags/frotz
+       fi
+
+'
+
+test_expect_success 'push with colon-less refspec (1)' '
+
+       mk_test heads/frotz tags/frotz &&
+       git branch -f frotz master &&
+       git push testrepo frotz &&
+       check_push_result $the_commit heads/frotz &&
+       check_push_result $the_first_commit tags/frotz
+
+'
+
+test_expect_success 'push with colon-less refspec (2)' '
+
+       mk_test heads/frotz tags/frotz &&
+       if git show-ref --verify -q refs/heads/frotz
+       then
+               git branch -D frotz
+       fi &&
+       git tag -f frotz &&
+       git push testrepo frotz &&
+       check_push_result $the_commit tags/frotz &&
+       check_push_result $the_first_commit heads/frotz
+
+'
+
+test_expect_success 'push with colon-less refspec (3)' '
+
+       mk_test &&
+       if git show-ref --verify -q refs/tags/frotz
+       then
+               git tag -d frotz
+       fi &&
+       git branch -f frotz master &&
+       git push testrepo frotz &&
+       check_push_result $the_commit heads/frotz &&
+       test 1 = $( cd testrepo && git show-ref | wc -l )
+'
+
+test_expect_success 'push with colon-less refspec (4)' '
+
+       mk_test &&
+       if git show-ref --verify -q refs/heads/frotz
+       then
+               git branch -D frotz
+       fi &&
+       git tag -f frotz &&
+       git push testrepo frotz &&
+       check_push_result $the_commit tags/frotz &&
+       test 1 = $( cd testrepo && git show-ref | wc -l )
+
+'
+
 test_done