t / t7406-submodule-update.shon commit untracked-cache: be defensive about missing NULs in index (c6909f9)
   1#!/bin/sh
   2#
   3# Copyright (c) 2009 Red Hat, Inc.
   4#
   5
   6test_description='Test updating submodules
   7
   8This test verifies that "git submodule update" detaches the HEAD of the
   9submodule and "git submodule update --rebase/--merge" does not detach the HEAD.
  10'
  11
  12. ./test-lib.sh
  13
  14
  15compare_head()
  16{
  17    sha_master=$(git rev-list --max-count=1 master)
  18    sha_head=$(git rev-list --max-count=1 HEAD)
  19
  20    test "$sha_master" = "$sha_head"
  21}
  22
  23
  24test_expect_success 'setup a submodule tree' '
  25        echo file > file &&
  26        git add file &&
  27        test_tick &&
  28        git commit -m upstream &&
  29        git clone . super &&
  30        git clone super submodule &&
  31        git clone super rebasing &&
  32        git clone super merging &&
  33        git clone super none &&
  34        (cd super &&
  35         git submodule add ../submodule submodule &&
  36         test_tick &&
  37         git commit -m "submodule" &&
  38         git submodule init submodule
  39        ) &&
  40        (cd submodule &&
  41        echo "line2" > file &&
  42        git add file &&
  43        git commit -m "Commit 2"
  44        ) &&
  45        (cd super &&
  46         (cd submodule &&
  47          git pull --rebase origin
  48         ) &&
  49         git add submodule &&
  50         git commit -m "submodule update"
  51        ) &&
  52        (cd super &&
  53         git submodule add ../rebasing rebasing &&
  54         test_tick &&
  55         git commit -m "rebasing"
  56        ) &&
  57        (cd super &&
  58         git submodule add ../merging merging &&
  59         test_tick &&
  60         git commit -m "rebasing"
  61        ) &&
  62        (cd super &&
  63         git submodule add ../none none &&
  64         test_tick &&
  65         git commit -m "none"
  66        ) &&
  67        git clone . recursivesuper &&
  68        ( cd recursivesuper &&
  69         git submodule add ../super super
  70        )
  71'
  72
  73test_expect_success 'submodule update detaching the HEAD ' '
  74        (cd super/submodule &&
  75         git reset --hard HEAD~1
  76        ) &&
  77        (cd super &&
  78         (cd submodule &&
  79          compare_head
  80         ) &&
  81         git submodule update submodule &&
  82         cd submodule &&
  83         ! compare_head
  84        )
  85'
  86
  87test_expect_success 'submodule update from subdirectory' '
  88        (cd super/submodule &&
  89         git reset --hard HEAD~1
  90        ) &&
  91        mkdir super/sub &&
  92        (cd super/sub &&
  93         (cd ../submodule &&
  94          compare_head
  95         ) &&
  96         git submodule update ../submodule &&
  97         cd ../submodule &&
  98         ! compare_head
  99        )
 100'
 101
 102supersha1=$(git -C super rev-parse HEAD)
 103mergingsha1=$(git -C super/merging rev-parse HEAD)
 104nonesha1=$(git -C super/none rev-parse HEAD)
 105rebasingsha1=$(git -C super/rebasing rev-parse HEAD)
 106submodulesha1=$(git -C super/submodule rev-parse HEAD)
 107pwd=$(pwd)
 108
 109cat <<EOF >expect
 110Submodule path '../super': checked out '$supersha1'
 111Submodule path '../super/merging': checked out '$mergingsha1'
 112Submodule path '../super/none': checked out '$nonesha1'
 113Submodule path '../super/rebasing': checked out '$rebasingsha1'
 114Submodule path '../super/submodule': checked out '$submodulesha1'
 115EOF
 116
 117cat <<EOF >expect2
 118Cloning into '$pwd/recursivesuper/super/merging'...
 119Cloning into '$pwd/recursivesuper/super/none'...
 120Cloning into '$pwd/recursivesuper/super/rebasing'...
 121Cloning into '$pwd/recursivesuper/super/submodule'...
 122Submodule 'merging' ($pwd/merging) registered for path '../super/merging'
 123Submodule 'none' ($pwd/none) registered for path '../super/none'
 124Submodule 'rebasing' ($pwd/rebasing) registered for path '../super/rebasing'
 125Submodule 'submodule' ($pwd/submodule) registered for path '../super/submodule'
 126done.
 127done.
 128done.
 129done.
 130EOF
 131
 132test_expect_success 'submodule update --init --recursive from subdirectory' '
 133        git -C recursivesuper/super reset --hard HEAD^ &&
 134        (cd recursivesuper &&
 135         mkdir tmp &&
 136         cd tmp &&
 137         git submodule update --init --recursive ../super >../../actual 2>../../actual2
 138        ) &&
 139        test_i18ncmp expect actual &&
 140        sort actual2 >actual2.sorted &&
 141        test_i18ncmp expect2 actual2.sorted
 142'
 143
 144cat <<EOF >expect2
 145Submodule 'foo/sub' ($pwd/withsubs/../rebasing) registered for path 'sub'
 146EOF
 147
 148test_expect_success 'submodule update --init from and of subdirectory' '
 149        git init withsubs &&
 150        (cd withsubs &&
 151         mkdir foo &&
 152         git submodule add "$(pwd)/../rebasing" foo/sub &&
 153         (cd foo &&
 154          git submodule deinit -f sub &&
 155          git submodule update --init sub 2>../../actual2
 156         )
 157        ) &&
 158        test_i18ncmp expect2 actual2
 159'
 160
 161apos="'";
 162test_expect_success 'submodule update does not fetch already present commits' '
 163        (cd submodule &&
 164          echo line3 >> file &&
 165          git add file &&
 166          test_tick &&
 167          git commit -m "upstream line3"
 168        ) &&
 169        (cd super/submodule &&
 170          head=$(git rev-parse --verify HEAD) &&
 171          echo "Submodule path ${apos}submodule$apos: checked out $apos$head$apos" > ../../expected &&
 172          git reset --hard HEAD~1
 173        ) &&
 174        (cd super &&
 175          git submodule update > ../actual 2> ../actual.err
 176        ) &&
 177        test_i18ncmp expected actual &&
 178        test_must_be_empty actual.err
 179'
 180
 181test_expect_success 'submodule update should fail due to local changes' '
 182        (cd super/submodule &&
 183         git reset --hard HEAD~1 &&
 184         echo "local change" > file
 185        ) &&
 186        (cd super &&
 187         (cd submodule &&
 188          compare_head
 189         ) &&
 190         test_must_fail git submodule update submodule
 191        )
 192'
 193test_expect_success 'submodule update should throw away changes with --force ' '
 194        (cd super &&
 195         (cd submodule &&
 196          compare_head
 197         ) &&
 198         git submodule update --force submodule &&
 199         cd submodule &&
 200         ! compare_head
 201        )
 202'
 203
 204test_expect_success 'submodule update --force forcibly checks out submodules' '
 205        (cd super &&
 206         (cd submodule &&
 207          rm -f file
 208         ) &&
 209         git submodule update --force submodule &&
 210         (cd submodule &&
 211          test "$(git status -s file)" = ""
 212         )
 213        )
 214'
 215
 216test_expect_success 'submodule update --remote should fetch upstream changes' '
 217        (cd submodule &&
 218         echo line4 >> file &&
 219         git add file &&
 220         test_tick &&
 221         git commit -m "upstream line4"
 222        ) &&
 223        (cd super &&
 224         git submodule update --remote --force submodule &&
 225         cd submodule &&
 226         test "$(git log -1 --oneline)" = "$(GIT_DIR=../../submodule/.git git log -1 --oneline)"
 227        )
 228'
 229
 230test_expect_success 'submodule update --remote should fetch upstream changes with .' '
 231        (
 232                cd super &&
 233                git config -f .gitmodules submodule."submodule".branch "." &&
 234                git add .gitmodules &&
 235                git commit -m "submodules: update from the respective superproject branch"
 236        ) &&
 237        (
 238                cd submodule &&
 239                echo line4a >> file &&
 240                git add file &&
 241                test_tick &&
 242                git commit -m "upstream line4a" &&
 243                git checkout -b test-branch &&
 244                test_commit on-test-branch
 245        ) &&
 246        (
 247                cd super &&
 248                git submodule update --remote --force submodule &&
 249                git -C submodule log -1 --oneline >actual &&
 250                git -C ../submodule log -1 --oneline master >expect &&
 251                test_cmp expect actual &&
 252                git checkout -b test-branch &&
 253                git submodule update --remote --force submodule &&
 254                git -C submodule log -1 --oneline >actual &&
 255                git -C ../submodule log -1 --oneline test-branch >expect &&
 256                test_cmp expect actual &&
 257                git checkout master &&
 258                git branch -d test-branch &&
 259                git reset --hard HEAD^
 260        )
 261'
 262
 263test_expect_success 'local config should override .gitmodules branch' '
 264        (cd submodule &&
 265         git checkout test-branch &&
 266         echo line5 >> file &&
 267         git add file &&
 268         test_tick &&
 269         git commit -m "upstream line5" &&
 270         git checkout master
 271        ) &&
 272        (cd super &&
 273         git config submodule.submodule.branch test-branch &&
 274         git submodule update --remote --force submodule &&
 275         cd submodule &&
 276         test "$(git log -1 --oneline)" = "$(GIT_DIR=../../submodule/.git git log -1 --oneline test-branch)"
 277        )
 278'
 279
 280test_expect_success 'submodule update --rebase staying on master' '
 281        (cd super/submodule &&
 282          git checkout master
 283        ) &&
 284        (cd super &&
 285         (cd submodule &&
 286          compare_head
 287         ) &&
 288         git submodule update --rebase submodule &&
 289         cd submodule &&
 290         compare_head
 291        )
 292'
 293
 294test_expect_success 'submodule update --merge staying on master' '
 295        (cd super/submodule &&
 296          git reset --hard HEAD~1
 297        ) &&
 298        (cd super &&
 299         (cd submodule &&
 300          compare_head
 301         ) &&
 302         git submodule update --merge submodule &&
 303         cd submodule &&
 304         compare_head
 305        )
 306'
 307
 308test_expect_success 'submodule update - rebase in .git/config' '
 309        (cd super &&
 310         git config submodule.submodule.update rebase
 311        ) &&
 312        (cd super/submodule &&
 313          git reset --hard HEAD~1
 314        ) &&
 315        (cd super &&
 316         (cd submodule &&
 317          compare_head
 318         ) &&
 319         git submodule update submodule &&
 320         cd submodule &&
 321         compare_head
 322        )
 323'
 324
 325test_expect_success 'submodule update - checkout in .git/config but --rebase given' '
 326        (cd super &&
 327         git config submodule.submodule.update checkout
 328        ) &&
 329        (cd super/submodule &&
 330          git reset --hard HEAD~1
 331        ) &&
 332        (cd super &&
 333         (cd submodule &&
 334          compare_head
 335         ) &&
 336         git submodule update --rebase submodule &&
 337         cd submodule &&
 338         compare_head
 339        )
 340'
 341
 342test_expect_success 'submodule update - merge in .git/config' '
 343        (cd super &&
 344         git config submodule.submodule.update merge
 345        ) &&
 346        (cd super/submodule &&
 347          git reset --hard HEAD~1
 348        ) &&
 349        (cd super &&
 350         (cd submodule &&
 351          compare_head
 352         ) &&
 353         git submodule update submodule &&
 354         cd submodule &&
 355         compare_head
 356        )
 357'
 358
 359test_expect_success 'submodule update - checkout in .git/config but --merge given' '
 360        (cd super &&
 361         git config submodule.submodule.update checkout
 362        ) &&
 363        (cd super/submodule &&
 364          git reset --hard HEAD~1
 365        ) &&
 366        (cd super &&
 367         (cd submodule &&
 368          compare_head
 369         ) &&
 370         git submodule update --merge submodule &&
 371         cd submodule &&
 372         compare_head
 373        )
 374'
 375
 376test_expect_success 'submodule update - checkout in .git/config' '
 377        (cd super &&
 378         git config submodule.submodule.update checkout
 379        ) &&
 380        (cd super/submodule &&
 381          git reset --hard HEAD^
 382        ) &&
 383        (cd super &&
 384         (cd submodule &&
 385          compare_head
 386         ) &&
 387         git submodule update submodule &&
 388         cd submodule &&
 389         ! compare_head
 390        )
 391'
 392
 393test_expect_success 'submodule update - command in .git/config' '
 394        (cd super &&
 395         git config submodule.submodule.update "!git checkout"
 396        ) &&
 397        (cd super/submodule &&
 398          git reset --hard HEAD^
 399        ) &&
 400        (cd super &&
 401         (cd submodule &&
 402          compare_head
 403         ) &&
 404         git submodule update submodule &&
 405         cd submodule &&
 406         ! compare_head
 407        )
 408'
 409
 410test_expect_success 'submodule update - command in .gitmodules is ignored' '
 411        test_when_finished "git -C super reset --hard HEAD^" &&
 412        git -C super config -f .gitmodules submodule.submodule.update "!false" &&
 413        git -C super commit -a -m "add command to .gitmodules file" &&
 414        git -C super/submodule reset --hard $submodulesha1^ &&
 415        git -C super submodule update submodule
 416'
 417
 418cat << EOF >expect
 419Execution of 'false $submodulesha1' failed in submodule path 'submodule'
 420EOF
 421
 422test_expect_success 'submodule update - command in .git/config catches failure' '
 423        (cd super &&
 424         git config submodule.submodule.update "!false"
 425        ) &&
 426        (cd super/submodule &&
 427          git reset --hard $submodulesha1^
 428        ) &&
 429        (cd super &&
 430         test_must_fail git submodule update submodule 2>../actual
 431        ) &&
 432        test_i18ncmp actual expect
 433'
 434
 435cat << EOF >expect
 436Execution of 'false $submodulesha1' failed in submodule path '../submodule'
 437EOF
 438
 439test_expect_success 'submodule update - command in .git/config catches failure -- subdirectory' '
 440        (cd super &&
 441         git config submodule.submodule.update "!false"
 442        ) &&
 443        (cd super/submodule &&
 444          git reset --hard $submodulesha1^
 445        ) &&
 446        (cd super &&
 447         mkdir tmp && cd tmp &&
 448         test_must_fail git submodule update ../submodule 2>../../actual
 449        ) &&
 450        test_i18ncmp actual expect
 451'
 452
 453test_expect_success 'submodule update - command run for initial population of submodule' '
 454        cat >expect <<-EOF &&
 455        Execution of '\''false $submodulesha1'\'' failed in submodule path '\''submodule'\''
 456        EOF
 457        rm -rf super/submodule &&
 458        test_must_fail git -C super submodule update 2>actual &&
 459        test_i18ncmp expect actual &&
 460        git -C super submodule update --checkout
 461'
 462
 463cat << EOF >expect
 464Execution of 'false $submodulesha1' failed in submodule path '../super/submodule'
 465Failed to recurse into submodule path '../super'
 466EOF
 467
 468test_expect_success 'recursive submodule update - command in .git/config catches failure -- subdirectory' '
 469        (cd recursivesuper &&
 470         git submodule update --remote super &&
 471         git add super &&
 472         git commit -m "update to latest to have more than one commit in submodules"
 473        ) &&
 474        git -C recursivesuper/super config submodule.submodule.update "!false" &&
 475        git -C recursivesuper/super/submodule reset --hard $submodulesha1^ &&
 476        (cd recursivesuper &&
 477         mkdir -p tmp && cd tmp &&
 478         test_must_fail git submodule update --recursive ../super 2>../../actual
 479        ) &&
 480        test_i18ncmp actual expect
 481'
 482
 483test_expect_success 'submodule init does not copy command into .git/config' '
 484        (cd super &&
 485         git ls-files -s submodule >out &&
 486         H=$(cut -d" " -f2 out) &&
 487         mkdir submodule1 &&
 488         git update-index --add --cacheinfo 160000 $H submodule1 &&
 489         git config -f .gitmodules submodule.submodule1.path submodule1 &&
 490         git config -f .gitmodules submodule.submodule1.url ../submodule &&
 491         git config -f .gitmodules submodule.submodule1.update !false &&
 492         git submodule init submodule1 &&
 493         echo "none" >expect &&
 494         git config submodule.submodule1.update >actual &&
 495         test_cmp expect actual
 496        )
 497'
 498
 499test_expect_success 'submodule init picks up rebase' '
 500        (cd super &&
 501         git config -f .gitmodules submodule.rebasing.update rebase &&
 502         git submodule init rebasing &&
 503         test "rebase" = "$(git config submodule.rebasing.update)"
 504        )
 505'
 506
 507test_expect_success 'submodule init picks up merge' '
 508        (cd super &&
 509         git config -f .gitmodules submodule.merging.update merge &&
 510         git submodule init merging &&
 511         test "merge" = "$(git config submodule.merging.update)"
 512        )
 513'
 514
 515test_expect_success 'submodule update --merge  - ignores --merge  for new submodules' '
 516        test_config -C super submodule.submodule.update checkout &&
 517        (cd super &&
 518         rm -rf submodule &&
 519         git submodule update submodule &&
 520         git status -s submodule >expect &&
 521         rm -rf submodule &&
 522         git submodule update --merge submodule &&
 523         git status -s submodule >actual &&
 524         test_cmp expect actual
 525        )
 526'
 527
 528test_expect_success 'submodule update --rebase - ignores --rebase for new submodules' '
 529        test_config -C super submodule.submodule.update checkout &&
 530        (cd super &&
 531         rm -rf submodule &&
 532         git submodule update submodule &&
 533         git status -s submodule >expect &&
 534         rm -rf submodule &&
 535         git submodule update --rebase submodule &&
 536         git status -s submodule >actual &&
 537         test_cmp expect actual
 538        )
 539'
 540
 541test_expect_success 'submodule update ignores update=merge config for new submodules' '
 542        (cd super &&
 543         rm -rf submodule &&
 544         git submodule update submodule &&
 545         git status -s submodule >expect &&
 546         rm -rf submodule &&
 547         git config submodule.submodule.update merge &&
 548         git submodule update submodule &&
 549         git status -s submodule >actual &&
 550         git config --unset submodule.submodule.update &&
 551         test_cmp expect actual
 552        )
 553'
 554
 555test_expect_success 'submodule update ignores update=rebase config for new submodules' '
 556        (cd super &&
 557         rm -rf submodule &&
 558         git submodule update submodule &&
 559         git status -s submodule >expect &&
 560         rm -rf submodule &&
 561         git config submodule.submodule.update rebase &&
 562         git submodule update submodule &&
 563         git status -s submodule >actual &&
 564         git config --unset submodule.submodule.update &&
 565         test_cmp expect actual
 566        )
 567'
 568
 569test_expect_success 'submodule init picks up update=none' '
 570        (cd super &&
 571         git config -f .gitmodules submodule.none.update none &&
 572         git submodule init none &&
 573         test "none" = "$(git config submodule.none.update)"
 574        )
 575'
 576
 577test_expect_success 'submodule update - update=none in .git/config' '
 578        (cd super &&
 579         git config submodule.submodule.update none &&
 580         (cd submodule &&
 581          git checkout master &&
 582          compare_head
 583         ) &&
 584         git diff --name-only >out &&
 585         grep ^submodule$ out &&
 586         git submodule update &&
 587         git diff --name-only >out &&
 588         grep ^submodule$ out &&
 589         (cd submodule &&
 590          compare_head
 591         ) &&
 592         git config --unset submodule.submodule.update &&
 593         git submodule update submodule
 594        )
 595'
 596
 597test_expect_success 'submodule update - update=none in .git/config but --checkout given' '
 598        (cd super &&
 599         git config submodule.submodule.update none &&
 600         (cd submodule &&
 601          git checkout master &&
 602          compare_head
 603         ) &&
 604         git diff --name-only >out &&
 605         grep ^submodule$ out &&
 606         git submodule update --checkout &&
 607         git diff --name-only >out &&
 608         ! grep ^submodule$ out &&
 609         (cd submodule &&
 610          ! compare_head
 611         ) &&
 612         git config --unset submodule.submodule.update
 613        )
 614'
 615
 616test_expect_success 'submodule update --init skips submodule with update=none' '
 617        (cd super &&
 618         git add .gitmodules &&
 619         git commit -m ".gitmodules"
 620        ) &&
 621        git clone super cloned &&
 622        (cd cloned &&
 623         git submodule update --init &&
 624         test_path_exists submodule/.git &&
 625         test_path_is_missing none/.git
 626        )
 627'
 628
 629test_expect_success 'submodule update continues after checkout error' '
 630        (cd super &&
 631         git reset --hard HEAD &&
 632         git submodule add ../submodule submodule2 &&
 633         git submodule init &&
 634         git commit -am "new_submodule" &&
 635         (cd submodule2 &&
 636          git rev-parse --verify HEAD >../expect
 637         ) &&
 638         (cd submodule &&
 639          test_commit "update_submodule" file
 640         ) &&
 641         (cd submodule2 &&
 642          test_commit "update_submodule2" file
 643         ) &&
 644         git add submodule &&
 645         git add submodule2 &&
 646         git commit -m "two_new_submodule_commits" &&
 647         (cd submodule &&
 648          echo "" > file
 649         ) &&
 650         git checkout HEAD^ &&
 651         test_must_fail git submodule update &&
 652         (cd submodule2 &&
 653          git rev-parse --verify HEAD >../actual
 654         ) &&
 655         test_cmp expect actual
 656        )
 657'
 658test_expect_success 'submodule update continues after recursive checkout error' '
 659        (cd super &&
 660         git reset --hard HEAD &&
 661         git checkout master &&
 662         git submodule update &&
 663         (cd submodule &&
 664          git submodule add ../submodule subsubmodule &&
 665          git submodule init &&
 666          git commit -m "new_subsubmodule"
 667         ) &&
 668         git add submodule &&
 669         git commit -m "update_submodule" &&
 670         (cd submodule &&
 671          (cd subsubmodule &&
 672           test_commit "update_subsubmodule" file
 673          ) &&
 674          git add subsubmodule &&
 675          test_commit "update_submodule_again" file &&
 676          (cd subsubmodule &&
 677           test_commit "update_subsubmodule_again" file
 678          ) &&
 679          test_commit "update_submodule_again_again" file
 680         ) &&
 681         (cd submodule2 &&
 682          git rev-parse --verify HEAD >../expect &&
 683          test_commit "update_submodule2_again" file
 684         ) &&
 685         git add submodule &&
 686         git add submodule2 &&
 687         git commit -m "new_commits" &&
 688         git checkout HEAD^ &&
 689         (cd submodule &&
 690          git checkout HEAD^ &&
 691          (cd subsubmodule &&
 692           echo "" > file
 693          )
 694         ) &&
 695         test_must_fail git submodule update --recursive &&
 696         (cd submodule2 &&
 697          git rev-parse --verify HEAD >../actual
 698         ) &&
 699         test_cmp expect actual
 700        )
 701'
 702
 703test_expect_success 'submodule update exit immediately in case of merge conflict' '
 704        (cd super &&
 705         git checkout master &&
 706         git reset --hard HEAD &&
 707         (cd submodule &&
 708          (cd subsubmodule &&
 709           git reset --hard HEAD
 710          )
 711         ) &&
 712         git submodule update --recursive &&
 713         (cd submodule &&
 714          test_commit "update_submodule_2" file
 715         ) &&
 716         (cd submodule2 &&
 717          test_commit "update_submodule2_2" file
 718         ) &&
 719         git add submodule &&
 720         git add submodule2 &&
 721         git commit -m "two_new_submodule_commits" &&
 722         (cd submodule &&
 723          git checkout master &&
 724          test_commit "conflict" file &&
 725          echo "conflict" > file
 726         ) &&
 727         git checkout HEAD^ &&
 728         (cd submodule2 &&
 729          git rev-parse --verify HEAD >../expect
 730         ) &&
 731         git config submodule.submodule.update merge &&
 732         test_must_fail git submodule update &&
 733         (cd submodule2 &&
 734          git rev-parse --verify HEAD >../actual
 735         ) &&
 736         test_cmp expect actual
 737        )
 738'
 739
 740test_expect_success 'submodule update exit immediately after recursive rebase error' '
 741        (cd super &&
 742         git checkout master &&
 743         git reset --hard HEAD &&
 744         (cd submodule &&
 745          git reset --hard HEAD &&
 746          git submodule update --recursive
 747         ) &&
 748         (cd submodule &&
 749          test_commit "update_submodule_3" file
 750         ) &&
 751         (cd submodule2 &&
 752          test_commit "update_submodule2_3" file
 753         ) &&
 754         git add submodule &&
 755         git add submodule2 &&
 756         git commit -m "two_new_submodule_commits" &&
 757         (cd submodule &&
 758          git checkout master &&
 759          test_commit "conflict2" file &&
 760          echo "conflict" > file
 761         ) &&
 762         git checkout HEAD^ &&
 763         (cd submodule2 &&
 764          git rev-parse --verify HEAD >../expect
 765         ) &&
 766         git config submodule.submodule.update rebase &&
 767         test_must_fail git submodule update &&
 768         (cd submodule2 &&
 769          git rev-parse --verify HEAD >../actual
 770         ) &&
 771         test_cmp expect actual
 772        )
 773'
 774
 775test_expect_success 'add different submodules to the same path' '
 776        (cd super &&
 777         git submodule add ../submodule s1 &&
 778         test_must_fail git submodule add ../merging s1
 779        )
 780'
 781
 782test_expect_success 'submodule add places git-dir in superprojects git-dir' '
 783        (cd super &&
 784         mkdir deeper &&
 785         git submodule add ../submodule deeper/submodule &&
 786         (cd deeper/submodule &&
 787          git log > ../../expected
 788         ) &&
 789         (cd .git/modules/deeper/submodule &&
 790          git log > ../../../../actual
 791         ) &&
 792         test_cmp expected actual
 793        )
 794'
 795
 796test_expect_success 'submodule update places git-dir in superprojects git-dir' '
 797        (cd super &&
 798         git commit -m "added submodule"
 799        ) &&
 800        git clone super super2 &&
 801        (cd super2 &&
 802         git submodule init deeper/submodule &&
 803         git submodule update &&
 804         (cd deeper/submodule &&
 805          git log > ../../expected
 806         ) &&
 807         (cd .git/modules/deeper/submodule &&
 808          git log > ../../../../actual
 809         ) &&
 810         test_cmp expected actual
 811        )
 812'
 813
 814test_expect_success 'submodule add places git-dir in superprojects git-dir recursive' '
 815        (cd super2 &&
 816         (cd deeper/submodule &&
 817          git submodule add ../submodule subsubmodule &&
 818          (cd subsubmodule &&
 819           git log > ../../../expected
 820          ) &&
 821          git commit -m "added subsubmodule" &&
 822          git push origin :
 823         ) &&
 824         (cd .git/modules/deeper/submodule/modules/subsubmodule &&
 825          git log > ../../../../../actual
 826         ) &&
 827         git add deeper/submodule &&
 828         git commit -m "update submodule" &&
 829         git push origin : &&
 830         test_cmp expected actual
 831        )
 832'
 833
 834test_expect_success 'submodule update places git-dir in superprojects git-dir recursive' '
 835        mkdir super_update_r &&
 836        (cd super_update_r &&
 837         git init --bare
 838        ) &&
 839        mkdir subsuper_update_r &&
 840        (cd subsuper_update_r &&
 841         git init --bare
 842        ) &&
 843        mkdir subsubsuper_update_r &&
 844        (cd subsubsuper_update_r &&
 845         git init --bare
 846        ) &&
 847        git clone subsubsuper_update_r subsubsuper_update_r2 &&
 848        (cd subsubsuper_update_r2 &&
 849         test_commit "update_subsubsuper" file &&
 850         git push origin master
 851        ) &&
 852        git clone subsuper_update_r subsuper_update_r2 &&
 853        (cd subsuper_update_r2 &&
 854         test_commit "update_subsuper" file &&
 855         git submodule add ../subsubsuper_update_r subsubmodule &&
 856         git commit -am "subsubmodule" &&
 857         git push origin master
 858        ) &&
 859        git clone super_update_r super_update_r2 &&
 860        (cd super_update_r2 &&
 861         test_commit "update_super" file &&
 862         git submodule add ../subsuper_update_r submodule &&
 863         git commit -am "submodule" &&
 864         git push origin master
 865        ) &&
 866        rm -rf super_update_r2 &&
 867        git clone super_update_r super_update_r2 &&
 868        (cd super_update_r2 &&
 869         git submodule update --init --recursive >actual &&
 870         test_i18ngrep "Submodule path .submodule/subsubmodule.: checked out" actual &&
 871         (cd submodule/subsubmodule &&
 872          git log > ../../expected
 873         ) &&
 874         (cd .git/modules/submodule/modules/subsubmodule &&
 875          git log > ../../../../../actual
 876         ) &&
 877         test_cmp expected actual
 878        )
 879'
 880
 881test_expect_success 'submodule add properly re-creates deeper level submodules' '
 882        (cd super &&
 883         git reset --hard master &&
 884         rm -rf deeper/ &&
 885         git submodule add --force ../submodule deeper/submodule
 886        )
 887'
 888
 889test_expect_success 'submodule update properly revives a moved submodule' '
 890        (cd super &&
 891         H=$(git rev-parse --short HEAD) &&
 892         git commit -am "pre move" &&
 893         H2=$(git rev-parse --short HEAD) &&
 894         git status >out &&
 895         sed "s/$H/XXX/" out >expect &&
 896         H=$(cd submodule2 && git rev-parse HEAD) &&
 897         git rm --cached submodule2 &&
 898         rm -rf submodule2 &&
 899         mkdir -p "moved/sub module" &&
 900         git update-index --add --cacheinfo 160000 $H "moved/sub module" &&
 901         git config -f .gitmodules submodule.submodule2.path "moved/sub module" &&
 902         git commit -am "post move" &&
 903         git submodule update &&
 904         git status > out &&
 905         sed "s/$H2/XXX/" out >actual &&
 906         test_cmp expect actual
 907        )
 908'
 909
 910test_expect_success SYMLINKS 'submodule update can handle symbolic links in pwd' '
 911        mkdir -p linked/dir &&
 912        ln -s linked/dir linkto &&
 913        (cd linkto &&
 914         git clone "$TRASH_DIRECTORY"/super_update_r2 super &&
 915         (cd super &&
 916          git submodule update --init --recursive
 917         )
 918        )
 919'
 920
 921test_expect_success 'submodule update clone shallow submodule' '
 922        test_when_finished "rm -rf super3" &&
 923        first=$(git -C cloned rev-parse HEAD:submodule) &&
 924        second=$(git -C submodule rev-parse HEAD) &&
 925        commit_count=$(git -C submodule rev-list --count $first^..$second) &&
 926        git clone cloned super3 &&
 927        pwd=$(pwd) &&
 928        (
 929                cd super3 &&
 930                sed -e "s#url = ../#url = file://$pwd/#" <.gitmodules >.gitmodules.tmp &&
 931                mv -f .gitmodules.tmp .gitmodules &&
 932                git submodule update --init --depth=$commit_count &&
 933                git -C submodule log --oneline >out &&
 934                test_line_count = 1 out
 935        )
 936'
 937
 938test_expect_success 'submodule update clone shallow submodule outside of depth' '
 939        test_when_finished "rm -rf super3" &&
 940        git clone cloned super3 &&
 941        pwd=$(pwd) &&
 942        (
 943                cd super3 &&
 944                sed -e "s#url = ../#url = file://$pwd/#" <.gitmodules >.gitmodules.tmp &&
 945                mv -f .gitmodules.tmp .gitmodules &&
 946                test_must_fail git submodule update --init --depth=1 2>actual &&
 947                test_i18ngrep "Direct fetching of that commit failed." actual &&
 948                git -C ../submodule config uploadpack.allowReachableSHA1InWant true &&
 949                git submodule update --init --depth=1 >actual &&
 950                git -C submodule log --oneline >out &&
 951                test_line_count = 1 out
 952        )
 953'
 954
 955test_expect_success 'submodule update --recursive drops module name before recursing' '
 956        (cd super2 &&
 957         (cd deeper/submodule/subsubmodule &&
 958          git checkout HEAD^
 959         ) &&
 960         git submodule update --recursive deeper/submodule >actual &&
 961         test_i18ngrep "Submodule path .deeper/submodule/subsubmodule.: checked out" actual
 962        )
 963'
 964
 965test_expect_success 'submodule update can be run in parallel' '
 966        (cd super2 &&
 967         GIT_TRACE=$(pwd)/trace.out git submodule update --jobs 7 &&
 968         grep "7 tasks" trace.out &&
 969         git config submodule.fetchJobs 8 &&
 970         GIT_TRACE=$(pwd)/trace.out git submodule update &&
 971         grep "8 tasks" trace.out &&
 972         GIT_TRACE=$(pwd)/trace.out git submodule update --jobs 9 &&
 973         grep "9 tasks" trace.out
 974        )
 975'
 976
 977test_expect_success 'git clone passes the parallel jobs config on to submodules' '
 978        test_when_finished "rm -rf super4" &&
 979        GIT_TRACE=$(pwd)/trace.out git clone --recurse-submodules --jobs 7 . super4 &&
 980        grep "7 tasks" trace.out &&
 981        rm -rf super4 &&
 982        git config --global submodule.fetchJobs 8 &&
 983        GIT_TRACE=$(pwd)/trace.out git clone --recurse-submodules . super4 &&
 984        grep "8 tasks" trace.out &&
 985        rm -rf super4 &&
 986        GIT_TRACE=$(pwd)/trace.out git clone --recurse-submodules --jobs 9 . super4 &&
 987        grep "9 tasks" trace.out &&
 988        rm -rf super4
 989'
 990
 991test_done