9206c22ffbc6d1b6528dc7edd533129b4ee8ee5d
   1#!/bin/sh
   2
   3test_description='recursive merge corner cases'
   4
   5. ./test-lib.sh
   6
   7#
   8#  L1  L2
   9#   o---o
  10#  / \ / \
  11# o   X   ?
  12#  \ / \ /
  13#   o---o
  14#  R1  R2
  15#
  16
  17test_expect_success 'setup basic criss-cross + rename with no modifications' '
  18        ten="0 1 2 3 4 5 6 7 8 9"
  19        for i in $ten
  20        do
  21                echo line $i in a sample file
  22        done >one &&
  23        for i in $ten
  24        do
  25                echo line $i in another sample file
  26        done >two &&
  27        git add one two &&
  28        test_tick && git commit -m initial &&
  29
  30        git branch L1 &&
  31        git checkout -b R1 &&
  32        git mv one three &&
  33        test_tick && git commit -m R1 &&
  34
  35        git checkout L1 &&
  36        git mv two three &&
  37        test_tick && git commit -m L1 &&
  38
  39        git checkout L1^0 &&
  40        test_tick && git merge -s ours R1 &&
  41        git tag L2 &&
  42
  43        git checkout R1^0 &&
  44        test_tick && git merge -s ours L1 &&
  45        git tag R2
  46'
  47
  48test_expect_success 'merge simple rename+criss-cross with no modifications' '
  49        git reset --hard &&
  50        git checkout L2^0 &&
  51
  52        test_must_fail git merge -s recursive R2^0 &&
  53
  54        test 5 = $(git ls-files -s | wc -l) &&
  55        test 3 = $(git ls-files -u | wc -l) &&
  56        test 0 = $(git ls-files -o | wc -l) &&
  57
  58        test $(git rev-parse :0:one) = $(git rev-parse L2:one) &&
  59        test $(git rev-parse :0:two) = $(git rev-parse R2:two) &&
  60        test $(git rev-parse :2:three) = $(git rev-parse L2:three) &&
  61        test $(git rev-parse :3:three) = $(git rev-parse R2:three) &&
  62
  63        cp two merged &&
  64        >empty &&
  65        test_must_fail git merge-file \
  66                -L "Temporary merge branch 2" \
  67                -L "" \
  68                -L "Temporary merge branch 1" \
  69                merged empty one &&
  70        test $(git rev-parse :1:three) = $(git hash-object merged)
  71'
  72
  73#
  74# Same as before, but modify L1 slightly:
  75#
  76#  L1m L2
  77#   o---o
  78#  / \ / \
  79# o   X   ?
  80#  \ / \ /
  81#   o---o
  82#  R1  R2
  83#
  84
  85test_expect_success 'setup criss-cross + rename merges with basic modification' '
  86        git rm -rf . &&
  87        git clean -fdqx &&
  88        rm -rf .git &&
  89        git init &&
  90
  91        ten="0 1 2 3 4 5 6 7 8 9"
  92        for i in $ten
  93        do
  94                echo line $i in a sample file
  95        done >one &&
  96        for i in $ten
  97        do
  98                echo line $i in another sample file
  99        done >two &&
 100        git add one two &&
 101        test_tick && git commit -m initial &&
 102
 103        git branch L1 &&
 104        git checkout -b R1 &&
 105        git mv one three &&
 106        echo more >>two &&
 107        git add two &&
 108        test_tick && git commit -m R1 &&
 109
 110        git checkout L1 &&
 111        git mv two three &&
 112        test_tick && git commit -m L1 &&
 113
 114        git checkout L1^0 &&
 115        test_tick && git merge -s ours R1 &&
 116        git tag L2 &&
 117
 118        git checkout R1^0 &&
 119        test_tick && git merge -s ours L1 &&
 120        git tag R2
 121'
 122
 123test_expect_failure 'merge criss-cross + rename merges with basic modification' '
 124        git reset --hard &&
 125        git checkout L2^0 &&
 126
 127        test_must_fail git merge -s recursive R2^0 &&
 128
 129        test 5 = $(git ls-files -s | wc -l) &&
 130        test 3 = $(git ls-files -u | wc -l) &&
 131        test 0 = $(git ls-files -o | wc -l) &&
 132
 133        test $(git rev-parse :0:one) = $(git rev-parse L2:one) &&
 134        test $(git rev-parse :0:two) = $(git rev-parse R2:two) &&
 135        test $(git rev-parse :2:three) = $(git rev-parse L2:three) &&
 136        test $(git rev-parse :3:three) = $(git rev-parse R2:three) &&
 137
 138        head -n 10 two >merged &&
 139        cp one merge-me &&
 140        >empty &&
 141        test_must_fail git merge-file \
 142                -L "Temporary merge branch 2" \
 143                -L "" \
 144                -L "Temporary merge branch 1" \
 145                merged empty merge-me &&
 146        test $(git rev-parse :1:three) = $(git hash-object merged)
 147'
 148
 149test_done