Merge branch 'jk/maint-gitweb-xss'
[gitweb.git] / t / t7403-submodule-sync.sh
index 3620215c1f84b8e184b470c92b9a01c15fd75dc2..94e26c47eae37062ca0d7d24d30104fb46d06743 100755 (executable)
@@ -17,16 +17,25 @@ test_expect_success setup '
        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 super &&
         git submodule add ../submodule submodule &&
         test_tick &&
         git commit -m "submodule"
        ) &&
        git clone super super-clone &&
-       (cd super-clone && git submodule update --init) &&
+       (cd super-clone && git submodule update --init --recursive) &&
        git clone super empty-clone &&
        (cd empty-clone && git submodule init) &&
-       git clone super top-only-clone
+       git clone super top-only-clone &&
+       git clone super relative-clone &&
+       (cd relative-clone && git submodule update --init --recursive) &&
+       git clone super recursive-clone &&
+       (cd recursive-clone && git submodule update --init --recursive)
 '
 
 test_expect_success 'change submodule' '
@@ -44,6 +53,11 @@ test_expect_success 'change submodule url' '
         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 super &&
         git config -f .gitmodules submodule.submodule.url ../moved-submodule &&
         test_tick &&
@@ -59,6 +73,9 @@ test_expect_success '"git submodule sync" should update submodule URLs' '
        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
@@ -68,6 +85,25 @@ test_expect_success '"git submodule sync" should update submodule URLs' '
        )
 '
 
+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
+       ) &&
+       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 '"git submodule sync" should update known submodule URLs' '
        (cd empty-clone &&
         git pull &&
@@ -86,4 +122,107 @@ test_expect_success '"git submodule sync" should not vivify uninteresting submod
        )
 '
 
+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"
+       )
+       )
+'
+
+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"
+       )
+       )
+'
+
+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"
+       )
+       )
+'
+
+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"
+       )
+       )
+'
+
+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"
+       )
+       )
+'
+
+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"
+       )
+       )
+'
+
+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"
+       )
+       )
+'
+
+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"
+       )
+       )
+'
+
+
 test_done