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