t / t3409-rebase-preserve-merges.shon commit Merge branch 'jn/doc-dashdash' into maint (7baf32a)
   1#!/bin/sh
   2#
   3# Copyright(C) 2008 Stephen Habermann & Andreas Ericsson
   4#
   5test_description='git rebase -p should preserve merges
   6
   7Run "git rebase -p" and check that merges are properly carried along
   8'
   9. ./test-lib.sh
  10
  11GIT_AUTHOR_EMAIL=bogus_email_address
  12export GIT_AUTHOR_EMAIL
  13
  14# Clone 1 (trivial merge):
  15#
  16# A1--A2  <-- origin/master
  17#  \   \
  18#   B1--M  <-- topic
  19#    \
  20#     B2  <-- origin/topic
  21#
  22# Clone 2 (conflicting merge):
  23#
  24# A1--A2--B3   <-- origin/master
  25#  \       \
  26#   B1------M  <-- topic
  27#    \
  28#     B2       <-- origin/topic
  29#
  30# Clone 3 (no-ff merge):
  31#
  32# A1--A2--B3   <-- origin/master
  33#  \
  34#   B1------M  <-- topic
  35#    \     /
  36#     \--A3    <-- topic2
  37#      \
  38#       B2     <-- origin/topic
  39#
  40# Clone 4 (merge using second parent as base):
  41#
  42# A1--A2--B3   <-- origin/master
  43#  \
  44#   B1--A3--M  <-- topic
  45#    \     /
  46#     \--A4    <-- topic2
  47#      \
  48#       B2     <-- origin/topic
  49
  50test_expect_success 'setup for merge-preserving rebase' \
  51        'echo First > A &&
  52        git add A &&
  53        git commit -m "Add A1" &&
  54        git checkout -b topic &&
  55        echo Second > B &&
  56        git add B &&
  57        git commit -m "Add B1" &&
  58        git checkout -f master &&
  59        echo Third >> A &&
  60        git commit -a -m "Modify A2" &&
  61
  62        git clone ./. clone1 &&
  63        (cd clone1 &&
  64        git checkout -b topic origin/topic &&
  65        git merge origin/master
  66        ) &&
  67
  68        git clone ./. clone4 &&
  69        (
  70                cd clone4 &&
  71                git checkout -b topic origin/topic &&
  72                git merge origin/master
  73        ) &&
  74
  75        echo Fifth > B &&
  76        git add B &&
  77        git commit -m "Add different B" &&
  78
  79        git clone ./. clone2 &&
  80        (
  81                cd clone2 &&
  82                git checkout -b topic origin/topic &&
  83                test_must_fail git merge origin/master &&
  84                echo Resolved >B &&
  85                git add B &&
  86                git commit -m "Merge origin/master into topic"
  87        ) &&
  88
  89        git clone ./. clone3 &&
  90        (
  91                cd clone3 &&
  92                git checkout -b topic2 origin/topic &&
  93                echo Sixth > A &&
  94                git commit -a -m "Modify A3" &&
  95                git checkout -b topic origin/topic &&
  96                git merge --no-ff topic2
  97        ) &&
  98
  99        git checkout topic &&
 100        echo Fourth >> B &&
 101        git commit -a -m "Modify B2"
 102'
 103
 104test_expect_success 'rebase -p fakes interactive rebase' '
 105        (
 106        cd clone1 &&
 107        git fetch &&
 108        git rebase -p origin/topic &&
 109        test 1 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) &&
 110        test 1 = $(git rev-list --all --pretty=oneline | grep "Merge remote-tracking branch " | wc -l)
 111        )
 112'
 113
 114test_expect_success '--continue works after a conflict' '
 115        (
 116        cd clone2 &&
 117        git fetch &&
 118        test_must_fail git rebase -p origin/topic &&
 119        test 2 = $(git ls-files B | wc -l) &&
 120        echo Resolved again > B &&
 121        test_must_fail git rebase --continue &&
 122        grep "^@@@ " .git/rebase-merge/patch &&
 123        git add B &&
 124        git rebase --continue &&
 125        test 1 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) &&
 126        test 1 = $(git rev-list --all --pretty=oneline | grep "Add different" | wc -l) &&
 127        test 1 = $(git rev-list --all --pretty=oneline | grep "Merge origin" | wc -l)
 128        )
 129'
 130
 131test_expect_success 'rebase -p preserves no-ff merges' '
 132        (
 133        cd clone3 &&
 134        git fetch &&
 135        git rebase -p origin/topic &&
 136        test 3 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) &&
 137        test 1 = $(git rev-list --all --pretty=oneline | grep "Merge branch" | wc -l)
 138        )
 139'
 140
 141test_expect_success 'rebase -p works when base inside second parent' '
 142        (
 143        cd clone4 &&
 144        git fetch &&
 145        git rebase -p HEAD^2 &&
 146        test 1 = $(git rev-list --all --pretty=oneline | grep "Modify A" | wc -l) &&
 147        test 1 = $(git rev-list --all --pretty=oneline | grep "Modify B" | wc -l) &&
 148        test 1 = $(git rev-list --all --pretty=oneline | grep "Merge remote-tracking branch " | wc -l)
 149        )
 150'
 151
 152test_done