ddcbfc67246c886d6efba0c35bd4bcfe044e2006
   1#!/bin/sh
   2
   3test_description='basic rebase topology tests'
   4. ./test-lib.sh
   5. "$TEST_DIRECTORY"/lib-rebase.sh
   6
   7# a---b---c
   8#      \
   9#       d---e
  10test_expect_success 'setup' '
  11        test_commit a &&
  12        test_commit b &&
  13        test_commit c &&
  14        git checkout b &&
  15        test_commit d &&
  16        test_commit e
  17'
  18
  19test_run_rebase () {
  20        result=$1
  21        shift
  22        test_expect_$result "simple rebase $*" "
  23                reset_rebase &&
  24                git rebase $* c e &&
  25                test_cmp_rev c HEAD~2 &&
  26                test_linear_range 'd e' c..
  27        "
  28}
  29test_run_rebase success ''
  30test_run_rebase success -m
  31test_run_rebase success -i
  32test_run_rebase success -p
  33
  34test_run_rebase () {
  35        result=$1
  36        shift
  37        test_expect_$result "rebase $* is no-op if upstream is an ancestor" "
  38                reset_rebase &&
  39                git rebase $* b e &&
  40                test_cmp_rev e HEAD
  41        "
  42}
  43test_run_rebase success ''
  44test_run_rebase success -m
  45test_run_rebase success -i
  46test_run_rebase success -p
  47
  48test_run_rebase () {
  49        result=$1
  50        shift
  51        test_expect_$result "rebase $* -f rewrites even if upstream is an ancestor" "
  52                reset_rebase &&
  53                git rebase $* -f b e &&
  54                ! test_cmp_rev e HEAD &&
  55                test_cmp_rev b HEAD~2 &&
  56                test_linear_range 'd e' b..
  57        "
  58}
  59test_run_rebase success ''
  60test_run_rebase success -m
  61test_run_rebase success -i
  62test_run_rebase failure -p
  63
  64test_run_rebase () {
  65        result=$1
  66        shift
  67        test_expect_$result "rebase $* fast-forwards from ancestor of upstream" "
  68                reset_rebase &&
  69                git rebase $* e b &&
  70                test_cmp_rev e HEAD
  71        "
  72}
  73test_run_rebase success ''
  74test_run_rebase success -m
  75test_run_rebase success -i
  76test_run_rebase success -p
  77
  78#       f
  79#      /
  80# a---b---c---g---h
  81#      \
  82#       d---G---i
  83#
  84# uppercase = cherry-picked
  85# h = reverted g
  86#
  87# Reverted patches are there for tests to be able to check if a commit
  88# that introduced the same change as another commit is
  89# dropped. Without reverted commits, we could get false positives
  90# because applying the patch succeeds, but simply results in no
  91# changes.
  92test_expect_success 'setup of linear history for range selection tests' '
  93        git checkout c &&
  94        test_commit g &&
  95        revert h g &&
  96        git checkout d &&
  97        cherry_pick G g &&
  98        test_commit i &&
  99        git checkout b &&
 100        test_commit f
 101'
 102
 103test_run_rebase () {
 104        result=$1
 105        shift
 106        test_expect_$result "rebase $* drops patches in upstream" "
 107                reset_rebase &&
 108                git rebase $* h i &&
 109                test_cmp_rev h HEAD~2 &&
 110                test_linear_range 'd i' h..
 111        "
 112}
 113test_run_rebase success ''
 114test_run_rebase failure -m
 115test_run_rebase success -i
 116test_run_rebase success -p
 117
 118test_run_rebase () {
 119        result=$1
 120        shift
 121        test_expect_$result "rebase $* can drop last patch if in upstream" "
 122                reset_rebase &&
 123                git rebase $* h G &&
 124                test_cmp_rev h HEAD^ &&
 125                test_linear_range 'd' h..
 126        "
 127}
 128test_run_rebase success ''
 129test_run_rebase failure -m
 130test_run_rebase success -i
 131test_run_rebase success -p
 132
 133test_run_rebase () {
 134        result=$1
 135        shift
 136        test_expect_$result "rebase $* --onto drops patches in upstream" "
 137                reset_rebase &&
 138                git rebase $* --onto f h i &&
 139                test_cmp_rev f HEAD~2 &&
 140                test_linear_range 'd i' f..
 141        "
 142}
 143test_run_rebase success ''
 144test_run_rebase failure -m
 145test_run_rebase success -i
 146test_run_rebase success -p
 147
 148test_run_rebase () {
 149        result=$1
 150        shift
 151        test_expect_$result "rebase $* --onto does not drop patches in onto" "
 152                reset_rebase &&
 153                git rebase $* --onto h f i &&
 154                test_cmp_rev h HEAD~3 &&
 155                test_linear_range 'd G i' h..
 156        "
 157}
 158test_run_rebase success ''
 159test_run_rebase success -m
 160test_run_rebase success -i
 161test_run_rebase success -p
 162
 163test_done