t / t1002-read-tree-m-u-2way.shon commit Merge branch 'js/merge-recursive' (ea81e10)
   1#!/bin/sh
   2#
   3# Copyright (c) 2005 Junio C Hamano
   4#
   5
   6test_description='Two way merge with read-tree -m -u $H $M
   7
   8This is identical to t1001, but uses -u to update the work tree as well.
   9
  10'
  11. ./test-lib.sh
  12
  13_x40='[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]'
  14_x40="$_x40$_x40$_x40$_x40$_x40$_x40$_x40$_x40"
  15compare_change () {
  16        sed >current \
  17            -e '/^--- /d; /^+++ /d; /^@@ /d;' \
  18            -e 's/^\(.[0-7][0-7][0-7][0-7][0-7][0-7]\) '"$_x40"' /\1 X /' "$1"
  19        test_cmp expected current
  20}
  21
  22check_cache_at () {
  23        clean_if_empty=`git diff-files -- "$1"`
  24        case "$clean_if_empty" in
  25        '')  echo "$1: clean" ;;
  26        ?*)  echo "$1: dirty" ;;
  27        esac
  28        case "$2,$clean_if_empty" in
  29        clean,)         :     ;;
  30        clean,?*)       false ;;
  31        dirty,)         false ;;
  32        dirty,?*)       :     ;;
  33        esac
  34}
  35
  36test_expect_success \
  37    setup \
  38    'echo frotz >frotz &&
  39     echo nitfol >nitfol &&
  40     echo bozbar >bozbar &&
  41     echo rezrov >rezrov &&
  42     git update-index --add nitfol bozbar rezrov &&
  43     treeH=`git write-tree` &&
  44     echo treeH $treeH &&
  45     git ls-tree $treeH &&
  46
  47     echo gnusto >bozbar &&
  48     git update-index --add frotz bozbar --force-remove rezrov &&
  49     git ls-files --stage >M.out &&
  50     treeM=`git write-tree` &&
  51     echo treeM $treeM &&
  52     git ls-tree $treeM &&
  53     sum bozbar frotz nitfol >M.sum &&
  54     git diff-tree $treeH $treeM'
  55
  56test_expect_success \
  57    '1, 2, 3 - no carry forward' \
  58    'rm -f .git/index nitfol bozbar rezrov frotz &&
  59     git read-tree --reset -u $treeH &&
  60     git read-tree -m -u $treeH $treeM &&
  61     git ls-files --stage >1-3.out &&
  62     cmp M.out 1-3.out &&
  63     sum bozbar frotz nitfol >actual3.sum &&
  64     cmp M.sum actual3.sum &&
  65     check_cache_at bozbar clean &&
  66     check_cache_at frotz clean &&
  67     check_cache_at nitfol clean'
  68
  69test_expect_success \
  70    '4 - carry forward local addition.' \
  71    'rm -f .git/index nitfol bozbar rezrov frotz &&
  72     git read-tree --reset -u $treeH &&
  73     echo "+100644 X 0  yomin" >expected &&
  74     echo yomin >yomin &&
  75     git update-index --add yomin &&
  76     git read-tree -m -u $treeH $treeM &&
  77     git ls-files --stage >4.out || return 1
  78     diff -U0 M.out 4.out >4diff.out
  79     compare_change 4diff.out expected &&
  80     check_cache_at yomin clean &&
  81     sum bozbar frotz nitfol >actual4.sum &&
  82     cmp M.sum actual4.sum &&
  83     echo yomin >yomin1 &&
  84     diff yomin yomin1 &&
  85     rm -f yomin1'
  86
  87test_expect_success \
  88    '5 - carry forward local addition.' \
  89    'rm -f .git/index nitfol bozbar rezrov frotz &&
  90     git read-tree --reset -u $treeH &&
  91     git read-tree -m -u $treeH &&
  92     echo yomin >yomin &&
  93     git update-index --add yomin &&
  94     echo yomin yomin >yomin &&
  95     git read-tree -m -u $treeH $treeM &&
  96     git ls-files --stage >5.out || return 1
  97     diff -U0 M.out 5.out >5diff.out
  98     compare_change 5diff.out expected &&
  99     check_cache_at yomin dirty &&
 100     sum bozbar frotz nitfol >actual5.sum &&
 101     cmp M.sum actual5.sum &&
 102     : dirty index should have prevented -u from checking it out. &&
 103     echo yomin yomin >yomin1 &&
 104     diff yomin yomin1 &&
 105     rm -f yomin1'
 106
 107test_expect_success \
 108    '6 - local addition already has the same.' \
 109    'rm -f .git/index nitfol bozbar rezrov frotz &&
 110     git read-tree --reset -u $treeH &&
 111     echo frotz >frotz &&
 112     git update-index --add frotz &&
 113     git read-tree -m -u $treeH $treeM &&
 114     git ls-files --stage >6.out &&
 115     diff -U0 M.out 6.out &&
 116     check_cache_at frotz clean &&
 117     sum bozbar frotz nitfol >actual3.sum &&
 118     cmp M.sum actual3.sum &&
 119     echo frotz >frotz1 &&
 120     diff frotz frotz1 &&
 121     rm -f frotz1'
 122
 123test_expect_success \
 124    '7 - local addition already has the same.' \
 125    'rm -f .git/index nitfol bozbar rezrov frotz &&
 126     git read-tree --reset -u $treeH &&
 127     echo frotz >frotz &&
 128     git update-index --add frotz &&
 129     echo frotz frotz >frotz &&
 130     git read-tree -m -u $treeH $treeM &&
 131     git ls-files --stage >7.out &&
 132     diff -U0 M.out 7.out &&
 133     check_cache_at frotz dirty &&
 134     sum bozbar frotz nitfol >actual7.sum &&
 135     if cmp M.sum actual7.sum; then false; else :; fi &&
 136     : dirty index should have prevented -u from checking it out. &&
 137     echo frotz frotz >frotz1 &&
 138     diff frotz frotz1 &&
 139     rm -f frotz1'
 140
 141test_expect_success \
 142    '8 - conflicting addition.' \
 143    'rm -f .git/index nitfol bozbar rezrov frotz &&
 144     git read-tree --reset -u $treeH &&
 145     echo frotz frotz >frotz &&
 146     git update-index --add frotz &&
 147     if git read-tree -m -u $treeH $treeM; then false; else :; fi'
 148
 149test_expect_success \
 150    '9 - conflicting addition.' \
 151    'rm -f .git/index nitfol bozbar rezrov frotz &&
 152     git read-tree --reset -u $treeH &&
 153     echo frotz frotz >frotz &&
 154     git update-index --add frotz &&
 155     echo frotz >frotz &&
 156     if git read-tree -m -u $treeH $treeM; then false; else :; fi'
 157
 158test_expect_success \
 159    '10 - path removed.' \
 160    'rm -f .git/index nitfol bozbar rezrov frotz &&
 161     git read-tree --reset -u $treeH &&
 162     echo rezrov >rezrov &&
 163     git update-index --add rezrov &&
 164     git read-tree -m -u $treeH $treeM &&
 165     git ls-files --stage >10.out &&
 166     cmp M.out 10.out &&
 167     sum bozbar frotz nitfol >actual10.sum &&
 168     cmp M.sum actual10.sum'
 169
 170test_expect_success \
 171    '11 - dirty path removed.' \
 172    'rm -f .git/index nitfol bozbar rezrov frotz &&
 173     git read-tree --reset -u $treeH &&
 174     echo rezrov >rezrov &&
 175     git update-index --add rezrov &&
 176     echo rezrov rezrov >rezrov &&
 177     if git read-tree -m -u $treeH $treeM; then false; else :; fi'
 178
 179test_expect_success \
 180    '12 - unmatching local changes being removed.' \
 181    'rm -f .git/index nitfol bozbar rezrov frotz &&
 182     git read-tree --reset -u $treeH &&
 183     echo rezrov rezrov >rezrov &&
 184     git update-index --add rezrov &&
 185     if git read-tree -m -u $treeH $treeM; then false; else :; fi'
 186
 187test_expect_success \
 188    '13 - unmatching local changes being removed.' \
 189    'rm -f .git/index nitfol bozbar rezrov frotz &&
 190     git read-tree --reset -u $treeH &&
 191     echo rezrov rezrov >rezrov &&
 192     git update-index --add rezrov &&
 193     echo rezrov >rezrov &&
 194     if git read-tree -m -u $treeH $treeM; then false; else :; fi'
 195
 196cat >expected <<EOF
 197-100644 X 0     nitfol
 198+100644 X 0     nitfol
 199EOF
 200
 201test_expect_success \
 202    '14 - unchanged in two heads.' \
 203    'rm -f .git/index nitfol bozbar rezrov frotz &&
 204     git read-tree --reset -u $treeH &&
 205     echo nitfol nitfol >nitfol &&
 206     git update-index --add nitfol &&
 207     git read-tree -m -u $treeH $treeM &&
 208     git ls-files --stage >14.out || return 1
 209     diff -U0 M.out 14.out >14diff.out
 210     compare_change 14diff.out expected &&
 211     sum bozbar frotz >actual14.sum &&
 212     grep -v nitfol M.sum > expected14.sum &&
 213     cmp expected14.sum actual14.sum &&
 214     sum bozbar frotz nitfol >actual14a.sum &&
 215     if cmp M.sum actual14a.sum; then false; else :; fi &&
 216     check_cache_at nitfol clean &&
 217     echo nitfol nitfol >nitfol1 &&
 218     diff nitfol nitfol1 &&
 219     rm -f nitfol1'
 220
 221test_expect_success \
 222    '15 - unchanged in two heads.' \
 223    'rm -f .git/index nitfol bozbar rezrov frotz &&
 224     git read-tree --reset -u $treeH &&
 225     echo nitfol nitfol >nitfol &&
 226     git update-index --add nitfol &&
 227     echo nitfol nitfol nitfol >nitfol &&
 228     git read-tree -m -u $treeH $treeM &&
 229     git ls-files --stage >15.out || return 1
 230     diff -U0 M.out 15.out >15diff.out
 231     compare_change 15diff.out expected &&
 232     check_cache_at nitfol dirty &&
 233     sum bozbar frotz >actual15.sum &&
 234     grep -v nitfol M.sum > expected15.sum &&
 235     cmp expected15.sum actual15.sum &&
 236     sum bozbar frotz nitfol >actual15a.sum &&
 237     if cmp M.sum actual15a.sum; then false; else :; fi &&
 238     echo nitfol nitfol nitfol >nitfol1 &&
 239     diff nitfol nitfol1 &&
 240     rm -f nitfol1'
 241
 242test_expect_success \
 243    '16 - conflicting local change.' \
 244    'rm -f .git/index nitfol bozbar rezrov frotz &&
 245     git read-tree --reset -u $treeH &&
 246     echo bozbar bozbar >bozbar &&
 247     git update-index --add bozbar &&
 248     if git read-tree -m -u $treeH $treeM; then false; else :; fi'
 249
 250test_expect_success \
 251    '17 - conflicting local change.' \
 252    'rm -f .git/index nitfol bozbar rezrov frotz &&
 253     git read-tree --reset -u $treeH &&
 254     echo bozbar bozbar >bozbar &&
 255     git update-index --add bozbar &&
 256     echo bozbar bozbar bozbar >bozbar &&
 257     if git read-tree -m -u $treeH $treeM; then false; else :; fi'
 258
 259test_expect_success \
 260    '18 - local change already having a good result.' \
 261    'rm -f .git/index nitfol bozbar rezrov frotz &&
 262     git read-tree --reset -u $treeH &&
 263     echo gnusto >bozbar &&
 264     git update-index --add bozbar &&
 265     git read-tree -m -u $treeH $treeM &&
 266     git ls-files --stage >18.out &&
 267     diff -U0 M.out 18.out &&
 268     check_cache_at bozbar clean &&
 269     sum bozbar frotz nitfol >actual18.sum &&
 270     cmp M.sum actual18.sum'
 271
 272test_expect_success \
 273    '19 - local change already having a good result, further modified.' \
 274    'rm -f .git/index nitfol bozbar rezrov frotz &&
 275     git read-tree --reset -u $treeH &&
 276     echo gnusto >bozbar &&
 277     git update-index --add bozbar &&
 278     echo gnusto gnusto >bozbar &&
 279     git read-tree -m -u $treeH $treeM &&
 280     git ls-files --stage >19.out &&
 281     diff -U0 M.out 19.out &&
 282     check_cache_at bozbar dirty &&
 283     sum frotz nitfol >actual19.sum &&
 284     grep -v bozbar  M.sum > expected19.sum &&
 285     cmp expected19.sum actual19.sum &&
 286     sum bozbar frotz nitfol >actual19a.sum &&
 287     if cmp M.sum actual19a.sum; then false; else :; fi &&
 288     echo gnusto gnusto >bozbar1 &&
 289     diff bozbar bozbar1 &&
 290     rm -f bozbar1'
 291
 292test_expect_success \
 293    '20 - no local change, use new tree.' \
 294    'rm -f .git/index nitfol bozbar rezrov frotz &&
 295     git read-tree --reset -u $treeH &&
 296     echo bozbar >bozbar &&
 297     git update-index --add bozbar &&
 298     git read-tree -m -u $treeH $treeM &&
 299     git ls-files --stage >20.out &&
 300     diff -U0 M.out 20.out &&
 301     check_cache_at bozbar clean &&
 302     sum bozbar frotz nitfol >actual20.sum &&
 303     cmp M.sum actual20.sum'
 304
 305test_expect_success \
 306    '21 - no local change, dirty cache.' \
 307    'rm -f .git/index nitfol bozbar rezrov frotz &&
 308     git read-tree --reset -u $treeH &&
 309     echo bozbar >bozbar &&
 310     git update-index --add bozbar &&
 311     echo gnusto gnusto >bozbar &&
 312     if git read-tree -m -u $treeH $treeM; then false; else :; fi'
 313
 314# Also make sure we did not break DF vs DF/DF case.
 315test_expect_success \
 316    'DF vs DF/DF case setup.' \
 317    'rm -f .git/index
 318     echo DF >DF &&
 319     git update-index --add DF &&
 320     treeDF=`git write-tree` &&
 321     echo treeDF $treeDF &&
 322     git ls-tree $treeDF &&
 323
 324     rm -f DF &&
 325     mkdir DF &&
 326     echo DF/DF >DF/DF &&
 327     git update-index --add --remove DF DF/DF &&
 328     treeDFDF=`git write-tree` &&
 329     echo treeDFDF $treeDFDF &&
 330     git ls-tree $treeDFDF &&
 331     git ls-files --stage >DFDF.out'
 332
 333test_expect_success \
 334    'DF vs DF/DF case test.' \
 335    'rm -f .git/index &&
 336     rm -fr DF &&
 337     echo DF >DF &&
 338     git update-index --add DF &&
 339     git read-tree -m -u $treeDF $treeDFDF &&
 340     git ls-files --stage >DFDFcheck.out &&
 341     diff -U0 DFDF.out DFDFcheck.out &&
 342     check_cache_at DF/DF clean'
 343
 344test_done