t / t3030-merge-recursive.shon commit use struct sha1_array in diff_tree_combined() (0041f09)
   1#!/bin/sh
   2
   3test_description='merge-recursive backend test'
   4
   5. ./test-lib.sh
   6
   7test_expect_success 'setup 1' '
   8
   9        echo hello >a &&
  10        o0=$(git hash-object a) &&
  11        cp a b &&
  12        cp a c &&
  13        mkdir d &&
  14        cp a d/e &&
  15
  16        test_tick &&
  17        git add a b c d/e &&
  18        git commit -m initial &&
  19        c0=$(git rev-parse --verify HEAD) &&
  20        git branch side &&
  21        git branch df-1 &&
  22        git branch df-2 &&
  23        git branch df-3 &&
  24        git branch remove &&
  25        git branch submod &&
  26        git branch copy &&
  27        git branch rename &&
  28        if test_have_prereq SYMLINKS
  29        then
  30                git branch rename-ln
  31        fi &&
  32
  33        echo hello >>a &&
  34        cp a d/e &&
  35        o1=$(git hash-object a) &&
  36
  37        git add a d/e &&
  38
  39        test_tick &&
  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 &&
  43        (
  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"
  48                echo "100644 $o1 0      a"
  49                echo "100644 $o0 0      b"
  50                echo "100644 $o0 0      c"
  51                echo "100644 $o1 0      d/e"
  52        ) >expected &&
  53        test_cmp expected actual
  54'
  55
  56test_expect_success 'setup 2' '
  57
  58        rm -rf [abcd] &&
  59        git checkout side &&
  60        ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
  61        (
  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"
  66                echo "100644 $o0 0      a"
  67                echo "100644 $o0 0      b"
  68                echo "100644 $o0 0      c"
  69                echo "100644 $o0 0      d/e"
  70        ) >expected &&
  71        test_cmp expected actual &&
  72
  73        echo goodbye >>a &&
  74        o2=$(git hash-object a) &&
  75
  76        git add a &&
  77
  78        test_tick &&
  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 &&
  82        (
  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"
  87                echo "100644 $o2 0      a"
  88                echo "100644 $o0 0      b"
  89                echo "100644 $o0 0      c"
  90                echo "100644 $o0 0      d/e"
  91        ) >expected &&
  92        test_cmp expected actual
  93'
  94
  95test_expect_success 'setup 3' '
  96
  97        rm -rf [abcd] &&
  98        git checkout df-1 &&
  99        ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 100        (
 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"
 109        ) >expected &&
 110        test_cmp expected actual &&
 111
 112        rm -f b && mkdir b && echo df-1 >b/c && git add b/c &&
 113        o3=$(git hash-object b/c) &&
 114
 115        test_tick &&
 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 &&
 119        (
 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"
 128        ) >expected &&
 129        test_cmp expected actual
 130'
 131
 132test_expect_success 'setup 4' '
 133
 134        rm -rf [abcd] &&
 135        git checkout df-2 &&
 136        ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 137        (
 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"
 146        ) >expected &&
 147        test_cmp expected actual &&
 148
 149        rm -f a && mkdir a && echo df-2 >a/c && git add a/c &&
 150        o4=$(git hash-object a/c) &&
 151
 152        test_tick &&
 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 &&
 156        (
 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"
 165        ) >expected &&
 166        test_cmp expected actual
 167'
 168
 169test_expect_success 'setup 5' '
 170
 171        rm -rf [abcd] &&
 172        git checkout remove &&
 173        ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 174        (
 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"
 183        ) >expected &&
 184        test_cmp expected actual &&
 185
 186        rm -f b &&
 187        echo remove-conflict >a &&
 188
 189        git add a &&
 190        git rm b &&
 191        o5=$(git hash-object a) &&
 192
 193        test_tick &&
 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 &&
 197        (
 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"
 204        ) >expected &&
 205        test_cmp expected actual
 206
 207'
 208
 209test_expect_success 'setup 6' '
 210
 211        rm -rf [abcd] &&
 212        git checkout df-3 &&
 213        ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 214        (
 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"
 223        ) >expected &&
 224        test_cmp expected actual &&
 225
 226        rm -fr d && echo df-3 >d && git add d &&
 227        o6=$(git hash-object d) &&
 228
 229        test_tick &&
 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 &&
 233        (
 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"
 242        ) >expected &&
 243        test_cmp expected actual
 244'
 245
 246test_expect_success 'setup 7' '
 247
 248        git checkout submod &&
 249        git rm d/e &&
 250        test_tick &&
 251        git commit -m "remove d/e" &&
 252        git update-index --add --cacheinfo 160000 $c1 d &&
 253        test_tick &&
 254        git commit -m "make d/ a submodule"
 255'
 256
 257test_expect_success 'setup 8' '
 258        git checkout rename &&
 259        git mv a e &&
 260        git add e &&
 261        test_tick &&
 262        git commit -m "rename a->e" &&
 263        if test_have_prereq SYMLINKS
 264        then
 265                git checkout rename-ln &&
 266                git mv a e &&
 267                ln -s e a &&
 268                git add a e &&
 269                test_tick &&
 270                git commit -m "rename a->e, symlink a->e" &&
 271                oln=`printf e | git hash-object --stdin`
 272        fi
 273'
 274
 275test_expect_success 'setup 9' '
 276        git checkout copy &&
 277        cp a e &&
 278        git add e &&
 279        test_tick &&
 280        git commit -m "copy a->e"
 281'
 282
 283test_expect_success 'merge-recursive simple' '
 284
 285        rm -fr [abcd] &&
 286        git checkout -f "$c2" &&
 287
 288        git merge-recursive "$c0" -- "$c2" "$c1"
 289        status=$?
 290        case "$status" in
 291        1)
 292                : happy
 293                ;;
 294        *)
 295                echo >&2 "why status $status!!!"
 296                false
 297                ;;
 298        esac
 299'
 300
 301test_expect_success 'merge-recursive result' '
 302
 303        git ls-files -s >actual &&
 304        (
 305                echo "100644 $o0 1      a"
 306                echo "100644 $o2 2      a"
 307                echo "100644 $o1 3      a"
 308                echo "100644 $o0 0      b"
 309                echo "100644 $o0 0      c"
 310                echo "100644 $o1 0      d/e"
 311        ) >expected &&
 312        test_cmp expected actual
 313
 314'
 315
 316test_expect_success 'fail if the index has unresolved entries' '
 317
 318        rm -fr [abcd] &&
 319        git checkout -f "$c1" &&
 320
 321        test_must_fail git merge "$c5" &&
 322        test_must_fail git merge "$c5" 2> out &&
 323        test_i18ngrep "not possible because you have unmerged files" out &&
 324        git add -u &&
 325        test_must_fail git merge "$c5" 2> out &&
 326        test_i18ngrep "You have not concluded your merge" out &&
 327        rm -f .git/MERGE_HEAD &&
 328        test_must_fail git merge "$c5" 2> out &&
 329        test_i18ngrep "Your local changes to the following files would be overwritten by merge:" out
 330'
 331
 332test_expect_success 'merge-recursive remove conflict' '
 333
 334        rm -fr [abcd] &&
 335        git checkout -f "$c1" &&
 336
 337        git merge-recursive "$c0" -- "$c1" "$c5"
 338        status=$?
 339        case "$status" in
 340        1)
 341                : happy
 342                ;;
 343        *)
 344                echo >&2 "why status $status!!!"
 345                false
 346                ;;
 347        esac
 348'
 349
 350test_expect_success 'merge-recursive remove conflict' '
 351
 352        git ls-files -s >actual &&
 353        (
 354                echo "100644 $o0 1      a"
 355                echo "100644 $o1 2      a"
 356                echo "100644 $o5 3      a"
 357                echo "100644 $o0 0      c"
 358                echo "100644 $o1 0      d/e"
 359        ) >expected &&
 360        test_cmp expected actual
 361
 362'
 363
 364test_expect_success 'merge-recursive d/f simple' '
 365        rm -fr [abcd] &&
 366        git reset --hard &&
 367        git checkout -f "$c1" &&
 368
 369        git merge-recursive "$c0" -- "$c1" "$c3"
 370'
 371
 372test_expect_success 'merge-recursive result' '
 373
 374        git ls-files -s >actual &&
 375        (
 376                echo "100644 $o1 0      a"
 377                echo "100644 $o3 0      b/c"
 378                echo "100644 $o0 0      c"
 379                echo "100644 $o1 0      d/e"
 380        ) >expected &&
 381        test_cmp expected actual
 382
 383'
 384
 385test_expect_success 'merge-recursive d/f conflict' '
 386
 387        rm -fr [abcd] &&
 388        git reset --hard &&
 389        git checkout -f "$c1" &&
 390
 391        git merge-recursive "$c0" -- "$c1" "$c4"
 392        status=$?
 393        case "$status" in
 394        1)
 395                : happy
 396                ;;
 397        *)
 398                echo >&2 "why status $status!!!"
 399                false
 400                ;;
 401        esac
 402'
 403
 404test_expect_success 'merge-recursive d/f conflict result' '
 405
 406        git ls-files -s >actual &&
 407        (
 408                echo "100644 $o0 1      a"
 409                echo "100644 $o1 2      a"
 410                echo "100644 $o4 0      a/c"
 411                echo "100644 $o0 0      b"
 412                echo "100644 $o0 0      c"
 413                echo "100644 $o1 0      d/e"
 414        ) >expected &&
 415        test_cmp expected actual
 416
 417'
 418
 419test_expect_success 'merge-recursive d/f conflict the other way' '
 420
 421        rm -fr [abcd] &&
 422        git reset --hard &&
 423        git checkout -f "$c4" &&
 424
 425        git merge-recursive "$c0" -- "$c4" "$c1"
 426        status=$?
 427        case "$status" in
 428        1)
 429                : happy
 430                ;;
 431        *)
 432                echo >&2 "why status $status!!!"
 433                false
 434                ;;
 435        esac
 436'
 437
 438test_expect_success 'merge-recursive d/f conflict result the other way' '
 439
 440        git ls-files -s >actual &&
 441        (
 442                echo "100644 $o0 1      a"
 443                echo "100644 $o1 3      a"
 444                echo "100644 $o4 0      a/c"
 445                echo "100644 $o0 0      b"
 446                echo "100644 $o0 0      c"
 447                echo "100644 $o1 0      d/e"
 448        ) >expected &&
 449        test_cmp expected actual
 450
 451'
 452
 453test_expect_success 'merge-recursive d/f conflict' '
 454
 455        rm -fr [abcd] &&
 456        git reset --hard &&
 457        git checkout -f "$c1" &&
 458
 459        git merge-recursive "$c0" -- "$c1" "$c6"
 460        status=$?
 461        case "$status" in
 462        1)
 463                : happy
 464                ;;
 465        *)
 466                echo >&2 "why status $status!!!"
 467                false
 468                ;;
 469        esac
 470'
 471
 472test_expect_success 'merge-recursive d/f conflict result' '
 473
 474        git ls-files -s >actual &&
 475        (
 476                echo "100644 $o1 0      a"
 477                echo "100644 $o0 0      b"
 478                echo "100644 $o0 0      c"
 479                echo "100644 $o6 3      d"
 480                echo "100644 $o0 1      d/e"
 481                echo "100644 $o1 2      d/e"
 482        ) >expected &&
 483        test_cmp expected actual
 484
 485'
 486
 487test_expect_success 'merge-recursive d/f conflict' '
 488
 489        rm -fr [abcd] &&
 490        git reset --hard &&
 491        git checkout -f "$c6" &&
 492
 493        git merge-recursive "$c0" -- "$c6" "$c1"
 494        status=$?
 495        case "$status" in
 496        1)
 497                : happy
 498                ;;
 499        *)
 500                echo >&2 "why status $status!!!"
 501                false
 502                ;;
 503        esac
 504'
 505
 506test_expect_success 'merge-recursive d/f conflict result' '
 507
 508        git ls-files -s >actual &&
 509        (
 510                echo "100644 $o1 0      a"
 511                echo "100644 $o0 0      b"
 512                echo "100644 $o0 0      c"
 513                echo "100644 $o6 2      d"
 514                echo "100644 $o0 1      d/e"
 515                echo "100644 $o1 3      d/e"
 516        ) >expected &&
 517        test_cmp expected actual
 518
 519'
 520
 521test_expect_success 'reset and 3-way merge' '
 522
 523        git reset --hard "$c2" &&
 524        git read-tree -m "$c0" "$c2" "$c1"
 525
 526'
 527
 528test_expect_success 'reset and bind merge' '
 529
 530        git reset --hard master &&
 531        git read-tree --prefix=M/ master &&
 532        git ls-files -s >actual &&
 533        (
 534                echo "100644 $o1 0      M/a"
 535                echo "100644 $o0 0      M/b"
 536                echo "100644 $o0 0      M/c"
 537                echo "100644 $o1 0      M/d/e"
 538                echo "100644 $o1 0      a"
 539                echo "100644 $o0 0      b"
 540                echo "100644 $o0 0      c"
 541                echo "100644 $o1 0      d/e"
 542        ) >expected &&
 543        test_cmp expected actual &&
 544
 545        git read-tree --prefix=a1/ master &&
 546        git ls-files -s >actual &&
 547        (
 548                echo "100644 $o1 0      M/a"
 549                echo "100644 $o0 0      M/b"
 550                echo "100644 $o0 0      M/c"
 551                echo "100644 $o1 0      M/d/e"
 552                echo "100644 $o1 0      a"
 553                echo "100644 $o1 0      a1/a"
 554                echo "100644 $o0 0      a1/b"
 555                echo "100644 $o0 0      a1/c"
 556                echo "100644 $o1 0      a1/d/e"
 557                echo "100644 $o0 0      b"
 558                echo "100644 $o0 0      c"
 559                echo "100644 $o1 0      d/e"
 560        ) >expected &&
 561        test_cmp expected actual &&
 562
 563        git read-tree --prefix=z/ master &&
 564        git ls-files -s >actual &&
 565        (
 566                echo "100644 $o1 0      M/a"
 567                echo "100644 $o0 0      M/b"
 568                echo "100644 $o0 0      M/c"
 569                echo "100644 $o1 0      M/d/e"
 570                echo "100644 $o1 0      a"
 571                echo "100644 $o1 0      a1/a"
 572                echo "100644 $o0 0      a1/b"
 573                echo "100644 $o0 0      a1/c"
 574                echo "100644 $o1 0      a1/d/e"
 575                echo "100644 $o0 0      b"
 576                echo "100644 $o0 0      c"
 577                echo "100644 $o1 0      d/e"
 578                echo "100644 $o1 0      z/a"
 579                echo "100644 $o0 0      z/b"
 580                echo "100644 $o0 0      z/c"
 581                echo "100644 $o1 0      z/d/e"
 582        ) >expected &&
 583        test_cmp expected actual
 584
 585'
 586
 587test_expect_success 'merge removes empty directories' '
 588
 589        git reset --hard master &&
 590        git checkout -b rm &&
 591        git rm d/e &&
 592        git commit -mremoved-d/e &&
 593        git checkout master &&
 594        git merge -s recursive rm &&
 595        test_must_fail test -d d
 596'
 597
 598test_expect_failure 'merge-recursive simple w/submodule' '
 599
 600        git checkout submod &&
 601        git merge remove
 602'
 603
 604test_expect_failure 'merge-recursive simple w/submodule result' '
 605
 606        git ls-files -s >actual &&
 607        (
 608                echo "100644 $o5 0      a"
 609                echo "100644 $o0 0      c"
 610                echo "160000 $c1 0      d"
 611        ) >expected &&
 612        test_cmp expected actual
 613'
 614
 615test_expect_success 'merge-recursive copy vs. rename' '
 616        git checkout -f copy &&
 617        git merge rename &&
 618        ( git ls-tree -r HEAD && git ls-files -s ) >actual &&
 619        (
 620                echo "100644 blob $o0   b"
 621                echo "100644 blob $o0   c"
 622                echo "100644 blob $o0   d/e"
 623                echo "100644 blob $o0   e"
 624                echo "100644 $o0 0      b"
 625                echo "100644 $o0 0      c"
 626                echo "100644 $o0 0      d/e"
 627                echo "100644 $o0 0      e"
 628        ) >expected &&
 629        test_cmp expected actual
 630'
 631
 632if test_have_prereq SYMLINKS
 633then
 634        test_expect_failure 'merge-recursive rename vs. rename/symlink' '
 635
 636                git checkout -f rename &&
 637                git merge rename-ln &&
 638                ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 639                (
 640                        echo "120000 blob $oln  a"
 641                        echo "100644 blob $o0   b"
 642                        echo "100644 blob $o0   c"
 643                        echo "100644 blob $o0   d/e"
 644                        echo "100644 blob $o0   e"
 645                        echo "120000 $oln 0     a"
 646                        echo "100644 $o0 0      b"
 647                        echo "100644 $o0 0      c"
 648                        echo "100644 $o0 0      d/e"
 649                        echo "100644 $o0 0      e"
 650                ) >expected &&
 651                test_cmp expected actual
 652        '
 653fi
 654
 655
 656test_done