t / t6022-merge-rename.shon commit git-fetch can use both --thin and --keep with fetch-pack now (920ccbf)
   1#!/bin/sh
   2
   3test_description='Merge-recursive merging renames'
   4. ./test-lib.sh
   5
   6test_expect_success setup \
   7'
   8cat >A <<\EOF &&
   9a aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  10b bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
  11c cccccccccccccccccccccccccccccccccccccccccccccccc
  12d dddddddddddddddddddddddddddddddddddddddddddddddd
  13e eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
  14f ffffffffffffffffffffffffffffffffffffffffffffffff
  15g gggggggggggggggggggggggggggggggggggggggggggggggg
  16h hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh
  17i iiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii
  18j jjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjj
  19k kkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkk
  20l llllllllllllllllllllllllllllllllllllllllllllllll
  21m mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm
  22n nnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnn
  23o oooooooooooooooooooooooooooooooooooooooooooooooo
  24EOF
  25
  26cat >M <<\EOF &&
  27A AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  28B BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB
  29C CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC
  30D DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
  31E EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE
  32F FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
  33G GGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGG
  34H HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
  35I IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII
  36J JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ
  37K KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK
  38L LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL
  39M MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM
  40N NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN
  41O OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
  42EOF
  43
  44git add A M &&
  45git commit -m initial &&
  46git branch white &&
  47git branch red &&
  48git branch blue &&
  49
  50sed -e "/^g /s/.*/g : master changes a line/" <A >A+ &&
  51mv A+ A &&
  52git commit -a -m "master updates A" &&
  53
  54git checkout white &&
  55sed -e "/^g /s/.*/g : white changes a line/" <A >B &&
  56sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
  57rm -f A M &&
  58git update-index --add --remove A B M N &&
  59git commit -m "white renames A->B, M->N" &&
  60
  61git checkout red &&
  62sed -e "/^g /s/.*/g : red changes a line/" <A >B &&
  63sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
  64rm -f A M &&
  65git update-index --add --remove A B M N &&
  66git commit -m "red renames A->B, M->N" &&
  67
  68git checkout blue &&
  69sed -e "/^g /s/.*/g : blue changes a line/" <A >C &&
  70sed -e "/^G /s/.*/G : colored branch changes a line/" <M >N &&
  71rm -f A M &&
  72git update-index --add --remove A C M N &&
  73git commit -m "blue renames A->C, M->N" &&
  74
  75git checkout master'
  76
  77test_expect_success 'pull renaming branch into unrenaming one' \
  78'
  79        git show-branch
  80        git pull . white && {
  81                echo "BAD: should have conflicted"
  82                exit 1
  83        }
  84        git ls-files -s
  85        test "$(git ls-files -u B | wc -l)" -eq 3 || {
  86                echo "BAD: should have left stages for B"
  87                exit 1  
  88        }
  89        test "$(git ls-files -s N | wc -l)" -eq 1 || {
  90                echo "BAD: should have merged N"
  91                exit 1  
  92        }
  93        sed -ne "/^g/{
  94        p
  95        q
  96        }" B | grep master || {
  97                echo "BAD: should have listed our change first"
  98                exit 1
  99        }
 100        test "$(git diff white N | wc -l)" -eq 0 || {
 101                echo "BAD: should have taken colored branch"
 102                exit 1
 103        }
 104'
 105
 106test_expect_success 'pull renaming branch into another renaming one' \
 107'
 108        rm -f B
 109        git reset --hard
 110        git checkout red
 111        git pull . white && {
 112                echo "BAD: should have conflicted"
 113                exit 1
 114        }
 115        test "$(git ls-files -u B | wc -l)" -eq 3 || {
 116                echo "BAD: should have left stages"
 117                exit 1  
 118        }
 119        test "$(git ls-files -s N | wc -l)" -eq 1 || {
 120                echo "BAD: should have merged N"
 121                exit 1  
 122        }
 123        sed -ne "/^g/{
 124        p
 125        q
 126        }" B | grep red || {
 127                echo "BAD: should have listed our change first"
 128                exit 1
 129        }
 130        test "$(git diff white N | wc -l)" -eq 0 || {
 131                echo "BAD: should have taken colored branch"
 132                exit 1
 133        }
 134'
 135
 136test_expect_success 'pull unrenaming branch into renaming one' \
 137'
 138        git reset --hard
 139        git show-branch
 140        git pull . master && {
 141                echo "BAD: should have conflicted"
 142                exit 1
 143        }
 144        test "$(git ls-files -u B | wc -l)" -eq 3 || {
 145                echo "BAD: should have left stages"
 146                exit 1  
 147        }
 148        test "$(git ls-files -s N | wc -l)" -eq 1 || {
 149                echo "BAD: should have merged N"
 150                exit 1  
 151        }
 152        sed -ne "/^g/{
 153        p
 154        q
 155        }" B | grep red || {
 156                echo "BAD: should have listed our change first"
 157                exit 1
 158        }
 159        test "$(git diff white N | wc -l)" -eq 0 || {
 160                echo "BAD: should have taken colored branch"
 161                exit 1
 162        }
 163'
 164
 165test_expect_success 'pull conflicting renames' \
 166'
 167        git reset --hard
 168        git show-branch
 169        git pull . blue && {
 170                echo "BAD: should have conflicted"
 171                exit 1
 172        }
 173        test "$(git ls-files -u A | wc -l)" -eq 1 || {
 174                echo "BAD: should have left a stage"
 175                exit 1  
 176        }
 177        test "$(git ls-files -u B | wc -l)" -eq 1 || {
 178                echo "BAD: should have left a stage"
 179                exit 1  
 180        }
 181        test "$(git ls-files -u C | wc -l)" -eq 1 || {
 182                echo "BAD: should have left a stage"
 183                exit 1  
 184        }
 185        test "$(git ls-files -s N | wc -l)" -eq 1 || {
 186                echo "BAD: should have merged N"
 187                exit 1  
 188        }
 189        sed -ne "/^g/{
 190        p
 191        q
 192        }" B | grep red || {
 193                echo "BAD: should have listed our change first"
 194                exit 1
 195        }
 196        test "$(git diff white N | wc -l)" -eq 0 || {
 197                echo "BAD: should have taken colored branch"
 198                exit 1
 199        }
 200'
 201
 202test_done