t3030-merge-recursive: test known breakage with empty work tree
[gitweb.git] / t / t7403-submodule-sync.sh
index 94e26c47eae37062ca0d7d24d30104fb46d06743..79bc135bf69ea5813f0a372db6bbefa0f9a92753 100755 (executable)
@@ -11,216 +11,338 @@ These tests exercise the "git submodule sync" subcommand.
 . ./test-lib.sh
 
 test_expect_success setup '
-       echo file > file &&
+       echo file >file &&
        git add file &&
        test_tick &&
        git commit -m upstream &&
        git clone . super &&
        git clone super submodule &&
-       (cd submodule &&
-        git submodule add ../submodule sub-submodule &&
-        test_tick &&
-        git commit -m "sub-submodule"
+       (
+               cd submodule &&
+               git submodule add ../submodule sub-submodule &&
+               test_tick &&
+               git commit -m "sub-submodule"
        ) &&
-       (cd super &&
-        git submodule add ../submodule submodule &&
-        test_tick &&
-        git commit -m "submodule"
+       (
+               cd super &&
+               git submodule add ../submodule submodule &&
+               test_tick &&
+               git commit -m "submodule"
        ) &&
        git clone super super-clone &&
-       (cd super-clone && git submodule update --init --recursive) &&
+       (
+               cd super-clone &&
+               git submodule update --init --recursive
+       ) &&
        git clone super empty-clone &&
-       (cd empty-clone && git submodule init) &&
+       (
+               cd empty-clone &&
+               git submodule init
+       ) &&
        git clone super top-only-clone &&
        git clone super relative-clone &&
-       (cd relative-clone && git submodule update --init --recursive) &&
+       (
+               cd relative-clone &&
+               git submodule update --init --recursive
+       ) &&
        git clone super recursive-clone &&
-       (cd recursive-clone && git submodule update --init --recursive)
+       (
+               cd recursive-clone &&
+               git submodule update --init --recursive
+       )
 '
 
 test_expect_success 'change submodule' '
-       (cd submodule &&
-        echo second line >> file &&
-        test_tick &&
-        git commit -a -m "change submodule"
+       (
+               cd submodule &&
+               echo second line >>file &&
+               test_tick &&
+               git commit -a -m "change submodule"
        )
 '
 
+reset_submodule_urls () {
+       local root
+       root=$(pwd) &&
+       (
+               cd super-clone/submodule &&
+               git config remote.origin.url "$root/submodule"
+       ) &&
+       (
+               cd super-clone/submodule/sub-submodule &&
+               git config remote.origin.url "$root/submodule"
+       )
+}
+
 test_expect_success 'change submodule url' '
-       (cd super &&
-        cd submodule &&
-        git checkout master &&
-        git pull
+       (
+               cd super &&
+               cd submodule &&
+               git checkout master &&
+               git pull
        ) &&
        mv submodule moved-submodule &&
-       (cd moved-submodule &&
-        git config -f .gitmodules submodule.sub-submodule.url ../moved-submodule &&
-        test_tick &&
-        git commit -a -m moved-sub-submodule
+       (
+               cd moved-submodule &&
+               git config -f .gitmodules submodule.sub-submodule.url ../moved-submodule &&
+               test_tick &&
+               git commit -a -m moved-sub-submodule
        ) &&
-       (cd super &&
-        git config -f .gitmodules submodule.submodule.url ../moved-submodule &&
-        test_tick &&
-        git commit -a -m moved-submodule
+       (
+               cd super &&
+               git config -f .gitmodules submodule.submodule.url ../moved-submodule &&
+               test_tick &&
+               git commit -a -m moved-submodule
        )
 '
 
 test_expect_success '"git submodule sync" should update submodule URLs' '
-       (cd super-clone &&
-        git pull --no-recurse-submodules &&
-        git submodule sync
+       (
+               cd super-clone &&
+               git pull --no-recurse-submodules &&
+               git submodule sync
        ) &&
-       test -d "$(cd super-clone/submodule &&
-        git config remote.origin.url
+       test -d "$(
+               cd super-clone/submodule &&
+               git config remote.origin.url
        )" &&
-       test ! -d "$(cd super-clone/submodule/sub-submodule &&
-        git config remote.origin.url
+       test ! -d "$(
+               cd super-clone/submodule/sub-submodule &&
+               git config remote.origin.url
        )" &&
-       (cd super-clone/submodule &&
-        git checkout master &&
-        git pull
+       (
+               cd super-clone/submodule &&
+               git checkout master &&
+               git pull
        ) &&
-       (cd super-clone &&
-        test -d "$(git config submodule.submodule.url)"
+       (
+               cd super-clone &&
+               test -d "$(git config submodule.submodule.url)"
        )
 '
 
 test_expect_success '"git submodule sync --recursive" should update all submodule URLs' '
-       (cd super-clone &&
-        (cd submodule &&
-         git pull --no-recurse-submodules
-        ) &&
-        git submodule sync --recursive
+       (
+               cd super-clone &&
+               (
+                       cd submodule &&
+                       git pull --no-recurse-submodules
+               ) &&
+               git submodule sync --recursive
+       ) &&
+       test -d "$(
+               cd super-clone/submodule &&
+               git config remote.origin.url
+       )" &&
+       test -d "$(
+               cd super-clone/submodule/sub-submodule &&
+               git config remote.origin.url
+       )" &&
+       (
+               cd super-clone/submodule/sub-submodule &&
+               git checkout master &&
+               git pull
+       )
+'
+
+test_expect_success 'reset submodule URLs' '
+       reset_submodule_urls super-clone
+'
+
+test_expect_success '"git submodule sync" should update submodule URLs - subdirectory' '
+       (
+               cd super-clone &&
+               git pull --no-recurse-submodules &&
+               mkdir -p sub &&
+               cd sub &&
+               git submodule sync >../../output
+       ) &&
+       grep "\\.\\./submodule" output &&
+       test -d "$(
+               cd super-clone/submodule &&
+               git config remote.origin.url
+       )" &&
+       test ! -d "$(
+               cd super-clone/submodule/sub-submodule &&
+               git config remote.origin.url
+       )" &&
+       (
+               cd super-clone/submodule &&
+               git checkout master &&
+               git pull
+       ) &&
+       (
+               cd super-clone &&
+               test -d "$(git config submodule.submodule.url)"
+       )
+'
+
+test_expect_success '"git submodule sync --recursive" should update all submodule URLs - subdirectory' '
+       (
+               cd super-clone &&
+               (
+                       cd submodule &&
+                       git pull --no-recurse-submodules
+               ) &&
+               mkdir -p sub &&
+               cd sub &&
+               git submodule sync --recursive >../../output
        ) &&
-       test -d "$(cd super-clone/submodule &&
-        git config remote.origin.url
+       grep "\\.\\./submodule/sub-submodule" output &&
+       test -d "$(
+               cd super-clone/submodule &&
+               git config remote.origin.url
        )" &&
-       test -d "$(cd super-clone/submodule/sub-submodule &&
-        git config remote.origin.url
+       test -d "$(
+               cd super-clone/submodule/sub-submodule &&
+               git config remote.origin.url
        )" &&
-       (cd super-clone/submodule/sub-submodule &&
-        git checkout master &&
-        git pull
+       (
+               cd super-clone/submodule/sub-submodule &&
+               git checkout master &&
+               git pull
        )
 '
 
 test_expect_success '"git submodule sync" should update known submodule URLs' '
-       (cd empty-clone &&
-        git pull &&
-        git submodule sync &&
-        test -d "$(git config submodule.submodule.url)"
+       (
+               cd empty-clone &&
+               git pull &&
+               git submodule sync &&
+               test -d "$(git config submodule.submodule.url)"
        )
 '
 
 test_expect_success '"git submodule sync" should not vivify uninteresting submodule' '
-       (cd top-only-clone &&
-        git pull &&
-        git submodule sync &&
-        test -z "$(git config submodule.submodule.url)" &&
-        git submodule sync submodule &&
-        test -z "$(git config submodule.submodule.url)"
+       (
+               cd top-only-clone &&
+               git pull &&
+               git submodule sync &&
+               test -z "$(git config submodule.submodule.url)" &&
+               git submodule sync submodule &&
+               test -z "$(git config submodule.submodule.url)"
        )
 '
 
 test_expect_success '"git submodule sync" handles origin URL of the form foo' '
-       (cd relative-clone &&
-        git remote set-url origin foo &&
-        git submodule sync &&
-       (cd submodule &&
-        #actual fails with: "cannot strip off url foo
-        test "$(git config remote.origin.url)" = "../submodule"
-       )
+       (
+               cd relative-clone &&
+               git remote set-url origin foo &&
+               git submodule sync &&
+               (
+                       cd submodule &&
+                       #actual fails with: "cannot strip off url foo
+                       test "$(git config remote.origin.url)" = "../submodule"
+               )
        )
 '
 
 test_expect_success '"git submodule sync" handles origin URL of the form foo/bar' '
-       (cd relative-clone &&
-        git remote set-url origin foo/bar &&
-        git submodule sync &&
-       (cd submodule &&
-        #actual foo/submodule
-        test "$(git config remote.origin.url)" = "../foo/submodule"
-       )
-       (cd submodule/sub-submodule &&
-        test "$(git config remote.origin.url)" != "../../foo/submodule"
-       )
+       (
+               cd relative-clone &&
+               git remote set-url origin foo/bar &&
+               git submodule sync &&
+               (
+                       cd submodule &&
+                       #actual foo/submodule
+                       test "$(git config remote.origin.url)" = "../foo/submodule"
+               ) &&
+               (
+                       cd submodule/sub-submodule &&
+                       test "$(git config remote.origin.url)" != "../../foo/submodule"
+               )
        )
 '
 
 test_expect_success '"git submodule sync --recursive" propagates changes in origin' '
-       (cd recursive-clone &&
-        git remote set-url origin foo/bar &&
-        git submodule sync --recursive &&
-       (cd submodule &&
-        #actual foo/submodule
-        test "$(git config remote.origin.url)" = "../foo/submodule"
-       )
-       (cd submodule/sub-submodule &&
-        test "$(git config remote.origin.url)" = "../../foo/submodule"
-       )
+       (
+               cd recursive-clone &&
+               git remote set-url origin foo/bar &&
+               git submodule sync --recursive &&
+               (
+                       cd submodule &&
+                       #actual foo/submodule
+                       test "$(git config remote.origin.url)" = "../foo/submodule"
+               ) &&
+               (
+                       cd submodule/sub-submodule &&
+                       test "$(git config remote.origin.url)" = "../../foo/submodule"
+               )
        )
 '
 
 test_expect_success '"git submodule sync" handles origin URL of the form ./foo' '
-       (cd relative-clone &&
-        git remote set-url origin ./foo &&
-        git submodule sync &&
-       (cd submodule &&
-        #actual ./submodule
-        test "$(git config remote.origin.url)" = "../submodule"
-       )
+       (
+               cd relative-clone &&
+               git remote set-url origin ./foo &&
+               git submodule sync &&
+               (
+                       cd submodule &&
+                       #actual ./submodule
+                       test "$(git config remote.origin.url)" = "../submodule"
+               )
        )
 '
 
 test_expect_success '"git submodule sync" handles origin URL of the form ./foo/bar' '
-       (cd relative-clone &&
-        git remote set-url origin ./foo/bar &&
-        git submodule sync &&
-       (cd submodule &&
-        #actual ./foo/submodule
-        test "$(git config remote.origin.url)" = "../foo/submodule"
-       )
+       (
+               cd relative-clone &&
+               git remote set-url origin ./foo/bar &&
+               git submodule sync &&
+               (
+                       cd submodule &&
+                       #actual ./foo/submodule
+                       test "$(git config remote.origin.url)" = "../foo/submodule"
+               )
        )
 '
 
 test_expect_success '"git submodule sync" handles origin URL of the form ../foo' '
-       (cd relative-clone &&
-        git remote set-url origin ../foo &&
-        git submodule sync &&
-       (cd submodule &&
-        #actual ../submodule
-        test "$(git config remote.origin.url)" = "../../submodule"
-       )
+       (
+               cd relative-clone &&
+               git remote set-url origin ../foo &&
+               git submodule sync &&
+               (
+                       cd submodule &&
+                       #actual ../submodule
+                       test "$(git config remote.origin.url)" = "../../submodule"
+               )
        )
 '
 
 test_expect_success '"git submodule sync" handles origin URL of the form ../foo/bar' '
-       (cd relative-clone &&
-        git remote set-url origin ../foo/bar &&
-        git submodule sync &&
-       (cd submodule &&
-        #actual ../foo/submodule
-        test "$(git config remote.origin.url)" = "../../foo/submodule"
-       )
+       (
+               cd relative-clone &&
+               git remote set-url origin ../foo/bar &&
+               git submodule sync &&
+               (
+                       cd submodule &&
+                       #actual ../foo/submodule
+                       test "$(git config remote.origin.url)" = "../../foo/submodule"
+               )
        )
 '
 
 test_expect_success '"git submodule sync" handles origin URL of the form ../foo/bar with deeply nested submodule' '
-       (cd relative-clone &&
-        git remote set-url origin ../foo/bar &&
-        mkdir -p a/b/c &&
-        ( cd a/b/c &&
-          git init &&
-          :> .gitignore &&
-          git add .gitignore &&
-          test_tick &&
-          git commit -m "initial commit" ) &&
-        git submodule add ../bar/a/b/c ./a/b/c &&
-        git submodule sync &&
-       (cd a/b/c &&
-        #actual ../foo/bar/a/b/c
-        test "$(git config remote.origin.url)" = "../../../../foo/bar/a/b/c"
-       )
+       (
+               cd relative-clone &&
+               git remote set-url origin ../foo/bar &&
+               mkdir -p a/b/c &&
+               (
+                       cd a/b/c &&
+                       git init &&
+                       >.gitignore &&
+                       git add .gitignore &&
+                       test_tick &&
+                       git commit -m "initial commit"
+               ) &&
+               git submodule add ../bar/a/b/c ./a/b/c &&
+               git submodule sync &&
+               (
+                       cd a/b/c &&
+                       #actual ../foo/bar/a/b/c
+                       test "$(git config remote.origin.url)" = "../../../../foo/bar/a/b/c"
+               )
        )
 '