ef6f7a54ae23bc58198363b20019a58c54b021fc
   1#!/bin/sh
   2
   3test_description='git rebase --root
   4
   5Tests if git rebase --root --onto <newparent> can rebase the root commit.
   6'
   7. ./test-lib.sh
   8
   9test_expect_success 'prepare repository' '
  10        echo 1 > A &&
  11        git add A &&
  12        git commit -m 1 &&
  13        echo 2 > A &&
  14        git add A &&
  15        git commit -m 2 &&
  16        git symbolic-ref HEAD refs/heads/other &&
  17        rm .git/index &&
  18        echo 3 > B &&
  19        git add B &&
  20        git commit -m 3 &&
  21        echo 1 > A &&
  22        git add A &&
  23        git commit -m 1b &&
  24        echo 4 > B &&
  25        git add B &&
  26        git commit -m 4
  27'
  28
  29test_expect_success 'rebase --root expects --onto' '
  30        test_must_fail git rebase --root
  31'
  32
  33test_expect_success 'setup pre-rebase hook' '
  34        mkdir -p .git/hooks &&
  35        cat >.git/hooks/pre-rebase <<EOF &&
  36#!$SHELL_PATH
  37echo "\$1,\$2" >.git/PRE-REBASE-INPUT
  38EOF
  39        chmod +x .git/hooks/pre-rebase
  40'
  41cat > expect <<EOF
  424
  433
  442
  451
  46EOF
  47
  48test_expect_success 'rebase --root --onto <newbase>' '
  49        git checkout -b work &&
  50        git rebase --root --onto master &&
  51        git log --pretty=tformat:"%s" > rebased &&
  52        test_cmp expect rebased
  53'
  54
  55test_expect_success 'pre-rebase got correct input (1)' '
  56        test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,
  57'
  58
  59test_expect_success 'rebase --root --onto <newbase> <branch>' '
  60        git branch work2 other &&
  61        git rebase --root --onto master work2 &&
  62        git log --pretty=tformat:"%s" > rebased2 &&
  63        test_cmp expect rebased2
  64'
  65
  66test_expect_success 'pre-rebase got correct input (2)' '
  67        test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,work2
  68'
  69
  70test_expect_success 'rebase -i --root --onto <newbase>' '
  71        git checkout -b work3 other &&
  72        GIT_EDITOR=: git rebase -i --root --onto master &&
  73        git log --pretty=tformat:"%s" > rebased3 &&
  74        test_cmp expect rebased3
  75'
  76
  77test_expect_success 'pre-rebase got correct input (3)' '
  78        test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,
  79'
  80
  81test_expect_success 'rebase -i --root --onto <newbase> <branch>' '
  82        git branch work4 other &&
  83        GIT_EDITOR=: git rebase -i --root --onto master work4 &&
  84        git log --pretty=tformat:"%s" > rebased4 &&
  85        test_cmp expect rebased4
  86'
  87
  88test_expect_success 'pre-rebase got correct input (4)' '
  89        test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,work4
  90'
  91
  92test_expect_success 'rebase -i -p with linear history' '
  93        git checkout -b work5 other &&
  94        GIT_EDITOR=: git rebase -i -p --root --onto master &&
  95        git log --pretty=tformat:"%s" > rebased5 &&
  96        test_cmp expect rebased5
  97'
  98
  99test_expect_success 'pre-rebase got correct input (5)' '
 100        test "z$(cat .git/PRE-REBASE-INPUT)" = z--root,
 101'
 102
 103test_expect_success 'set up merge history' '
 104        git checkout other^ &&
 105        git checkout -b side &&
 106        echo 5 > C &&
 107        git add C &&
 108        git commit -m 5 &&
 109        git checkout other &&
 110        git merge side
 111'
 112
 113sed 's/#/ /g' > expect-side <<'EOF'
 114*   Merge branch 'side' into other
 115|\##
 116| * 5
 117* | 4
 118|/##
 119* 3
 120* 2
 121* 1
 122EOF
 123
 124test_expect_success 'rebase -i -p with merge' '
 125        git checkout -b work6 other &&
 126        GIT_EDITOR=: git rebase -i -p --root --onto master &&
 127        git log --graph --topo-order --pretty=tformat:"%s" > rebased6 &&
 128        test_cmp expect-side rebased6
 129'
 130
 131test_expect_success 'set up second root and merge' '
 132        git symbolic-ref HEAD refs/heads/third &&
 133        rm .git/index &&
 134        rm A B C &&
 135        echo 6 > D &&
 136        git add D &&
 137        git commit -m 6 &&
 138        git checkout other &&
 139        git merge third
 140'
 141
 142sed 's/#/ /g' > expect-third <<'EOF'
 143*   Merge branch 'third' into other
 144|\##
 145| * 6
 146* |   Merge branch 'side' into other
 147|\ \##
 148| * | 5
 149* | | 4
 150|/ /##
 151* | 3
 152|/##
 153* 2
 154* 1
 155EOF
 156
 157test_expect_success 'rebase -i -p with two roots' '
 158        git checkout -b work7 other &&
 159        GIT_EDITOR=: git rebase -i -p --root --onto master &&
 160        git log --graph --topo-order --pretty=tformat:"%s" > rebased7 &&
 161        test_cmp expect-third rebased7
 162'
 163
 164test_expect_success 'setup pre-rebase hook that fails' '
 165        mkdir -p .git/hooks &&
 166        cat >.git/hooks/pre-rebase <<EOF &&
 167#!$SHELL_PATH
 168false
 169EOF
 170        chmod +x .git/hooks/pre-rebase
 171'
 172
 173test_expect_success 'pre-rebase hook stops rebase' '
 174        git checkout -b stops1 other &&
 175        GIT_EDITOR=: test_must_fail git rebase --root --onto master &&
 176        test "z$(git symbolic-ref HEAD)" = zrefs/heads/stops1
 177        test 0 = $(git rev-list other...stops1 | wc -l)
 178'
 179
 180test_expect_success 'pre-rebase hook stops rebase -i' '
 181        git checkout -b stops2 other &&
 182        GIT_EDITOR=: test_must_fail git rebase --root --onto master &&
 183        test "z$(git symbolic-ref HEAD)" = zrefs/heads/stops2
 184        test 0 = $(git rev-list other...stops2 | wc -l)
 185'
 186
 187test_expect_success 'remove pre-rebase hook' '
 188        rm -f .git/hooks/pre-rebase
 189'
 190
 191test_expect_success 'set up a conflict' '
 192        git checkout master &&
 193        echo conflict > B &&
 194        git add B &&
 195        git commit -m conflict
 196'
 197
 198test_expect_success 'rebase --root with conflict (first part)' '
 199        git checkout -b conflict1 other &&
 200        test_must_fail git rebase --root --onto master &&
 201        git ls-files -u | grep "B$"
 202'
 203
 204test_expect_success 'fix the conflict' '
 205        echo 3 > B &&
 206        git add B
 207'
 208
 209cat > expect-conflict <<EOF
 2106
 2115
 2124
 2133
 214conflict
 2152
 2161
 217EOF
 218
 219test_expect_success 'rebase --root with conflict (second part)' '
 220        git rebase --continue &&
 221        git log --pretty=tformat:"%s" > conflict1 &&
 222        test_cmp expect-conflict conflict1
 223'
 224
 225test_expect_success 'rebase -i --root with conflict (first part)' '
 226        git checkout -b conflict2 other &&
 227        GIT_EDITOR=: test_must_fail git rebase -i --root --onto master &&
 228        git ls-files -u | grep "B$"
 229'
 230
 231test_expect_success 'fix the conflict' '
 232        echo 3 > B &&
 233        git add B
 234'
 235
 236test_expect_success 'rebase -i --root with conflict (second part)' '
 237        git rebase --continue &&
 238        git log --pretty=tformat:"%s" > conflict2 &&
 239        test_cmp expect-conflict conflict2
 240'
 241
 242cat >expect-conflict-p <<\EOF
 243commit conflict3 conflict3~1 conflict3^2
 244Merge branch 'third' into other
 245commit conflict3^2 conflict3~4
 2466
 247commit conflict3~1 conflict3~2 conflict3~1^2
 248Merge branch 'side' into other
 249commit conflict3~1^2 conflict3~3
 2505
 251commit conflict3~2 conflict3~3
 2524
 253commit conflict3~3 conflict3~4
 2543
 255commit conflict3~4 conflict3~5
 256conflict
 257commit conflict3~5 conflict3~6
 2582
 259commit conflict3~6
 2601
 261EOF
 262
 263test_expect_success 'rebase -i -p --root with conflict (first part)' '
 264        git checkout -b conflict3 other &&
 265        GIT_EDITOR=: test_must_fail git rebase -i -p --root --onto master &&
 266        git ls-files -u | grep "B$"
 267'
 268
 269test_expect_success 'fix the conflict' '
 270        echo 3 > B &&
 271        git add B
 272'
 273
 274test_expect_success 'rebase -i -p --root with conflict (second part)' '
 275        git rebase --continue &&
 276        git rev-list --topo-order --parents --pretty="tformat:%s" HEAD |
 277        git name-rev --stdin --name-only --refs=refs/heads/conflict3 >out &&
 278        test_cmp expect-conflict-p out
 279'
 280
 281test_done