1#!/bin/sh
   2test_description='pushing to a mirror repository'
   4. ./test-lib.sh
   6D=$(pwd)
   8invert () {
  10        if "$@"; then
  11                return 1
  12        else
  13                return 0
  14        fi
  15}
  16mk_repo_pair () {
  18        rm -rf master mirror &&
  19        mkdir mirror &&
  20        (
  21                cd mirror &&
  22                git init &&
  23                git config receive.denyCurrentBranch warn
  24        ) &&
  25        mkdir master &&
  26        (
  27                cd master &&
  28                git init &&
  29                git remote add $1 up ../mirror
  30        )
  31}
  32# BRANCH tests
  35test_expect_success 'push mirror creates new branches' '
  36        mk_repo_pair &&
  38        (
  39                cd master &&
  40                echo one >foo && git add foo && git commit -m one &&
  41                git push --mirror up
  42        ) &&
  43        master_master=$(cd master && git show-ref -s --verify refs/heads/master) &&
  44        mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) &&
  45        test "$master_master" = "$mirror_master"
  46'
  48test_expect_success 'push mirror updates existing branches' '
  50        mk_repo_pair &&
  52        (
  53                cd master &&
  54                echo one >foo && git add foo && git commit -m one &&
  55                git push --mirror up &&
  56                echo two >foo && git add foo && git commit -m two &&
  57                git push --mirror up
  58        ) &&
  59        master_master=$(cd master && git show-ref -s --verify refs/heads/master) &&
  60        mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) &&
  61        test "$master_master" = "$mirror_master"
  62'
  64test_expect_success 'push mirror force updates existing branches' '
  66        mk_repo_pair &&
  68        (
  69                cd master &&
  70                echo one >foo && git add foo && git commit -m one &&
  71                git push --mirror up &&
  72                echo two >foo && git add foo && git commit -m two &&
  73                git push --mirror up &&
  74                git reset --hard HEAD^ &&
  75                git push --mirror up
  76        ) &&
  77        master_master=$(cd master && git show-ref -s --verify refs/heads/master) &&
  78        mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) &&
  79        test "$master_master" = "$mirror_master"
  80'
  82test_expect_success 'push mirror removes branches' '
  84        mk_repo_pair &&
  86        (
  87                cd master &&
  88                echo one >foo && git add foo && git commit -m one &&
  89                git branch remove master &&
  90                git push --mirror up &&
  91                git branch -D remove &&
  92                git push --mirror up
  93        ) &&
  94        (
  95                cd mirror &&
  96                invert git show-ref -s --verify refs/heads/remove
  97        )
  98'
 100test_expect_success 'push mirror adds, updates and removes branches together' '
 102        mk_repo_pair &&
 104        (
 105                cd master &&
 106                echo one >foo && git add foo && git commit -m one &&
 107                git branch remove master &&
 108                git push --mirror up &&
 109                git branch -D remove &&
 110                git branch add master &&
 111                echo two >foo && git add foo && git commit -m two &&
 112                git push --mirror up
 113        ) &&
 114        master_master=$(cd master && git show-ref -s --verify refs/heads/master) &&
 115        master_add=$(cd master && git show-ref -s --verify refs/heads/add) &&
 116        mirror_master=$(cd mirror && git show-ref -s --verify refs/heads/master) &&
 117        mirror_add=$(cd mirror && git show-ref -s --verify refs/heads/add) &&
 118        test "$master_master" = "$mirror_master" &&
 119        test "$master_add" = "$mirror_add" &&
 120        (
 121                cd mirror &&
 122                invert git show-ref -s --verify refs/heads/remove
 123        )
 124'
 126# TAG tests
 129test_expect_success 'push mirror creates new tags' '
 130        mk_repo_pair &&
 132        (
 133                cd master &&
 134                echo one >foo && git add foo && git commit -m one &&
 135                git tag -f tmaster master &&
 136                git push --mirror up
 137        ) &&
 138        master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) &&
 139        mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) &&
 140        test "$master_master" = "$mirror_master"
 141'
 143test_expect_success 'push mirror updates existing tags' '
 145        mk_repo_pair &&
 147        (
 148                cd master &&
 149                echo one >foo && git add foo && git commit -m one &&
 150                git tag -f tmaster master &&
 151                git push --mirror up &&
 152                echo two >foo && git add foo && git commit -m two &&
 153                git tag -f tmaster master &&
 154                git push --mirror up
 155        ) &&
 156        master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) &&
 157        mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) &&
 158        test "$master_master" = "$mirror_master"
 159'
 161test_expect_success 'push mirror force updates existing tags' '
 163        mk_repo_pair &&
 165        (
 166                cd master &&
 167                echo one >foo && git add foo && git commit -m one &&
 168                git tag -f tmaster master &&
 169                git push --mirror up &&
 170                echo two >foo && git add foo && git commit -m two &&
 171                git tag -f tmaster master &&
 172                git push --mirror up &&
 173                git reset --hard HEAD^ &&
 174                git tag -f tmaster master &&
 175                git push --mirror up
 176        ) &&
 177        master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) &&
 178        mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) &&
 179        test "$master_master" = "$mirror_master"
 180'
 182test_expect_success 'push mirror removes tags' '
 184        mk_repo_pair &&
 186        (
 187                cd master &&
 188                echo one >foo && git add foo && git commit -m one &&
 189                git tag -f tremove master &&
 190                git push --mirror up &&
 191                git tag -d tremove &&
 192                git push --mirror up
 193        ) &&
 194        (
 195                cd mirror &&
 196                invert git show-ref -s --verify refs/tags/tremove
 197        )
 198'
 200test_expect_success 'push mirror adds, updates and removes tags together' '
 202        mk_repo_pair &&
 204        (
 205                cd master &&
 206                echo one >foo && git add foo && git commit -m one &&
 207                git tag -f tmaster master &&
 208                git tag -f tremove master &&
 209                git push --mirror up &&
 210                git tag -d tremove &&
 211                git tag tadd master &&
 212                echo two >foo && git add foo && git commit -m two &&
 213                git tag -f tmaster master &&
 214                git push --mirror up
 215        ) &&
 216        master_master=$(cd master && git show-ref -s --verify refs/tags/tmaster) &&
 217        master_add=$(cd master && git show-ref -s --verify refs/tags/tadd) &&
 218        mirror_master=$(cd mirror && git show-ref -s --verify refs/tags/tmaster) &&
 219        mirror_add=$(cd mirror && git show-ref -s --verify refs/tags/tadd) &&
 220        test "$master_master" = "$mirror_master" &&
 221        test "$master_add" = "$mirror_add" &&
 222        (
 223                cd mirror &&
 224                invert git show-ref -s --verify refs/tags/tremove
 225        )
 226'
 228test_expect_success 'remote.foo.mirror adds and removes branches' '
 230        mk_repo_pair --mirror &&
 232        (
 233                cd master &&
 234                echo one >foo && git add foo && git commit -m one &&
 235                git branch keep master &&
 236                git branch remove master &&
 237                git push up &&
 238                git branch -D remove &&
 239                git push up
 240        ) &&
 241        (
 242                cd mirror &&
 243                git show-ref -s --verify refs/heads/keep &&
 244                invert git show-ref -s --verify refs/heads/remove
 245        )
 246'
 248test_expect_success 'remote.foo.mirror=no has no effect' '
 250        mk_repo_pair &&
 252        (
 253                cd master &&
 254                echo one >foo && git add foo && git commit -m one &&
 255                git config --add remote.up.mirror no &&
 256                git branch keep master &&
 257                git push --mirror up &&
 258                git branch -D keep &&
 259                git push up :
 260        ) &&
 261        (
 262                cd mirror &&
 263                git show-ref -s --verify refs/heads/keep
 264        )
 265'
 267test_done