1#!/bin/sh
   2test_description='merge-recursive backend test'
   4. ./test-lib.sh
   6test_expect_success 'setup 1' '
   8        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        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        echo hello >>a &&
  27        cp a d/e &&
  28        o1=$(git hash-object a) &&
  29        git add a d/e &&
  31        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'
  48test_expect_success 'setup 2' '
  50        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        echo goodbye >>a &&
  67        o2=$(git hash-object a) &&
  68        git add a &&
  70        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'
  87test_expect_success 'setup 3' '
  89        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        rm -f b && mkdir b && echo df-1 >b/c && git add b/c &&
 106        o3=$(git hash-object b/c) &&
 107        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'
 124test_expect_success 'setup 4' '
 126        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        rm -f a && mkdir a && echo df-2 >a/c && git add a/c &&
 143        o4=$(git hash-object a/c) &&
 144        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'
 161test_expect_success 'setup 5' '
 163        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        rm -f b &&
 180        echo remove-conflict >a &&
 181        git add a &&
 183        git rm b &&
 184        o5=$(git hash-object a) &&
 185        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'
 201test_expect_success 'setup 6' '
 203        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        rm -fr d && echo df-3 >d && git add d &&
 220        o6=$(git hash-object d) &&
 221        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'
 238test_expect_success 'merge-recursive simple' '
 240        rm -fr [abcd] &&
 242        git checkout -f "$c2" &&
 243        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'
 256test_expect_success 'merge-recursive result' '
 258        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'
 271test_expect_success 'fail if the index has unresolved entries' '
 273        rm -fr [abcd] &&
 275        git checkout -f "$c1" &&
 276        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'
 282test_expect_success 'merge-recursive remove conflict' '
 284        rm -fr [abcd] &&
 286        git checkout -f "$c1" &&
 287        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'
 300test_expect_success 'merge-recursive remove conflict' '
 302        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'
 314test_expect_success 'merge-recursive d/f simple' '
 316        rm -fr [abcd] &&
 317        git reset --hard &&
 318        git checkout -f "$c1" &&
 319        git merge-recursive "$c0" -- "$c1" "$c3"
 321'
 322test_expect_success 'merge-recursive result' '
 324        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'
 335test_expect_success 'merge-recursive d/f conflict' '
 337        rm -fr [abcd] &&
 339        git reset --hard &&
 340        git checkout -f "$c1" &&
 341        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'
 354test_expect_success 'merge-recursive d/f conflict result' '
 356        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'
 369test_expect_success 'merge-recursive d/f conflict the other way' '
 371        rm -fr [abcd] &&
 373        git reset --hard &&
 374        git checkout -f "$c4" &&
 375        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'
 388test_expect_success 'merge-recursive d/f conflict result the other way' '
 390        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'
 403test_expect_success 'merge-recursive d/f conflict' '
 405        rm -fr [abcd] &&
 407        git reset --hard &&
 408        git checkout -f "$c1" &&
 409        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'
 422test_expect_success 'merge-recursive d/f conflict result' '
 424        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'
 437test_expect_success 'merge-recursive d/f conflict' '
 439        rm -fr [abcd] &&
 441        git reset --hard &&
 442        git checkout -f "$c6" &&
 443        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'
 456test_expect_success 'merge-recursive d/f conflict result' '
 458        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'
 471test_expect_success 'reset and 3-way merge' '
 473        git reset --hard "$c2" &&
 475        git read-tree -m "$c0" "$c2" "$c1"
 476'
 478test_expect_success 'reset and bind merge' '
 480        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        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        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'
 537test_expect_success 'merge removes empty directories' '
 539        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'
 548test_done