c0fa2ba404a7772af07d8546a51b05bd9b17ec2c
   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        )
  16}
  17
  18mk_test () {
  19        mk_empty &&
  20        (
  21                for ref in "$@"
  22                do
  23                        git push testrepo $the_first_commit:refs/$ref || {
  24                                echo "Oops, push refs/$ref failure"
  25                                exit 1
  26                        }
  27                done &&
  28                cd testrepo &&
  29                for ref in "$@"
  30                do
  31                        r=$(git show-ref -s --verify refs/$ref) &&
  32                        test "z$r" = "z$the_first_commit" || {
  33                                echo "Oops, refs/$ref is wrong"
  34                                exit 1
  35                        }
  36                done &&
  37                git fsck --full
  38        )
  39}
  40
  41check_push_result () {
  42        (
  43                cd testrepo &&
  44                it="$1" &&
  45                shift
  46                for ref in "$@"
  47                do
  48                        r=$(git show-ref -s --verify refs/$ref) &&
  49                        test "z$r" = "z$it" || {
  50                                echo "Oops, refs/$ref is wrong"
  51                                exit 1
  52                        }
  53                done &&
  54                git fsck --full
  55        )
  56}
  57
  58test_expect_success setup '
  59
  60        : >path1 &&
  61        git add path1 &&
  62        test_tick &&
  63        git commit -a -m repo &&
  64        the_first_commit=$(git show-ref -s --verify refs/heads/master) &&
  65
  66        : >path2 &&
  67        git add path2 &&
  68        test_tick &&
  69        git commit -a -m second &&
  70        the_commit=$(git show-ref -s --verify refs/heads/master)
  71
  72'
  73
  74test_expect_success 'fetch without wildcard' '
  75        mk_empty &&
  76        (
  77                cd testrepo &&
  78                git fetch .. refs/heads/master:refs/remotes/origin/master &&
  79
  80                r=$(git show-ref -s --verify refs/remotes/origin/master) &&
  81                test "z$r" = "z$the_commit" &&
  82
  83                test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
  84        )
  85'
  86
  87test_expect_success 'fetch with wildcard' '
  88        mk_empty &&
  89        (
  90                cd testrepo &&
  91                git config remote.up.url .. &&
  92                git config remote.up.fetch "refs/heads/*:refs/remotes/origin/*" &&
  93                git fetch up &&
  94
  95                r=$(git show-ref -s --verify refs/remotes/origin/master) &&
  96                test "z$r" = "z$the_commit" &&
  97
  98                test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
  99        )
 100'
 101
 102test_expect_success 'push without wildcard' '
 103        mk_empty &&
 104
 105        git push testrepo refs/heads/master:refs/remotes/origin/master &&
 106        (
 107                cd testrepo &&
 108                r=$(git show-ref -s --verify refs/remotes/origin/master) &&
 109                test "z$r" = "z$the_commit" &&
 110
 111                test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
 112        )
 113'
 114
 115test_expect_success 'push with wildcard' '
 116        mk_empty &&
 117
 118        git push testrepo "refs/heads/*:refs/remotes/origin/*" &&
 119        (
 120                cd testrepo &&
 121                r=$(git show-ref -s --verify refs/remotes/origin/master) &&
 122                test "z$r" = "z$the_commit" &&
 123
 124                test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
 125        )
 126'
 127
 128test_expect_success 'push with matching heads' '
 129
 130        mk_test heads/master &&
 131        git push testrepo &&
 132        check_push_result $the_commit heads/master
 133
 134'
 135
 136test_expect_success 'push with no ambiguity (1)' '
 137
 138        mk_test heads/master &&
 139        git push testrepo master:master &&
 140        check_push_result $the_commit heads/master
 141
 142'
 143
 144test_expect_success 'push with no ambiguity (2)' '
 145
 146        mk_test remotes/origin/master &&
 147        git push testrepo master:master &&
 148        check_push_result $the_commit remotes/origin/master
 149
 150'
 151
 152test_expect_success 'push with weak ambiguity (1)' '
 153
 154        mk_test heads/master remotes/origin/master &&
 155        git push testrepo master:master &&
 156        check_push_result $the_commit heads/master &&
 157        check_push_result $the_first_commit remotes/origin/master
 158
 159'
 160
 161test_expect_success 'push with weak ambiguity (2)' '
 162
 163        mk_test heads/master remotes/origin/master remotes/another/master &&
 164        git push testrepo master:master &&
 165        check_push_result $the_commit heads/master &&
 166        check_push_result $the_first_commit remotes/origin/master remotes/another/master
 167
 168'
 169
 170test_expect_success 'push with ambiguity (1)' '
 171
 172        mk_test remotes/origin/master remotes/frotz/master &&
 173        if git push testrepo master:master
 174        then
 175                echo "Oops, should have failed"
 176                false
 177        else
 178                check_push_result $the_first_commit remotes/origin/master remotes/frotz/master
 179        fi
 180'
 181
 182test_expect_success 'push with ambiguity (2)' '
 183
 184        mk_test heads/frotz tags/frotz &&
 185        if git push testrepo master:frotz
 186        then
 187                echo "Oops, should have failed"
 188                false
 189        else
 190                check_push_result $the_first_commit heads/frotz tags/frotz
 191        fi
 192
 193'
 194
 195test_expect_success 'push with colon-less refspec (1)' '
 196
 197        mk_test heads/frotz tags/frotz &&
 198        git branch -f frotz master &&
 199        git push testrepo frotz &&
 200        check_push_result $the_commit heads/frotz &&
 201        check_push_result $the_first_commit tags/frotz
 202
 203'
 204
 205test_expect_success 'push with colon-less refspec (2)' '
 206
 207        mk_test heads/frotz tags/frotz &&
 208        if git show-ref --verify -q refs/heads/frotz
 209        then
 210                git branch -D frotz
 211        fi &&
 212        git tag -f frotz &&
 213        git push testrepo frotz &&
 214        check_push_result $the_commit tags/frotz &&
 215        check_push_result $the_first_commit heads/frotz
 216
 217'
 218
 219test_expect_success 'push with colon-less refspec (3)' '
 220
 221        mk_test &&
 222        if git show-ref --verify -q refs/tags/frotz
 223        then
 224                git tag -d frotz
 225        fi &&
 226        git branch -f frotz master &&
 227        git push testrepo frotz &&
 228        check_push_result $the_commit heads/frotz &&
 229        test 1 = $( cd testrepo && git show-ref | wc -l )
 230'
 231
 232test_expect_success 'push with colon-less refspec (4)' '
 233
 234        mk_test &&
 235        if git show-ref --verify -q refs/heads/frotz
 236        then
 237                git branch -D frotz
 238        fi &&
 239        git tag -f frotz &&
 240        git push testrepo frotz &&
 241        check_push_result $the_commit tags/frotz &&
 242        test 1 = $( cd testrepo && git show-ref | wc -l )
 243
 244'
 245
 246test_done