t / t5533-push-cas.shon commit Git 2.4.9 (74b6763)
   1#!/bin/sh
   2
   3test_description='compare & swap push force/delete safety'
   4
   5. ./test-lib.sh
   6
   7setup_srcdst_basic () {
   8        rm -fr src dst &&
   9        git clone --no-local . src &&
  10        git clone --no-local src dst &&
  11        (
  12                cd src && git checkout HEAD^0
  13        )
  14}
  15
  16test_expect_success setup '
  17        # create template repository
  18        test_commit A &&
  19        test_commit B &&
  20        test_commit C
  21'
  22
  23test_expect_success 'push to update (protected)' '
  24        setup_srcdst_basic &&
  25        (
  26                cd dst &&
  27                test_commit D &&
  28                test_must_fail git push --force-with-lease=master:master origin master
  29        ) &&
  30        git ls-remote . refs/heads/master >expect &&
  31        git ls-remote src refs/heads/master >actual &&
  32        test_cmp expect actual
  33'
  34
  35test_expect_success 'push to update (protected, forced)' '
  36        setup_srcdst_basic &&
  37        (
  38                cd dst &&
  39                test_commit D &&
  40                git push --force --force-with-lease=master:master origin master
  41        ) &&
  42        git ls-remote dst refs/heads/master >expect &&
  43        git ls-remote src refs/heads/master >actual &&
  44        test_cmp expect actual
  45'
  46
  47test_expect_success 'push to update (protected, tracking)' '
  48        setup_srcdst_basic &&
  49        (
  50                cd src &&
  51                git checkout master &&
  52                test_commit D &&
  53                git checkout HEAD^0
  54        ) &&
  55        git ls-remote src refs/heads/master >expect &&
  56        (
  57                cd dst &&
  58                test_commit E &&
  59                git ls-remote . refs/remotes/origin/master >expect &&
  60                test_must_fail git push --force-with-lease=master origin master &&
  61                git ls-remote . refs/remotes/origin/master >actual &&
  62                test_cmp expect actual
  63        ) &&
  64        git ls-remote src refs/heads/master >actual &&
  65        test_cmp expect actual
  66'
  67
  68test_expect_success 'push to update (protected, tracking, forced)' '
  69        setup_srcdst_basic &&
  70        (
  71                cd src &&
  72                git checkout master &&
  73                test_commit D &&
  74                git checkout HEAD^0
  75        ) &&
  76        (
  77                cd dst &&
  78                test_commit E &&
  79                git ls-remote . refs/remotes/origin/master >expect &&
  80                git push --force --force-with-lease=master origin master
  81        ) &&
  82        git ls-remote dst refs/heads/master >expect &&
  83        git ls-remote src refs/heads/master >actual &&
  84        test_cmp expect actual
  85'
  86
  87test_expect_success 'push to update (allowed)' '
  88        setup_srcdst_basic &&
  89        (
  90                cd dst &&
  91                test_commit D &&
  92                git push --force-with-lease=master:master^ origin master
  93        ) &&
  94        git ls-remote dst refs/heads/master >expect &&
  95        git ls-remote src refs/heads/master >actual &&
  96        test_cmp expect actual
  97'
  98
  99test_expect_success 'push to update (allowed, tracking)' '
 100        setup_srcdst_basic &&
 101        (
 102                cd dst &&
 103                test_commit D &&
 104                git push --force-with-lease=master origin master
 105        ) &&
 106        git ls-remote dst refs/heads/master >expect &&
 107        git ls-remote src refs/heads/master >actual &&
 108        test_cmp expect actual
 109'
 110
 111test_expect_success 'push to update (allowed even though no-ff)' '
 112        setup_srcdst_basic &&
 113        (
 114                cd dst &&
 115                git reset --hard HEAD^ &&
 116                test_commit D &&
 117                git push --force-with-lease=master origin master
 118        ) &&
 119        git ls-remote dst refs/heads/master >expect &&
 120        git ls-remote src refs/heads/master >actual &&
 121        test_cmp expect actual
 122'
 123
 124test_expect_success 'push to delete (protected)' '
 125        setup_srcdst_basic &&
 126        git ls-remote src refs/heads/master >expect &&
 127        (
 128                cd dst &&
 129                test_must_fail git push --force-with-lease=master:master^ origin :master
 130        ) &&
 131        git ls-remote src refs/heads/master >actual &&
 132        test_cmp expect actual
 133'
 134
 135test_expect_success 'push to delete (protected, forced)' '
 136        setup_srcdst_basic &&
 137        (
 138                cd dst &&
 139                git push --force --force-with-lease=master:master^ origin :master
 140        ) &&
 141        >expect &&
 142        git ls-remote src refs/heads/master >actual &&
 143        test_cmp expect actual
 144'
 145
 146test_expect_success 'push to delete (allowed)' '
 147        setup_srcdst_basic &&
 148        (
 149                cd dst &&
 150                git push --force-with-lease=master origin :master
 151        ) &&
 152        >expect &&
 153        git ls-remote src refs/heads/master >actual &&
 154        test_cmp expect actual
 155'
 156
 157test_expect_success 'cover everything with default force-with-lease (protected)' '
 158        setup_srcdst_basic &&
 159        (
 160                cd src &&
 161                git branch naster master^
 162        ) &&
 163        git ls-remote src refs/heads/\* >expect &&
 164        (
 165                cd dst &&
 166                test_must_fail git push --force-with-lease origin master master:naster
 167        ) &&
 168        git ls-remote src refs/heads/\* >actual &&
 169        test_cmp expect actual
 170'
 171
 172test_expect_success 'cover everything with default force-with-lease (allowed)' '
 173        setup_srcdst_basic &&
 174        (
 175                cd src &&
 176                git branch naster master^
 177        ) &&
 178        (
 179                cd dst &&
 180                git fetch &&
 181                git push --force-with-lease origin master master:naster
 182        ) &&
 183        git ls-remote dst refs/heads/master |
 184        sed -e "s/master/naster/" >expect &&
 185        git ls-remote src refs/heads/naster >actual &&
 186        test_cmp expect actual
 187'
 188
 189test_done