t / t5400-send-pack.shon commit builtin-commit: use reduce_heads() only when appropriate (cf10f9f)
   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 &&
  36        git log &&
  37        cd .. &&
  38        git update-ref HEAD "$zero" &&
  39        parent=$zero &&
  40        i=0 &&
  41        while test $i -le $cnt
  42        do
  43            i=$(($i+1)) &&
  44            test_tick &&
  45            echo "Rebase #$i" >mozart/is/pink &&
  46            git update-index --add mozart/is/pink &&
  47            tree=$(git write-tree) &&
  48            commit=$(echo "Rebase #$i" | git commit-tree $tree -p $parent) &&
  49            git update-ref refs/tags/rebase$i $commit &&
  50            parent=$commit || return 1
  51        done &&
  52        git update-ref HEAD "$commit" &&
  53        echo Rebase &&
  54        git log'
  55
  56test_expect_success 'pack the source repository' '
  57        git repack -a -d &&
  58        git prune
  59'
  60
  61test_expect_success 'pack the destination repository' '
  62        cd victim &&
  63        git repack -a -d &&
  64        git prune &&
  65        cd ..
  66'
  67
  68test_expect_success \
  69        'pushing rewound head should not barf but require --force' '
  70        # should not fail but refuse to update.
  71        if git send-pack ./victim/.git/ master
  72        then
  73                # now it should fail with Pasky patch
  74                echo >&2 Gaah, it should have failed.
  75                false
  76        else
  77                echo >&2 Thanks, it correctly failed.
  78                true
  79        fi &&
  80        if cmp victim/.git/refs/heads/master .git/refs/heads/master
  81        then
  82                # should have been left as it was!
  83                false
  84        else
  85                true
  86        fi &&
  87        # this should update
  88        git send-pack --force ./victim/.git/ master &&
  89        cmp victim/.git/refs/heads/master .git/refs/heads/master
  90'
  91
  92test_expect_success \
  93        'push can be used to delete a ref' '
  94        cd victim &&
  95        git branch extra master &&
  96        cd .. &&
  97        test -f victim/.git/refs/heads/extra &&
  98        git send-pack ./victim/.git/ :extra master &&
  99        ! test -f victim/.git/refs/heads/extra
 100'
 101
 102unset GIT_CONFIG GIT_CONFIG_LOCAL
 103HOME=`pwd`/no-such-directory
 104export HOME ;# this way we force the victim/.git/config to be used.
 105
 106test_expect_success \
 107        'pushing with --force should be denied with denyNonFastforwards' '
 108        cd victim &&
 109        git config receive.denyNonFastforwards true &&
 110        cd .. &&
 111        git update-ref refs/heads/master master^ || return 1
 112        git send-pack --force ./victim/.git/ master && return 1
 113        ! test_cmp .git/refs/heads/master victim/.git/refs/heads/master
 114'
 115
 116test_expect_success \
 117        'pushing does not include non-head refs' '
 118        mkdir parent && cd parent &&
 119        git init && touch file && git add file && git commit -m add &&
 120        cd .. &&
 121        git clone parent child && cd child && git push --all &&
 122        cd ../parent &&
 123        git branch -a >branches && ! grep origin/master branches
 124'
 125
 126rewound_push_setup() {
 127        rm -rf parent child &&
 128        mkdir parent && cd parent &&
 129        git init && echo one >file && git add file && git commit -m one &&
 130        echo two >file && git commit -a -m two &&
 131        cd .. &&
 132        git clone parent child && cd child && git reset --hard HEAD^
 133}
 134
 135rewound_push_succeeded() {
 136        cmp ../parent/.git/refs/heads/master .git/refs/heads/master
 137}
 138
 139rewound_push_failed() {
 140        if rewound_push_succeeded
 141        then
 142                false
 143        else
 144                true
 145        fi
 146}
 147
 148test_expect_success \
 149        'pushing explicit refspecs respects forcing' '
 150        rewound_push_setup &&
 151        if git send-pack ../parent/.git refs/heads/master:refs/heads/master
 152        then
 153                false
 154        else
 155                true
 156        fi && rewound_push_failed &&
 157        git send-pack ../parent/.git +refs/heads/master:refs/heads/master &&
 158        rewound_push_succeeded
 159'
 160
 161test_expect_success \
 162        'pushing wildcard refspecs respects forcing' '
 163        rewound_push_setup &&
 164        if git send-pack ../parent/.git refs/heads/*:refs/heads/*
 165        then
 166                false
 167        else
 168                true
 169        fi && rewound_push_failed &&
 170        git send-pack ../parent/.git +refs/heads/*:refs/heads/* &&
 171        rewound_push_succeeded
 172'
 173
 174test_done