t / t3030-merge-recursive.shon commit Merge branch 'nd/cache-tree-api-refactor' (a784482)
   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        test_expect_code 1 git merge-recursive "$c0" -- "$c2" "$c1"
 289'
 290
 291test_expect_success 'merge-recursive result' '
 292
 293        git ls-files -s >actual &&
 294        (
 295                echo "100644 $o0 1      a"
 296                echo "100644 $o2 2      a"
 297                echo "100644 $o1 3      a"
 298                echo "100644 $o0 0      b"
 299                echo "100644 $o0 0      c"
 300                echo "100644 $o1 0      d/e"
 301        ) >expected &&
 302        test_cmp expected actual
 303
 304'
 305
 306test_expect_success 'fail if the index has unresolved entries' '
 307
 308        rm -fr [abcd] &&
 309        git checkout -f "$c1" &&
 310
 311        test_must_fail git merge "$c5" &&
 312        test_must_fail git merge "$c5" 2> out &&
 313        test_i18ngrep "not possible because you have unmerged files" out &&
 314        git add -u &&
 315        test_must_fail git merge "$c5" 2> out &&
 316        test_i18ngrep "You have not concluded your merge" out &&
 317        rm -f .git/MERGE_HEAD &&
 318        test_must_fail git merge "$c5" 2> out &&
 319        test_i18ngrep "Your local changes to the following files would be overwritten by merge:" out
 320'
 321
 322test_expect_success 'merge-recursive remove conflict' '
 323
 324        rm -fr [abcd] &&
 325        git checkout -f "$c1" &&
 326
 327        test_expect_code 1 git merge-recursive "$c0" -- "$c1" "$c5"
 328'
 329
 330test_expect_success 'merge-recursive remove conflict' '
 331
 332        git ls-files -s >actual &&
 333        (
 334                echo "100644 $o0 1      a"
 335                echo "100644 $o1 2      a"
 336                echo "100644 $o5 3      a"
 337                echo "100644 $o0 0      c"
 338                echo "100644 $o1 0      d/e"
 339        ) >expected &&
 340        test_cmp expected actual
 341
 342'
 343
 344test_expect_success 'merge-recursive d/f simple' '
 345        rm -fr [abcd] &&
 346        git reset --hard &&
 347        git checkout -f "$c1" &&
 348
 349        git merge-recursive "$c0" -- "$c1" "$c3"
 350'
 351
 352test_expect_success 'merge-recursive result' '
 353
 354        git ls-files -s >actual &&
 355        (
 356                echo "100644 $o1 0      a"
 357                echo "100644 $o3 0      b/c"
 358                echo "100644 $o0 0      c"
 359                echo "100644 $o1 0      d/e"
 360        ) >expected &&
 361        test_cmp expected actual
 362
 363'
 364
 365test_expect_success 'merge-recursive d/f conflict' '
 366
 367        rm -fr [abcd] &&
 368        git reset --hard &&
 369        git checkout -f "$c1" &&
 370
 371        test_expect_code 1 git merge-recursive "$c0" -- "$c1" "$c4"
 372'
 373
 374test_expect_success 'merge-recursive d/f conflict result' '
 375
 376        git ls-files -s >actual &&
 377        (
 378                echo "100644 $o0 1      a"
 379                echo "100644 $o1 2      a"
 380                echo "100644 $o4 0      a/c"
 381                echo "100644 $o0 0      b"
 382                echo "100644 $o0 0      c"
 383                echo "100644 $o1 0      d/e"
 384        ) >expected &&
 385        test_cmp expected actual
 386
 387'
 388
 389test_expect_success 'merge-recursive d/f conflict the other way' '
 390
 391        rm -fr [abcd] &&
 392        git reset --hard &&
 393        git checkout -f "$c4" &&
 394
 395        test_expect_code 1 git merge-recursive "$c0" -- "$c4" "$c1"
 396'
 397
 398test_expect_success 'merge-recursive d/f conflict result the other way' '
 399
 400        git ls-files -s >actual &&
 401        (
 402                echo "100644 $o0 1      a"
 403                echo "100644 $o1 3      a"
 404                echo "100644 $o4 0      a/c"
 405                echo "100644 $o0 0      b"
 406                echo "100644 $o0 0      c"
 407                echo "100644 $o1 0      d/e"
 408        ) >expected &&
 409        test_cmp expected actual
 410
 411'
 412
 413test_expect_success 'merge-recursive d/f conflict' '
 414
 415        rm -fr [abcd] &&
 416        git reset --hard &&
 417        git checkout -f "$c1" &&
 418
 419        test_expect_code 1 git merge-recursive "$c0" -- "$c1" "$c6"
 420'
 421
 422test_expect_success 'merge-recursive d/f conflict result' '
 423
 424        git ls-files -s >actual &&
 425        (
 426                echo "100644 $o1 0      a"
 427                echo "100644 $o0 0      b"
 428                echo "100644 $o0 0      c"
 429                echo "100644 $o6 3      d"
 430                echo "100644 $o0 1      d/e"
 431                echo "100644 $o1 2      d/e"
 432        ) >expected &&
 433        test_cmp expected actual
 434
 435'
 436
 437test_expect_success 'merge-recursive d/f conflict' '
 438
 439        rm -fr [abcd] &&
 440        git reset --hard &&
 441        git checkout -f "$c6" &&
 442
 443        test_expect_code 1 git merge-recursive "$c0" -- "$c6" "$c1"
 444'
 445
 446test_expect_success 'merge-recursive d/f conflict result' '
 447
 448        git ls-files -s >actual &&
 449        (
 450                echo "100644 $o1 0      a"
 451                echo "100644 $o0 0      b"
 452                echo "100644 $o0 0      c"
 453                echo "100644 $o6 2      d"
 454                echo "100644 $o0 1      d/e"
 455                echo "100644 $o1 3      d/e"
 456        ) >expected &&
 457        test_cmp expected actual
 458
 459'
 460
 461test_expect_success 'reset and 3-way merge' '
 462
 463        git reset --hard "$c2" &&
 464        git read-tree -m "$c0" "$c2" "$c1"
 465
 466'
 467
 468test_expect_success 'reset and bind merge' '
 469
 470        git reset --hard master &&
 471        git read-tree --prefix=M/ master &&
 472        git ls-files -s >actual &&
 473        (
 474                echo "100644 $o1 0      M/a"
 475                echo "100644 $o0 0      M/b"
 476                echo "100644 $o0 0      M/c"
 477                echo "100644 $o1 0      M/d/e"
 478                echo "100644 $o1 0      a"
 479                echo "100644 $o0 0      b"
 480                echo "100644 $o0 0      c"
 481                echo "100644 $o1 0      d/e"
 482        ) >expected &&
 483        test_cmp expected actual &&
 484
 485        git read-tree --prefix=a1/ master &&
 486        git ls-files -s >actual &&
 487        (
 488                echo "100644 $o1 0      M/a"
 489                echo "100644 $o0 0      M/b"
 490                echo "100644 $o0 0      M/c"
 491                echo "100644 $o1 0      M/d/e"
 492                echo "100644 $o1 0      a"
 493                echo "100644 $o1 0      a1/a"
 494                echo "100644 $o0 0      a1/b"
 495                echo "100644 $o0 0      a1/c"
 496                echo "100644 $o1 0      a1/d/e"
 497                echo "100644 $o0 0      b"
 498                echo "100644 $o0 0      c"
 499                echo "100644 $o1 0      d/e"
 500        ) >expected &&
 501        test_cmp expected actual &&
 502
 503        git read-tree --prefix=z/ master &&
 504        git ls-files -s >actual &&
 505        (
 506                echo "100644 $o1 0      M/a"
 507                echo "100644 $o0 0      M/b"
 508                echo "100644 $o0 0      M/c"
 509                echo "100644 $o1 0      M/d/e"
 510                echo "100644 $o1 0      a"
 511                echo "100644 $o1 0      a1/a"
 512                echo "100644 $o0 0      a1/b"
 513                echo "100644 $o0 0      a1/c"
 514                echo "100644 $o1 0      a1/d/e"
 515                echo "100644 $o0 0      b"
 516                echo "100644 $o0 0      c"
 517                echo "100644 $o1 0      d/e"
 518                echo "100644 $o1 0      z/a"
 519                echo "100644 $o0 0      z/b"
 520                echo "100644 $o0 0      z/c"
 521                echo "100644 $o1 0      z/d/e"
 522        ) >expected &&
 523        test_cmp expected actual
 524
 525'
 526
 527test_expect_success 'merge removes empty directories' '
 528
 529        git reset --hard master &&
 530        git checkout -b rm &&
 531        git rm d/e &&
 532        git commit -mremoved-d/e &&
 533        git checkout master &&
 534        git merge -s recursive rm &&
 535        test_must_fail test -d d
 536'
 537
 538test_expect_failure 'merge-recursive simple w/submodule' '
 539
 540        git checkout submod &&
 541        git merge remove
 542'
 543
 544test_expect_failure 'merge-recursive simple w/submodule result' '
 545
 546        git ls-files -s >actual &&
 547        (
 548                echo "100644 $o5 0      a"
 549                echo "100644 $o0 0      c"
 550                echo "160000 $c1 0      d"
 551        ) >expected &&
 552        test_cmp expected actual
 553'
 554
 555test_expect_success 'merge-recursive copy vs. rename' '
 556        git checkout -f copy &&
 557        git merge rename &&
 558        ( git ls-tree -r HEAD && git ls-files -s ) >actual &&
 559        (
 560                echo "100644 blob $o0   b"
 561                echo "100644 blob $o0   c"
 562                echo "100644 blob $o0   d/e"
 563                echo "100644 blob $o0   e"
 564                echo "100644 $o0 0      b"
 565                echo "100644 $o0 0      c"
 566                echo "100644 $o0 0      d/e"
 567                echo "100644 $o0 0      e"
 568        ) >expected &&
 569        test_cmp expected actual
 570'
 571
 572if test_have_prereq SYMLINKS
 573then
 574        test_expect_failure 'merge-recursive rename vs. rename/symlink' '
 575
 576                git checkout -f rename &&
 577                git merge rename-ln &&
 578                ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 579                (
 580                        echo "120000 blob $oln  a"
 581                        echo "100644 blob $o0   b"
 582                        echo "100644 blob $o0   c"
 583                        echo "100644 blob $o0   d/e"
 584                        echo "100644 blob $o0   e"
 585                        echo "120000 $oln 0     a"
 586                        echo "100644 $o0 0      b"
 587                        echo "100644 $o0 0      c"
 588                        echo "100644 $o0 0      d/e"
 589                        echo "100644 $o0 0      e"
 590                ) >expected &&
 591                test_cmp expected actual
 592        '
 593fi
 594
 595
 596test_done