t / t3030-merge-recursive.shon commit Merge branch 'jk/maint-diffstat-overflow' (bc32d34)
   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 "not possible because you have unmerged files" out &&
 280        git add -u &&
 281        test_must_fail git merge "$c5" 2> out &&
 282        grep "You have not concluded your merge" out &&
 283        rm -f .git/MERGE_HEAD &&
 284        test_must_fail git merge "$c5" 2> out &&
 285        grep "Your local changes to .* would be overwritten by merge." out
 286'
 287
 288test_expect_success 'merge-recursive remove conflict' '
 289
 290        rm -fr [abcd] &&
 291        git checkout -f "$c1" &&
 292
 293        git merge-recursive "$c0" -- "$c1" "$c5"
 294        status=$?
 295        case "$status" in
 296        1)
 297                : happy
 298                ;;
 299        *)
 300                echo >&2 "why status $status!!!"
 301                false
 302                ;;
 303        esac
 304'
 305
 306test_expect_success 'merge-recursive remove conflict' '
 307
 308        git ls-files -s >actual &&
 309        (
 310                echo "100644 $o0 1      a"
 311                echo "100644 $o1 2      a"
 312                echo "100644 $o5 3      a"
 313                echo "100644 $o0 0      c"
 314                echo "100644 $o1 0      d/e"
 315        ) >expected &&
 316        test_cmp expected actual
 317
 318'
 319
 320test_expect_success 'merge-recursive d/f simple' '
 321        rm -fr [abcd] &&
 322        git reset --hard &&
 323        git checkout -f "$c1" &&
 324
 325        git merge-recursive "$c0" -- "$c1" "$c3"
 326'
 327
 328test_expect_success 'merge-recursive result' '
 329
 330        git ls-files -s >actual &&
 331        (
 332                echo "100644 $o1 0      a"
 333                echo "100644 $o3 0      b/c"
 334                echo "100644 $o0 0      c"
 335                echo "100644 $o1 0      d/e"
 336        ) >expected &&
 337        test_cmp expected actual
 338
 339'
 340
 341test_expect_success 'merge-recursive d/f conflict' '
 342
 343        rm -fr [abcd] &&
 344        git reset --hard &&
 345        git checkout -f "$c1" &&
 346
 347        git merge-recursive "$c0" -- "$c1" "$c4"
 348        status=$?
 349        case "$status" in
 350        1)
 351                : happy
 352                ;;
 353        *)
 354                echo >&2 "why status $status!!!"
 355                false
 356                ;;
 357        esac
 358'
 359
 360test_expect_success 'merge-recursive d/f conflict result' '
 361
 362        git ls-files -s >actual &&
 363        (
 364                echo "100644 $o0 1      a"
 365                echo "100644 $o1 2      a"
 366                echo "100644 $o4 0      a/c"
 367                echo "100644 $o0 0      b"
 368                echo "100644 $o0 0      c"
 369                echo "100644 $o1 0      d/e"
 370        ) >expected &&
 371        test_cmp expected actual
 372
 373'
 374
 375test_expect_success 'merge-recursive d/f conflict the other way' '
 376
 377        rm -fr [abcd] &&
 378        git reset --hard &&
 379        git checkout -f "$c4" &&
 380
 381        git merge-recursive "$c0" -- "$c4" "$c1"
 382        status=$?
 383        case "$status" in
 384        1)
 385                : happy
 386                ;;
 387        *)
 388                echo >&2 "why status $status!!!"
 389                false
 390                ;;
 391        esac
 392'
 393
 394test_expect_success 'merge-recursive d/f conflict result the other way' '
 395
 396        git ls-files -s >actual &&
 397        (
 398                echo "100644 $o0 1      a"
 399                echo "100644 $o1 3      a"
 400                echo "100644 $o4 0      a/c"
 401                echo "100644 $o0 0      b"
 402                echo "100644 $o0 0      c"
 403                echo "100644 $o1 0      d/e"
 404        ) >expected &&
 405        test_cmp expected actual
 406
 407'
 408
 409test_expect_success 'merge-recursive d/f conflict' '
 410
 411        rm -fr [abcd] &&
 412        git reset --hard &&
 413        git checkout -f "$c1" &&
 414
 415        git merge-recursive "$c0" -- "$c1" "$c6"
 416        status=$?
 417        case "$status" in
 418        1)
 419                : happy
 420                ;;
 421        *)
 422                echo >&2 "why status $status!!!"
 423                false
 424                ;;
 425        esac
 426'
 427
 428test_expect_success 'merge-recursive d/f conflict result' '
 429
 430        git ls-files -s >actual &&
 431        (
 432                echo "100644 $o1 0      a"
 433                echo "100644 $o0 0      b"
 434                echo "100644 $o0 0      c"
 435                echo "100644 $o6 3      d"
 436                echo "100644 $o0 1      d/e"
 437                echo "100644 $o1 2      d/e"
 438        ) >expected &&
 439        test_cmp expected actual
 440
 441'
 442
 443test_expect_success 'merge-recursive d/f conflict' '
 444
 445        rm -fr [abcd] &&
 446        git reset --hard &&
 447        git checkout -f "$c6" &&
 448
 449        git merge-recursive "$c0" -- "$c6" "$c1"
 450        status=$?
 451        case "$status" in
 452        1)
 453                : happy
 454                ;;
 455        *)
 456                echo >&2 "why status $status!!!"
 457                false
 458                ;;
 459        esac
 460'
 461
 462test_expect_success 'merge-recursive d/f conflict result' '
 463
 464        git ls-files -s >actual &&
 465        (
 466                echo "100644 $o1 0      a"
 467                echo "100644 $o0 0      b"
 468                echo "100644 $o0 0      c"
 469                echo "100644 $o6 2      d"
 470                echo "100644 $o0 1      d/e"
 471                echo "100644 $o1 3      d/e"
 472        ) >expected &&
 473        test_cmp expected actual
 474
 475'
 476
 477test_expect_success 'reset and 3-way merge' '
 478
 479        git reset --hard "$c2" &&
 480        git read-tree -m "$c0" "$c2" "$c1"
 481
 482'
 483
 484test_expect_success 'reset and bind merge' '
 485
 486        git reset --hard master &&
 487        git read-tree --prefix=M/ master &&
 488        git ls-files -s >actual &&
 489        (
 490                echo "100644 $o1 0      M/a"
 491                echo "100644 $o0 0      M/b"
 492                echo "100644 $o0 0      M/c"
 493                echo "100644 $o1 0      M/d/e"
 494                echo "100644 $o1 0      a"
 495                echo "100644 $o0 0      b"
 496                echo "100644 $o0 0      c"
 497                echo "100644 $o1 0      d/e"
 498        ) >expected &&
 499        test_cmp expected actual &&
 500
 501        git read-tree --prefix=a1/ master &&
 502        git ls-files -s >actual &&
 503        (
 504                echo "100644 $o1 0      M/a"
 505                echo "100644 $o0 0      M/b"
 506                echo "100644 $o0 0      M/c"
 507                echo "100644 $o1 0      M/d/e"
 508                echo "100644 $o1 0      a"
 509                echo "100644 $o1 0      a1/a"
 510                echo "100644 $o0 0      a1/b"
 511                echo "100644 $o0 0      a1/c"
 512                echo "100644 $o1 0      a1/d/e"
 513                echo "100644 $o0 0      b"
 514                echo "100644 $o0 0      c"
 515                echo "100644 $o1 0      d/e"
 516        ) >expected &&
 517        test_cmp expected actual
 518
 519        git read-tree --prefix=z/ master &&
 520        git ls-files -s >actual &&
 521        (
 522                echo "100644 $o1 0      M/a"
 523                echo "100644 $o0 0      M/b"
 524                echo "100644 $o0 0      M/c"
 525                echo "100644 $o1 0      M/d/e"
 526                echo "100644 $o1 0      a"
 527                echo "100644 $o1 0      a1/a"
 528                echo "100644 $o0 0      a1/b"
 529                echo "100644 $o0 0      a1/c"
 530                echo "100644 $o1 0      a1/d/e"
 531                echo "100644 $o0 0      b"
 532                echo "100644 $o0 0      c"
 533                echo "100644 $o1 0      d/e"
 534                echo "100644 $o1 0      z/a"
 535                echo "100644 $o0 0      z/b"
 536                echo "100644 $o0 0      z/c"
 537                echo "100644 $o1 0      z/d/e"
 538        ) >expected &&
 539        test_cmp expected actual
 540
 541'
 542
 543test_expect_success 'merge removes empty directories' '
 544
 545        git reset --hard master &&
 546        git checkout -b rm &&
 547        git rm d/e &&
 548        git commit -mremoved-d/e &&
 549        git checkout master &&
 550        git merge -s recursive rm &&
 551        test_must_fail test -d d
 552'
 553
 554test_done