3 test_description='merge-recursive backend test'
 
   7 test_expect_success 'setup 1' '
 
  10         o0=$(git hash-object a) &&
 
  18         git commit -m initial &&
 
  19         c0=$(git rev-parse --verify HEAD) &&
 
  28         if test_have_prereq SYMLINKS
 
  35         o1=$(git hash-object a) &&
 
  40         git commit -m "master modifies a and d/e" &&
 
  41         c1=$(git rev-parse --verify HEAD) &&
 
  42         ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 
  44                 echo "100644 blob $o1   a"
 
  45                 echo "100644 blob $o0   b"
 
  46                 echo "100644 blob $o0   c"
 
  47                 echo "100644 blob $o1   d/e"
 
  51                 echo "100644 $o1 0      d/e"
 
  53         test_cmp expected actual
 
  56 test_expect_success 'setup 2' '
 
  60         ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 
  62                 echo "100644 blob $o0   a"
 
  63                 echo "100644 blob $o0   b"
 
  64                 echo "100644 blob $o0   c"
 
  65                 echo "100644 blob $o0   d/e"
 
  69                 echo "100644 $o0 0      d/e"
 
  71         test_cmp expected actual &&
 
  74         o2=$(git hash-object a) &&
 
  79         git commit -m "side modifies a" &&
 
  80         c2=$(git rev-parse --verify HEAD) &&
 
  81         ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 
  83                 echo "100644 blob $o2   a"
 
  84                 echo "100644 blob $o0   b"
 
  85                 echo "100644 blob $o0   c"
 
  86                 echo "100644 blob $o0   d/e"
 
  90                 echo "100644 $o0 0      d/e"
 
  92         test_cmp expected actual
 
  95 test_expect_success 'setup 3' '
 
  99         ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 
 101                 echo "100644 blob $o0   a"
 
 102                 echo "100644 blob $o0   b"
 
 103                 echo "100644 blob $o0   c"
 
 104                 echo "100644 blob $o0   d/e"
 
 105                 echo "100644 $o0 0      a"
 
 106                 echo "100644 $o0 0      b"
 
 107                 echo "100644 $o0 0      c"
 
 108                 echo "100644 $o0 0      d/e"
 
 110         test_cmp expected actual &&
 
 112         rm -f b && mkdir b && echo df-1 >b/c && git add b/c &&
 
 113         o3=$(git hash-object b/c) &&
 
 116         git commit -m "df-1 makes b/c" &&
 
 117         c3=$(git rev-parse --verify HEAD) &&
 
 118         ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 
 120                 echo "100644 blob $o0   a"
 
 121                 echo "100644 blob $o3   b/c"
 
 122                 echo "100644 blob $o0   c"
 
 123                 echo "100644 blob $o0   d/e"
 
 124                 echo "100644 $o0 0      a"
 
 125                 echo "100644 $o3 0      b/c"
 
 126                 echo "100644 $o0 0      c"
 
 127                 echo "100644 $o0 0      d/e"
 
 129         test_cmp expected actual
 
 132 test_expect_success 'setup 4' '
 
 136         ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 
 138                 echo "100644 blob $o0   a"
 
 139                 echo "100644 blob $o0   b"
 
 140                 echo "100644 blob $o0   c"
 
 141                 echo "100644 blob $o0   d/e"
 
 142                 echo "100644 $o0 0      a"
 
 143                 echo "100644 $o0 0      b"
 
 144                 echo "100644 $o0 0      c"
 
 145                 echo "100644 $o0 0      d/e"
 
 147         test_cmp expected actual &&
 
 149         rm -f a && mkdir a && echo df-2 >a/c && git add a/c &&
 
 150         o4=$(git hash-object a/c) &&
 
 153         git commit -m "df-2 makes a/c" &&
 
 154         c4=$(git rev-parse --verify HEAD) &&
 
 155         ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 
 157                 echo "100644 blob $o4   a/c"
 
 158                 echo "100644 blob $o0   b"
 
 159                 echo "100644 blob $o0   c"
 
 160                 echo "100644 blob $o0   d/e"
 
 161                 echo "100644 $o4 0      a/c"
 
 162                 echo "100644 $o0 0      b"
 
 163                 echo "100644 $o0 0      c"
 
 164                 echo "100644 $o0 0      d/e"
 
 166         test_cmp expected actual
 
 169 test_expect_success 'setup 5' '
 
 172         git checkout remove &&
 
 173         ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 
 175                 echo "100644 blob $o0   a"
 
 176                 echo "100644 blob $o0   b"
 
 177                 echo "100644 blob $o0   c"
 
 178                 echo "100644 blob $o0   d/e"
 
 179                 echo "100644 $o0 0      a"
 
 180                 echo "100644 $o0 0      b"
 
 181                 echo "100644 $o0 0      c"
 
 182                 echo "100644 $o0 0      d/e"
 
 184         test_cmp expected actual &&
 
 187         echo remove-conflict >a &&
 
 191         o5=$(git hash-object a) &&
 
 194         git commit -m "remove removes b and modifies a" &&
 
 195         c5=$(git rev-parse --verify HEAD) &&
 
 196         ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 
 198                 echo "100644 blob $o5   a"
 
 199                 echo "100644 blob $o0   c"
 
 200                 echo "100644 blob $o0   d/e"
 
 201                 echo "100644 $o5 0      a"
 
 202                 echo "100644 $o0 0      c"
 
 203                 echo "100644 $o0 0      d/e"
 
 205         test_cmp expected actual
 
 209 test_expect_success 'setup 6' '
 
 213         ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 
 215                 echo "100644 blob $o0   a"
 
 216                 echo "100644 blob $o0   b"
 
 217                 echo "100644 blob $o0   c"
 
 218                 echo "100644 blob $o0   d/e"
 
 219                 echo "100644 $o0 0      a"
 
 220                 echo "100644 $o0 0      b"
 
 221                 echo "100644 $o0 0      c"
 
 222                 echo "100644 $o0 0      d/e"
 
 224         test_cmp expected actual &&
 
 226         rm -fr d && echo df-3 >d && git add d &&
 
 227         o6=$(git hash-object d) &&
 
 230         git commit -m "df-3 makes d" &&
 
 231         c6=$(git rev-parse --verify HEAD) &&
 
 232         ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 
 234                 echo "100644 blob $o0   a"
 
 235                 echo "100644 blob $o0   b"
 
 236                 echo "100644 blob $o0   c"
 
 237                 echo "100644 blob $o6   d"
 
 238                 echo "100644 $o0 0      a"
 
 239                 echo "100644 $o0 0      b"
 
 240                 echo "100644 $o0 0      c"
 
 241                 echo "100644 $o6 0      d"
 
 243         test_cmp expected actual
 
 246 test_expect_success 'setup 7' '
 
 248         git checkout submod &&
 
 251         git commit -m "remove d/e" &&
 
 252         git update-index --add --cacheinfo 160000 $c1 d &&
 
 254         git commit -m "make d/ a submodule"
 
 257 test_expect_success 'setup 8' '
 
 258         git checkout rename &&
 
 262         git commit -m "rename a->e" &&
 
 263         if test_have_prereq SYMLINKS
 
 265                 git checkout rename-ln &&
 
 270                 git commit -m "rename a->e, symlink a->e"
 
 274 test_expect_success 'setup 9' '
 
 279         git commit -m "copy a->e"
 
 282 test_expect_success 'merge-recursive simple' '
 
 285         git checkout -f "$c2" &&
 
 287         git merge-recursive "$c0" -- "$c2" "$c1"
 
 294                 echo >&2 "why status $status!!!"
 
 300 test_expect_success 'merge-recursive result' '
 
 302         git ls-files -s >actual &&
 
 304                 echo "100644 $o0 1      a"
 
 305                 echo "100644 $o2 2      a"
 
 306                 echo "100644 $o1 3      a"
 
 307                 echo "100644 $o0 0      b"
 
 308                 echo "100644 $o0 0      c"
 
 309                 echo "100644 $o1 0      d/e"
 
 311         test_cmp expected actual
 
 315 test_expect_success 'fail if the index has unresolved entries' '
 
 318         git checkout -f "$c1" &&
 
 320         test_must_fail git merge "$c5" &&
 
 321         test_must_fail git merge "$c5" 2> out &&
 
 322         test_i18ngrep "not possible because you have unmerged files" out &&
 
 324         test_must_fail git merge "$c5" 2> out &&
 
 325         test_i18ngrep "You have not concluded your merge" out &&
 
 326         rm -f .git/MERGE_HEAD &&
 
 327         test_must_fail git merge "$c5" 2> out &&
 
 328         test_i18ngrep "Your local changes to the following files would be overwritten by merge:" out
 
 331 test_expect_success 'merge-recursive remove conflict' '
 
 334         git checkout -f "$c1" &&
 
 336         git merge-recursive "$c0" -- "$c1" "$c5"
 
 343                 echo >&2 "why status $status!!!"
 
 349 test_expect_success 'merge-recursive remove conflict' '
 
 351         git ls-files -s >actual &&
 
 353                 echo "100644 $o0 1      a"
 
 354                 echo "100644 $o1 2      a"
 
 355                 echo "100644 $o5 3      a"
 
 356                 echo "100644 $o0 0      c"
 
 357                 echo "100644 $o1 0      d/e"
 
 359         test_cmp expected actual
 
 363 test_expect_success 'merge-recursive d/f simple' '
 
 366         git checkout -f "$c1" &&
 
 368         git merge-recursive "$c0" -- "$c1" "$c3"
 
 371 test_expect_success 'merge-recursive result' '
 
 373         git ls-files -s >actual &&
 
 375                 echo "100644 $o1 0      a"
 
 376                 echo "100644 $o3 0      b/c"
 
 377                 echo "100644 $o0 0      c"
 
 378                 echo "100644 $o1 0      d/e"
 
 380         test_cmp expected actual
 
 384 test_expect_success 'merge-recursive d/f conflict' '
 
 388         git checkout -f "$c1" &&
 
 390         git merge-recursive "$c0" -- "$c1" "$c4"
 
 397                 echo >&2 "why status $status!!!"
 
 403 test_expect_success 'merge-recursive d/f conflict result' '
 
 405         git ls-files -s >actual &&
 
 407                 echo "100644 $o0 1      a"
 
 408                 echo "100644 $o1 2      a"
 
 409                 echo "100644 $o4 0      a/c"
 
 410                 echo "100644 $o0 0      b"
 
 411                 echo "100644 $o0 0      c"
 
 412                 echo "100644 $o1 0      d/e"
 
 414         test_cmp expected actual
 
 418 test_expect_success 'merge-recursive d/f conflict the other way' '
 
 422         git checkout -f "$c4" &&
 
 424         git merge-recursive "$c0" -- "$c4" "$c1"
 
 431                 echo >&2 "why status $status!!!"
 
 437 test_expect_success 'merge-recursive d/f conflict result the other way' '
 
 439         git ls-files -s >actual &&
 
 441                 echo "100644 $o0 1      a"
 
 442                 echo "100644 $o1 3      a"
 
 443                 echo "100644 $o4 0      a/c"
 
 444                 echo "100644 $o0 0      b"
 
 445                 echo "100644 $o0 0      c"
 
 446                 echo "100644 $o1 0      d/e"
 
 448         test_cmp expected actual
 
 452 test_expect_success 'merge-recursive d/f conflict' '
 
 456         git checkout -f "$c1" &&
 
 458         git merge-recursive "$c0" -- "$c1" "$c6"
 
 465                 echo >&2 "why status $status!!!"
 
 471 test_expect_success 'merge-recursive d/f conflict result' '
 
 473         git ls-files -s >actual &&
 
 475                 echo "100644 $o1 0      a"
 
 476                 echo "100644 $o0 0      b"
 
 477                 echo "100644 $o0 0      c"
 
 478                 echo "100644 $o6 3      d"
 
 479                 echo "100644 $o0 1      d/e"
 
 480                 echo "100644 $o1 2      d/e"
 
 482         test_cmp expected actual
 
 486 test_expect_success 'merge-recursive d/f conflict' '
 
 490         git checkout -f "$c6" &&
 
 492         git merge-recursive "$c0" -- "$c6" "$c1"
 
 499                 echo >&2 "why status $status!!!"
 
 505 test_expect_success 'merge-recursive d/f conflict result' '
 
 507         git ls-files -s >actual &&
 
 509                 echo "100644 $o1 0      a"
 
 510                 echo "100644 $o0 0      b"
 
 511                 echo "100644 $o0 0      c"
 
 512                 echo "100644 $o6 2      d"
 
 513                 echo "100644 $o0 1      d/e"
 
 514                 echo "100644 $o1 3      d/e"
 
 516         test_cmp expected actual
 
 520 test_expect_success 'reset and 3-way merge' '
 
 522         git reset --hard "$c2" &&
 
 523         git read-tree -m "$c0" "$c2" "$c1"
 
 527 test_expect_success 'reset and bind merge' '
 
 529         git reset --hard master &&
 
 530         git read-tree --prefix=M/ master &&
 
 531         git ls-files -s >actual &&
 
 533                 echo "100644 $o1 0      M/a"
 
 534                 echo "100644 $o0 0      M/b"
 
 535                 echo "100644 $o0 0      M/c"
 
 536                 echo "100644 $o1 0      M/d/e"
 
 537                 echo "100644 $o1 0      a"
 
 538                 echo "100644 $o0 0      b"
 
 539                 echo "100644 $o0 0      c"
 
 540                 echo "100644 $o1 0      d/e"
 
 542         test_cmp expected actual &&
 
 544         git read-tree --prefix=a1/ master &&
 
 545         git ls-files -s >actual &&
 
 547                 echo "100644 $o1 0      M/a"
 
 548                 echo "100644 $o0 0      M/b"
 
 549                 echo "100644 $o0 0      M/c"
 
 550                 echo "100644 $o1 0      M/d/e"
 
 551                 echo "100644 $o1 0      a"
 
 552                 echo "100644 $o1 0      a1/a"
 
 553                 echo "100644 $o0 0      a1/b"
 
 554                 echo "100644 $o0 0      a1/c"
 
 555                 echo "100644 $o1 0      a1/d/e"
 
 556                 echo "100644 $o0 0      b"
 
 557                 echo "100644 $o0 0      c"
 
 558                 echo "100644 $o1 0      d/e"
 
 560         test_cmp expected actual &&
 
 562         git read-tree --prefix=z/ master &&
 
 563         git ls-files -s >actual &&
 
 565                 echo "100644 $o1 0      M/a"
 
 566                 echo "100644 $o0 0      M/b"
 
 567                 echo "100644 $o0 0      M/c"
 
 568                 echo "100644 $o1 0      M/d/e"
 
 569                 echo "100644 $o1 0      a"
 
 570                 echo "100644 $o1 0      a1/a"
 
 571                 echo "100644 $o0 0      a1/b"
 
 572                 echo "100644 $o0 0      a1/c"
 
 573                 echo "100644 $o1 0      a1/d/e"
 
 574                 echo "100644 $o0 0      b"
 
 575                 echo "100644 $o0 0      c"
 
 576                 echo "100644 $o1 0      d/e"
 
 577                 echo "100644 $o1 0      z/a"
 
 578                 echo "100644 $o0 0      z/b"
 
 579                 echo "100644 $o0 0      z/c"
 
 580                 echo "100644 $o1 0      z/d/e"
 
 582         test_cmp expected actual
 
 586 test_expect_success 'merge removes empty directories' '
 
 588         git reset --hard master &&
 
 589         git checkout -b rm &&
 
 591         git commit -mremoved-d/e &&
 
 592         git checkout master &&
 
 593         git merge -s recursive rm &&
 
 594         test_must_fail test -d d
 
 597 test_expect_failure 'merge-recursive simple w/submodule' '
 
 599         git checkout submod &&
 
 603 test_expect_failure 'merge-recursive simple w/submodule result' '
 
 605         git ls-files -s >actual &&
 
 607                 echo "100644 $o5 0      a"
 
 608                 echo "100644 $o0 0      c"
 
 609                 echo "160000 $c1 0      d"
 
 611         test_cmp expected actual
 
 614 test_expect_success 'merge-recursive copy vs. rename' '
 
 615         git checkout -f copy &&
 
 617         ( git ls-tree -r HEAD && git ls-files -s ) >actual &&
 
 619                 echo "100644 blob $o0   b"
 
 620                 echo "100644 blob $o0   c"
 
 621                 echo "100644 blob $o0   d/e"
 
 622                 echo "100644 blob $o0   e"
 
 623                 echo "100644 $o0 0      b"
 
 624                 echo "100644 $o0 0      c"
 
 625                 echo "100644 $o0 0      d/e"
 
 626                 echo "100644 $o0 0      e"
 
 628         test_cmp expected actual
 
 631 if test_have_prereq SYMLINKS
 
 633         test_expect_success 'merge-recursive rename vs. rename/symlink' '
 
 635                 git checkout -f rename &&
 
 636                 git merge rename-ln &&
 
 637                 ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 
 639                         echo "100644 blob $o0   b"
 
 640                         echo "100644 blob $o0   c"
 
 641                         echo "100644 blob $o0   d/e"
 
 642                         echo "100644 blob $o0   e"
 
 643                         echo "100644 $o0 0      b"
 
 644                         echo "100644 $o0 0      c"
 
 645                         echo "100644 $o0 0      d/e"
 
 646                         echo "100644 $o0 0      e"
 
 648                 test_cmp expected actual