t / t3030-merge-recursive.shon commit Merge branch 'maint' (5c283eb)
   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
  26        echo hello >>a &&
  27        cp a d/e &&
  28        o1=$(git hash-object a) &&
  29
  30        git add a d/e &&
  31
  32        test_tick &&
  33        git commit -m "master modifies a and d/e" &&
  34        c1=$(git rev-parse --verify HEAD) &&
  35        ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
  36        (
  37                echo "100644 blob $o1   a"
  38                echo "100644 blob $o0   b"
  39                echo "100644 blob $o0   c"
  40                echo "100644 blob $o1   d/e"
  41                echo "100644 $o1 0      a"
  42                echo "100644 $o0 0      b"
  43                echo "100644 $o0 0      c"
  44                echo "100644 $o1 0      d/e"
  45        ) >expected &&
  46        test_cmp expected actual
  47'
  48
  49test_expect_success 'setup 2' '
  50
  51        rm -rf [abcd] &&
  52        git checkout side &&
  53        ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
  54        (
  55                echo "100644 blob $o0   a"
  56                echo "100644 blob $o0   b"
  57                echo "100644 blob $o0   c"
  58                echo "100644 blob $o0   d/e"
  59                echo "100644 $o0 0      a"
  60                echo "100644 $o0 0      b"
  61                echo "100644 $o0 0      c"
  62                echo "100644 $o0 0      d/e"
  63        ) >expected &&
  64        test_cmp expected actual &&
  65
  66        echo goodbye >>a &&
  67        o2=$(git hash-object a) &&
  68
  69        git add a &&
  70
  71        test_tick &&
  72        git commit -m "side modifies a" &&
  73        c2=$(git rev-parse --verify HEAD) &&
  74        ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
  75        (
  76                echo "100644 blob $o2   a"
  77                echo "100644 blob $o0   b"
  78                echo "100644 blob $o0   c"
  79                echo "100644 blob $o0   d/e"
  80                echo "100644 $o2 0      a"
  81                echo "100644 $o0 0      b"
  82                echo "100644 $o0 0      c"
  83                echo "100644 $o0 0      d/e"
  84        ) >expected &&
  85        test_cmp expected actual
  86'
  87
  88test_expect_success 'setup 3' '
  89
  90        rm -rf [abcd] &&
  91        git checkout df-1 &&
  92        ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
  93        (
  94                echo "100644 blob $o0   a"
  95                echo "100644 blob $o0   b"
  96                echo "100644 blob $o0   c"
  97                echo "100644 blob $o0   d/e"
  98                echo "100644 $o0 0      a"
  99                echo "100644 $o0 0      b"
 100                echo "100644 $o0 0      c"
 101                echo "100644 $o0 0      d/e"
 102        ) >expected &&
 103        test_cmp expected actual &&
 104
 105        rm -f b && mkdir b && echo df-1 >b/c && git add b/c &&
 106        o3=$(git hash-object b/c) &&
 107
 108        test_tick &&
 109        git commit -m "df-1 makes b/c" &&
 110        c3=$(git rev-parse --verify HEAD) &&
 111        ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 112        (
 113                echo "100644 blob $o0   a"
 114                echo "100644 blob $o3   b/c"
 115                echo "100644 blob $o0   c"
 116                echo "100644 blob $o0   d/e"
 117                echo "100644 $o0 0      a"
 118                echo "100644 $o3 0      b/c"
 119                echo "100644 $o0 0      c"
 120                echo "100644 $o0 0      d/e"
 121        ) >expected &&
 122        test_cmp expected actual
 123'
 124
 125test_expect_success 'setup 4' '
 126
 127        rm -rf [abcd] &&
 128        git checkout df-2 &&
 129        ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 130        (
 131                echo "100644 blob $o0   a"
 132                echo "100644 blob $o0   b"
 133                echo "100644 blob $o0   c"
 134                echo "100644 blob $o0   d/e"
 135                echo "100644 $o0 0      a"
 136                echo "100644 $o0 0      b"
 137                echo "100644 $o0 0      c"
 138                echo "100644 $o0 0      d/e"
 139        ) >expected &&
 140        test_cmp expected actual &&
 141
 142        rm -f a && mkdir a && echo df-2 >a/c && git add a/c &&
 143        o4=$(git hash-object a/c) &&
 144
 145        test_tick &&
 146        git commit -m "df-2 makes a/c" &&
 147        c4=$(git rev-parse --verify HEAD) &&
 148        ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 149        (
 150                echo "100644 blob $o4   a/c"
 151                echo "100644 blob $o0   b"
 152                echo "100644 blob $o0   c"
 153                echo "100644 blob $o0   d/e"
 154                echo "100644 $o4 0      a/c"
 155                echo "100644 $o0 0      b"
 156                echo "100644 $o0 0      c"
 157                echo "100644 $o0 0      d/e"
 158        ) >expected &&
 159        test_cmp expected actual
 160'
 161
 162test_expect_success 'setup 5' '
 163
 164        rm -rf [abcd] &&
 165        git checkout remove &&
 166        ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 167        (
 168                echo "100644 blob $o0   a"
 169                echo "100644 blob $o0   b"
 170                echo "100644 blob $o0   c"
 171                echo "100644 blob $o0   d/e"
 172                echo "100644 $o0 0      a"
 173                echo "100644 $o0 0      b"
 174                echo "100644 $o0 0      c"
 175                echo "100644 $o0 0      d/e"
 176        ) >expected &&
 177        test_cmp expected actual &&
 178
 179        rm -f b &&
 180        echo remove-conflict >a &&
 181
 182        git add a &&
 183        git rm b &&
 184        o5=$(git hash-object a) &&
 185
 186        test_tick &&
 187        git commit -m "remove removes b and modifies a" &&
 188        c5=$(git rev-parse --verify HEAD) &&
 189        ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 190        (
 191                echo "100644 blob $o5   a"
 192                echo "100644 blob $o0   c"
 193                echo "100644 blob $o0   d/e"
 194                echo "100644 $o5 0      a"
 195                echo "100644 $o0 0      c"
 196                echo "100644 $o0 0      d/e"
 197        ) >expected &&
 198        test_cmp expected actual
 199
 200'
 201
 202test_expect_success 'setup 6' '
 203
 204        rm -rf [abcd] &&
 205        git checkout df-3 &&
 206        ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 207        (
 208                echo "100644 blob $o0   a"
 209                echo "100644 blob $o0   b"
 210                echo "100644 blob $o0   c"
 211                echo "100644 blob $o0   d/e"
 212                echo "100644 $o0 0      a"
 213                echo "100644 $o0 0      b"
 214                echo "100644 $o0 0      c"
 215                echo "100644 $o0 0      d/e"
 216        ) >expected &&
 217        test_cmp expected actual &&
 218
 219        rm -fr d && echo df-3 >d && git add d &&
 220        o6=$(git hash-object d) &&
 221
 222        test_tick &&
 223        git commit -m "df-3 makes d" &&
 224        c6=$(git rev-parse --verify HEAD) &&
 225        ( git ls-tree -r HEAD ; git ls-files -s ) >actual &&
 226        (
 227                echo "100644 blob $o0   a"
 228                echo "100644 blob $o0   b"
 229                echo "100644 blob $o0   c"
 230                echo "100644 blob $o6   d"
 231                echo "100644 $o0 0      a"
 232                echo "100644 $o0 0      b"
 233                echo "100644 $o0 0      c"
 234                echo "100644 $o6 0      d"
 235        ) >expected &&
 236        test_cmp expected actual
 237'
 238
 239test_expect_success 'merge-recursive simple' '
 240
 241        rm -fr [abcd] &&
 242        git checkout -f "$c2" &&
 243
 244        git merge-recursive "$c0" -- "$c2" "$c1"
 245        status=$?
 246        case "$status" in
 247        1)
 248                : happy
 249                ;;
 250        *)
 251                echo >&2 "why status $status!!!"
 252                false
 253                ;;
 254        esac
 255'
 256
 257test_expect_success 'merge-recursive result' '
 258
 259        git ls-files -s >actual &&
 260        (
 261                echo "100644 $o0 1      a"
 262                echo "100644 $o2 2      a"
 263                echo "100644 $o1 3      a"
 264                echo "100644 $o0 0      b"
 265                echo "100644 $o0 0      c"
 266                echo "100644 $o1 0      d/e"
 267        ) >expected &&
 268        test_cmp expected actual
 269
 270'
 271
 272test_expect_success 'fail if the index has unresolved entries' '
 273
 274        rm -fr [abcd] &&
 275        git checkout -f "$c1" &&
 276
 277        test_must_fail git merge "$c5" &&
 278        test_must_fail git merge "$c5" 2> out &&
 279        grep "You are in the middle of a conflicted merge" out
 280
 281'
 282
 283test_expect_success 'merge-recursive remove conflict' '
 284
 285        rm -fr [abcd] &&
 286        git checkout -f "$c1" &&
 287
 288        git merge-recursive "$c0" -- "$c1" "$c5"
 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 remove conflict' '
 302
 303        git ls-files -s >actual &&
 304        (
 305                echo "100644 $o0 1      a"
 306                echo "100644 $o1 2      a"
 307                echo "100644 $o5 3      a"
 308                echo "100644 $o0 0      c"
 309                echo "100644 $o1 0      d/e"
 310        ) >expected &&
 311        test_cmp expected actual
 312
 313'
 314
 315test_expect_success 'merge-recursive d/f simple' '
 316        rm -fr [abcd] &&
 317        git reset --hard &&
 318        git checkout -f "$c1" &&
 319
 320        git merge-recursive "$c0" -- "$c1" "$c3"
 321'
 322
 323test_expect_success 'merge-recursive result' '
 324
 325        git ls-files -s >actual &&
 326        (
 327                echo "100644 $o1 0      a"
 328                echo "100644 $o3 0      b/c"
 329                echo "100644 $o0 0      c"
 330                echo "100644 $o1 0      d/e"
 331        ) >expected &&
 332        test_cmp expected actual
 333
 334'
 335
 336test_expect_success 'merge-recursive d/f conflict' '
 337
 338        rm -fr [abcd] &&
 339        git reset --hard &&
 340        git checkout -f "$c1" &&
 341
 342        git merge-recursive "$c0" -- "$c1" "$c4"
 343        status=$?
 344        case "$status" in
 345        1)
 346                : happy
 347                ;;
 348        *)
 349                echo >&2 "why status $status!!!"
 350                false
 351                ;;
 352        esac
 353'
 354
 355test_expect_success 'merge-recursive d/f conflict result' '
 356
 357        git ls-files -s >actual &&
 358        (
 359                echo "100644 $o0 1      a"
 360                echo "100644 $o1 2      a"
 361                echo "100644 $o4 0      a/c"
 362                echo "100644 $o0 0      b"
 363                echo "100644 $o0 0      c"
 364                echo "100644 $o1 0      d/e"
 365        ) >expected &&
 366        test_cmp expected actual
 367
 368'
 369
 370test_expect_success 'merge-recursive d/f conflict the other way' '
 371
 372        rm -fr [abcd] &&
 373        git reset --hard &&
 374        git checkout -f "$c4" &&
 375
 376        git merge-recursive "$c0" -- "$c4" "$c1"
 377        status=$?
 378        case "$status" in
 379        1)
 380                : happy
 381                ;;
 382        *)
 383                echo >&2 "why status $status!!!"
 384                false
 385                ;;
 386        esac
 387'
 388
 389test_expect_success 'merge-recursive d/f conflict result the other way' '
 390
 391        git ls-files -s >actual &&
 392        (
 393                echo "100644 $o0 1      a"
 394                echo "100644 $o1 3      a"
 395                echo "100644 $o4 0      a/c"
 396                echo "100644 $o0 0      b"
 397                echo "100644 $o0 0      c"
 398                echo "100644 $o1 0      d/e"
 399        ) >expected &&
 400        test_cmp expected actual
 401
 402'
 403
 404test_expect_success 'merge-recursive d/f conflict' '
 405
 406        rm -fr [abcd] &&
 407        git reset --hard &&
 408        git checkout -f "$c1" &&
 409
 410        git merge-recursive "$c0" -- "$c1" "$c6"
 411        status=$?
 412        case "$status" in
 413        1)
 414                : happy
 415                ;;
 416        *)
 417                echo >&2 "why status $status!!!"
 418                false
 419                ;;
 420        esac
 421'
 422
 423test_expect_success 'merge-recursive d/f conflict result' '
 424
 425        git ls-files -s >actual &&
 426        (
 427                echo "100644 $o1 0      a"
 428                echo "100644 $o0 0      b"
 429                echo "100644 $o0 0      c"
 430                echo "100644 $o6 3      d"
 431                echo "100644 $o0 1      d/e"
 432                echo "100644 $o1 2      d/e"
 433        ) >expected &&
 434        test_cmp expected actual
 435
 436'
 437
 438test_expect_success 'merge-recursive d/f conflict' '
 439
 440        rm -fr [abcd] &&
 441        git reset --hard &&
 442        git checkout -f "$c6" &&
 443
 444        git merge-recursive "$c0" -- "$c6" "$c1"
 445        status=$?
 446        case "$status" in
 447        1)
 448                : happy
 449                ;;
 450        *)
 451                echo >&2 "why status $status!!!"
 452                false
 453                ;;
 454        esac
 455'
 456
 457test_expect_success 'merge-recursive d/f conflict result' '
 458
 459        git ls-files -s >actual &&
 460        (
 461                echo "100644 $o1 0      a"
 462                echo "100644 $o0 0      b"
 463                echo "100644 $o0 0      c"
 464                echo "100644 $o6 2      d"
 465                echo "100644 $o0 1      d/e"
 466                echo "100644 $o1 3      d/e"
 467        ) >expected &&
 468        test_cmp expected actual
 469
 470'
 471
 472test_expect_success 'reset and 3-way merge' '
 473
 474        git reset --hard "$c2" &&
 475        git read-tree -m "$c0" "$c2" "$c1"
 476
 477'
 478
 479test_expect_success 'reset and bind merge' '
 480
 481        git reset --hard master &&
 482        git read-tree --prefix=M/ master &&
 483        git ls-files -s >actual &&
 484        (
 485                echo "100644 $o1 0      M/a"
 486                echo "100644 $o0 0      M/b"
 487                echo "100644 $o0 0      M/c"
 488                echo "100644 $o1 0      M/d/e"
 489                echo "100644 $o1 0      a"
 490                echo "100644 $o0 0      b"
 491                echo "100644 $o0 0      c"
 492                echo "100644 $o1 0      d/e"
 493        ) >expected &&
 494        test_cmp expected actual &&
 495
 496        git read-tree --prefix=a1/ master &&
 497        git ls-files -s >actual &&
 498        (
 499                echo "100644 $o1 0      M/a"
 500                echo "100644 $o0 0      M/b"
 501                echo "100644 $o0 0      M/c"
 502                echo "100644 $o1 0      M/d/e"
 503                echo "100644 $o1 0      a"
 504                echo "100644 $o1 0      a1/a"
 505                echo "100644 $o0 0      a1/b"
 506                echo "100644 $o0 0      a1/c"
 507                echo "100644 $o1 0      a1/d/e"
 508                echo "100644 $o0 0      b"
 509                echo "100644 $o0 0      c"
 510                echo "100644 $o1 0      d/e"
 511        ) >expected &&
 512        test_cmp expected actual
 513
 514        git read-tree --prefix=z/ master &&
 515        git ls-files -s >actual &&
 516        (
 517                echo "100644 $o1 0      M/a"
 518                echo "100644 $o0 0      M/b"
 519                echo "100644 $o0 0      M/c"
 520                echo "100644 $o1 0      M/d/e"
 521                echo "100644 $o1 0      a"
 522                echo "100644 $o1 0      a1/a"
 523                echo "100644 $o0 0      a1/b"
 524                echo "100644 $o0 0      a1/c"
 525                echo "100644 $o1 0      a1/d/e"
 526                echo "100644 $o0 0      b"
 527                echo "100644 $o0 0      c"
 528                echo "100644 $o1 0      d/e"
 529                echo "100644 $o1 0      z/a"
 530                echo "100644 $o0 0      z/b"
 531                echo "100644 $o0 0      z/c"
 532                echo "100644 $o1 0      z/d/e"
 533        ) >expected &&
 534        test_cmp expected actual
 535
 536'
 537
 538test_expect_success 'merge removes empty directories' '
 539
 540        git reset --hard master &&
 541        git checkout -b rm &&
 542        git rm d/e &&
 543        git commit -mremoved-d/e &&
 544        git checkout master &&
 545        git merge -s recursive rm &&
 546        test_must_fail test -d d
 547'
 548
 549test_done