t / t5516-fetch-push.shon commit Merge branch 'mk/maint-parse-careful' (ee4f06c)
   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
  42check_push_result () {
  43        (
  44                cd testrepo &&
  45                it="$1" &&
  46                shift
  47                for ref in "$@"
  48                do
  49                        r=$(git show-ref -s --verify refs/$ref) &&
  50                        test "z$r" = "z$it" || {
  51                                echo "Oops, refs/$ref is wrong"
  52                                exit 1
  53                        }
  54                done &&
  55                git fsck --full
  56        )
  57}
  58
  59test_expect_success setup '
  60
  61        : >path1 &&
  62        git add path1 &&
  63        test_tick &&
  64        git commit -a -m repo &&
  65        the_first_commit=$(git show-ref -s --verify refs/heads/master) &&
  66
  67        : >path2 &&
  68        git add path2 &&
  69        test_tick &&
  70        git commit -a -m second &&
  71        the_commit=$(git show-ref -s --verify refs/heads/master)
  72
  73'
  74
  75test_expect_success 'fetch without wildcard' '
  76        mk_empty &&
  77        (
  78                cd testrepo &&
  79                git fetch .. refs/heads/master:refs/remotes/origin/master &&
  80
  81                r=$(git show-ref -s --verify refs/remotes/origin/master) &&
  82                test "z$r" = "z$the_commit" &&
  83
  84                test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
  85        )
  86'
  87
  88test_expect_success 'fetch with wildcard' '
  89        mk_empty &&
  90        (
  91                cd testrepo &&
  92                git config remote.up.url .. &&
  93                git config remote.up.fetch "refs/heads/*:refs/remotes/origin/*" &&
  94                git fetch up &&
  95
  96                r=$(git show-ref -s --verify refs/remotes/origin/master) &&
  97                test "z$r" = "z$the_commit" &&
  98
  99                test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
 100        )
 101'
 102
 103test_expect_success 'push without wildcard' '
 104        mk_empty &&
 105
 106        git push testrepo refs/heads/master:refs/remotes/origin/master &&
 107        (
 108                cd testrepo &&
 109                r=$(git show-ref -s --verify refs/remotes/origin/master) &&
 110                test "z$r" = "z$the_commit" &&
 111
 112                test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
 113        )
 114'
 115
 116test_expect_success 'push with wildcard' '
 117        mk_empty &&
 118
 119        git push testrepo "refs/heads/*:refs/remotes/origin/*" &&
 120        (
 121                cd testrepo &&
 122                r=$(git show-ref -s --verify refs/remotes/origin/master) &&
 123                test "z$r" = "z$the_commit" &&
 124
 125                test 1 = $(git for-each-ref refs/remotes/origin | wc -l)
 126        )
 127'
 128
 129test_expect_success 'push with matching heads' '
 130
 131        mk_test heads/master &&
 132        git push testrepo &&
 133        check_push_result $the_commit heads/master
 134
 135'
 136
 137test_expect_success 'push with no ambiguity (1)' '
 138
 139        mk_test heads/master &&
 140        git push testrepo master:master &&
 141        check_push_result $the_commit heads/master
 142
 143'
 144
 145test_expect_success 'push with no ambiguity (2)' '
 146
 147        mk_test remotes/origin/master &&
 148        git push testrepo master:origin/master &&
 149        check_push_result $the_commit remotes/origin/master
 150
 151'
 152
 153test_expect_success 'push with colon-less refspec, no ambiguity' '
 154
 155        mk_test heads/master heads/t/master &&
 156        git branch -f t/master master &&
 157        git push testrepo master &&
 158        check_push_result $the_commit heads/master &&
 159        check_push_result $the_first_commit heads/t/master
 160
 161'
 162
 163test_expect_success 'push with weak ambiguity (1)' '
 164
 165        mk_test heads/master remotes/origin/master &&
 166        git push testrepo master:master &&
 167        check_push_result $the_commit heads/master &&
 168        check_push_result $the_first_commit remotes/origin/master
 169
 170'
 171
 172test_expect_success 'push with weak ambiguity (2)' '
 173
 174        mk_test heads/master remotes/origin/master remotes/another/master &&
 175        git push testrepo master:master &&
 176        check_push_result $the_commit heads/master &&
 177        check_push_result $the_first_commit remotes/origin/master remotes/another/master
 178
 179'
 180
 181test_expect_success 'push with ambiguity (1)' '
 182
 183        mk_test remotes/origin/master remotes/frotz/master &&
 184        if git push testrepo master:master
 185        then
 186                echo "Oops, should have failed"
 187                false
 188        else
 189                check_push_result $the_first_commit remotes/origin/master remotes/frotz/master
 190        fi
 191'
 192
 193test_expect_success 'push with ambiguity (2)' '
 194
 195        mk_test heads/frotz tags/frotz &&
 196        if git push testrepo master:frotz
 197        then
 198                echo "Oops, should have failed"
 199                false
 200        else
 201                check_push_result $the_first_commit heads/frotz tags/frotz
 202        fi
 203
 204'
 205
 206test_expect_success 'push with colon-less refspec (1)' '
 207
 208        mk_test heads/frotz tags/frotz &&
 209        git branch -f frotz master &&
 210        git push testrepo frotz &&
 211        check_push_result $the_commit heads/frotz &&
 212        check_push_result $the_first_commit tags/frotz
 213
 214'
 215
 216test_expect_success 'push with colon-less refspec (2)' '
 217
 218        mk_test heads/frotz tags/frotz &&
 219        if git show-ref --verify -q refs/heads/frotz
 220        then
 221                git branch -D frotz
 222        fi &&
 223        git tag -f frotz &&
 224        git push testrepo frotz &&
 225        check_push_result $the_commit tags/frotz &&
 226        check_push_result $the_first_commit heads/frotz
 227
 228'
 229
 230test_expect_success 'push with colon-less refspec (3)' '
 231
 232        mk_test &&
 233        if git show-ref --verify -q refs/tags/frotz
 234        then
 235                git tag -d frotz
 236        fi &&
 237        git branch -f frotz master &&
 238        git push testrepo frotz &&
 239        check_push_result $the_commit heads/frotz &&
 240        test 1 = $( cd testrepo && git show-ref | wc -l )
 241'
 242
 243test_expect_success 'push with colon-less refspec (4)' '
 244
 245        mk_test &&
 246        if git show-ref --verify -q refs/heads/frotz
 247        then
 248                git branch -D frotz
 249        fi &&
 250        git tag -f frotz &&
 251        git push testrepo frotz &&
 252        check_push_result $the_commit tags/frotz &&
 253        test 1 = $( cd testrepo && git show-ref | wc -l )
 254
 255'
 256
 257test_expect_success 'push with HEAD' '
 258
 259        mk_test heads/master &&
 260        git checkout master &&
 261        git push testrepo HEAD &&
 262        check_push_result $the_commit heads/master
 263
 264'
 265
 266test_expect_success 'push with HEAD nonexisting at remote' '
 267
 268        mk_test heads/master &&
 269        git checkout -b local master &&
 270        git push testrepo HEAD &&
 271        check_push_result $the_commit heads/local
 272'
 273
 274test_expect_success 'push with dry-run' '
 275
 276        mk_test heads/master &&
 277        (cd testrepo &&
 278         old_commit=$(git show-ref -s --verify refs/heads/master)) &&
 279        git push --dry-run testrepo &&
 280        check_push_result $old_commit heads/master
 281'
 282
 283test_expect_success 'push updates local refs' '
 284
 285        rm -rf parent child &&
 286        mkdir parent &&
 287        (cd parent && git init &&
 288                echo one >foo && git add foo && git commit -m one) &&
 289        git clone parent child &&
 290        (cd child &&
 291                echo two >foo && git commit -a -m two &&
 292                git push &&
 293        test $(git rev-parse master) = $(git rev-parse remotes/origin/master))
 294
 295'
 296
 297test_expect_success 'push does not update local refs on failure' '
 298
 299        rm -rf parent child &&
 300        mkdir parent &&
 301        (cd parent && git init &&
 302                echo one >foo && git add foo && git commit -m one &&
 303                echo exit 1 >.git/hooks/pre-receive &&
 304                chmod +x .git/hooks/pre-receive) &&
 305        git clone parent child &&
 306        (cd child &&
 307                echo two >foo && git commit -a -m two &&
 308                ! git push &&
 309                test $(git rev-parse master) != \
 310                        $(git rev-parse remotes/origin/master))
 311
 312'
 313
 314test_expect_success 'allow deleting an invalid remote ref' '
 315
 316        pwd &&
 317        rm -f testrepo/.git/objects/??/* &&
 318        git push testrepo :refs/heads/master &&
 319        (cd testrepo && ! git rev-parse --verify refs/heads/master)
 320
 321'
 322
 323test_done