t / t5400-send-pack.shon commit revision.c: introduce --min-parents and --max-parents options (ad5aeed)
   1#!/bin/sh
   2#
   3# Copyright (c) 2005 Junio C Hamano
   4#
   5
   6test_description='See why rewinding head breaks send-pack
   7
   8'
   9. ./test-lib.sh
  10
  11cnt=64
  12test_expect_success setup '
  13        test_tick &&
  14        mkdir mozart mozart/is &&
  15        echo "Commit #0" >mozart/is/pink &&
  16        git update-index --add mozart/is/pink &&
  17        tree=$(git write-tree) &&
  18        commit=$(echo "Commit #0" | git commit-tree $tree) &&
  19        zero=$commit &&
  20        parent=$zero &&
  21        i=0 &&
  22        while test $i -le $cnt
  23        do
  24            i=$(($i+1)) &&
  25            test_tick &&
  26            echo "Commit #$i" >mozart/is/pink &&
  27            git update-index --add mozart/is/pink &&
  28            tree=$(git write-tree) &&
  29            commit=$(echo "Commit #$i" | git commit-tree $tree -p $parent) &&
  30            git update-ref refs/tags/commit$i $commit &&
  31            parent=$commit || return 1
  32        done &&
  33        git update-ref HEAD "$commit" &&
  34        git clone ./. victim &&
  35        ( cd victim && git config receive.denyCurrentBranch warn && git log ) &&
  36        git update-ref HEAD "$zero" &&
  37        parent=$zero &&
  38        i=0 &&
  39        while test $i -le $cnt
  40        do
  41            i=$(($i+1)) &&
  42            test_tick &&
  43            echo "Rebase #$i" >mozart/is/pink &&
  44            git update-index --add mozart/is/pink &&
  45            tree=$(git write-tree) &&
  46            commit=$(echo "Rebase #$i" | git commit-tree $tree -p $parent) &&
  47            git update-ref refs/tags/rebase$i $commit &&
  48            parent=$commit || return 1
  49        done &&
  50        git update-ref HEAD "$commit" &&
  51        echo Rebase &&
  52        git log'
  53
  54test_expect_success 'pack the source repository' '
  55        git repack -a -d &&
  56        git prune
  57'
  58
  59test_expect_success 'pack the destination repository' '
  60    (
  61        cd victim &&
  62        git repack -a -d &&
  63        git prune
  64    )
  65'
  66
  67test_expect_success 'refuse pushing rewound head without --force' '
  68        pushed_head=$(git rev-parse --verify master) &&
  69        victim_orig=$(cd victim && git rev-parse --verify master) &&
  70        test_must_fail git send-pack ./victim master &&
  71        victim_head=$(cd victim && git rev-parse --verify master) &&
  72        test "$victim_head" = "$victim_orig" &&
  73        # this should update
  74        git send-pack --force ./victim master &&
  75        victim_head=$(cd victim && git rev-parse --verify master) &&
  76        test "$victim_head" = "$pushed_head"
  77'
  78
  79test_expect_success \
  80        'push can be used to delete a ref' '
  81        ( cd victim && git branch extra master ) &&
  82        git send-pack ./victim :extra master &&
  83        ( cd victim &&
  84          test_must_fail git rev-parse --verify extra )
  85'
  86
  87test_expect_success 'refuse deleting push with denyDeletes' '
  88        (
  89            cd victim &&
  90            ( git branch -D extra || : ) &&
  91            git config receive.denyDeletes true &&
  92            git branch extra master
  93        ) &&
  94        test_must_fail git send-pack ./victim :extra master
  95'
  96
  97test_expect_success 'cannot override denyDeletes with git -c send-pack' '
  98        (
  99                cd victim &&
 100                test_might_fail git branch -D extra &&
 101                git config receive.denyDeletes true &&
 102                git branch extra master
 103        ) &&
 104        test_must_fail git -c receive.denyDeletes=false \
 105                                        send-pack ./victim :extra master
 106'
 107
 108test_expect_success 'override denyDeletes with git -c receive-pack' '
 109        (
 110                cd victim &&
 111                test_might_fail git branch -D extra &&
 112                git config receive.denyDeletes true &&
 113                git branch extra master
 114        ) &&
 115        git send-pack \
 116                --receive-pack="git -c receive.denyDeletes=false receive-pack" \
 117                ./victim :extra master
 118'
 119
 120test_expect_success 'denyNonFastforwards trumps --force' '
 121        (
 122            cd victim &&
 123            ( git branch -D extra || : ) &&
 124            git config receive.denyNonFastforwards true
 125        ) &&
 126        victim_orig=$(cd victim && git rev-parse --verify master) &&
 127        test_must_fail git send-pack --force ./victim master^:master &&
 128        victim_head=$(cd victim && git rev-parse --verify master) &&
 129        test "$victim_orig" = "$victim_head"
 130'
 131
 132test_expect_success 'push --all excludes remote-tracking hierarchy' '
 133        mkdir parent &&
 134        (
 135            cd parent &&
 136            git init && : >file && git add file && git commit -m add
 137        ) &&
 138        git clone parent child &&
 139        (
 140            cd child && git push --all
 141        ) &&
 142        (
 143            cd parent &&
 144            test -z "$(git for-each-ref refs/remotes/origin)"
 145        )
 146'
 147
 148rewound_push_setup() {
 149        rm -rf parent child &&
 150        mkdir parent &&
 151        (
 152            cd parent &&
 153            git init &&
 154            echo one >file && git add file && git commit -m one &&
 155            git config receive.denyCurrentBranch warn &&
 156            echo two >file && git commit -a -m two
 157        ) &&
 158        git clone parent child &&
 159        (
 160            cd child && git reset --hard HEAD^
 161        )
 162}
 163
 164rewound_push_succeeded() {
 165        cmp ../parent/.git/refs/heads/master .git/refs/heads/master
 166}
 167
 168rewound_push_failed() {
 169        if rewound_push_succeeded
 170        then
 171                false
 172        else
 173                true
 174        fi
 175}
 176
 177test_expect_success 'pushing explicit refspecs respects forcing' '
 178        rewound_push_setup &&
 179        parent_orig=$(cd parent && git rev-parse --verify master) &&
 180        (
 181            cd child &&
 182            test_must_fail git send-pack ../parent \
 183                refs/heads/master:refs/heads/master
 184        ) &&
 185        parent_head=$(cd parent && git rev-parse --verify master) &&
 186        test "$parent_orig" = "$parent_head" &&
 187        (
 188            cd child &&
 189            git send-pack ../parent \
 190                +refs/heads/master:refs/heads/master
 191        ) &&
 192        parent_head=$(cd parent && git rev-parse --verify master) &&
 193        child_head=$(cd parent && git rev-parse --verify master) &&
 194        test "$parent_head" = "$child_head"
 195'
 196
 197test_expect_success 'pushing wildcard refspecs respects forcing' '
 198        rewound_push_setup &&
 199        parent_orig=$(cd parent && git rev-parse --verify master) &&
 200        (
 201            cd child &&
 202            test_must_fail git send-pack ../parent \
 203                "refs/heads/*:refs/heads/*"
 204        ) &&
 205        parent_head=$(cd parent && git rev-parse --verify master) &&
 206        test "$parent_orig" = "$parent_head" &&
 207        (
 208            cd child &&
 209            git send-pack ../parent \
 210                "+refs/heads/*:refs/heads/*"
 211        ) &&
 212        parent_head=$(cd parent && git rev-parse --verify master) &&
 213        child_head=$(cd parent && git rev-parse --verify master) &&
 214        test "$parent_head" = "$child_head"
 215'
 216
 217test_expect_success 'deny pushing to delete current branch' '
 218        rewound_push_setup &&
 219        (
 220            cd child &&
 221            test_must_fail git send-pack ../parent :refs/heads/master 2>errs
 222        )
 223'
 224
 225test_done