Merge branch 'ph/submodule-sync-recursive'
authorJunio C Hamano <gitster@pobox.com>
Thu, 15 Nov 2012 18:24:01 +0000 (10:24 -0800)
committerJunio C Hamano <gitster@pobox.com>
Thu, 15 Nov 2012 18:24:01 +0000 (10:24 -0800)
Adds "--recursive" option to submodule sync.

* ph/submodule-sync-recursive:
Add tests for submodule sync --recursive
Teach --recursive to submodule sync

git-submodule.sh
t/t7403-submodule-sync.sh
index 819eb5674a9a7c0db3d03de76a461e3787f51193..0522c3871a55d50cdada04c92db8d4bd87120df7 100755 (executable)
@@ -11,7 +11,7 @@ USAGE="[--quiet] add [-b branch] [-f|--force] [--name <name>] [--reference <repo
    or: $dashless [--quiet] update [--init] [-N|--no-fetch] [-f|--force] [--rebase] [--reference <repository>] [--merge] [--recursive] [--] [<path>...]
    or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
    or: $dashless [--quiet] foreach [--recursive] <command>
-   or: $dashless [--quiet] sync [--] [<path>...]"
+   or: $dashless [--quiet] sync [--recursive] [--] [<path>...]"
 OPTIONS_SPEC=
 . git-sh-setup
 . git-sh-i18n
@@ -1032,6 +1032,10 @@ cmd_sync()
                        GIT_QUIET=1
                        shift
                        ;;
+               --recursive)
+                       recursive=1
+                       shift
+                       ;;
                --)
                        shift
                        break
@@ -1073,7 +1077,7 @@ cmd_sync()
 
                if git config "submodule.$name.url" >/dev/null 2>/dev/null
                then
-                       say "$(eval_gettext "Synchronizing submodule url for '\$name'")"
+                       say "$(eval_gettext "Synchronizing submodule url for '\$prefix\$sm_path'")"
                        git config submodule."$name".url "$super_config_url"
 
                        if test -e "$sm_path"/.git
@@ -1083,6 +1087,12 @@ cmd_sync()
                                cd "$sm_path"
                                remote=$(get_default_remote)
                                git config remote."$remote".url "$sub_origin_url"
+
+                               if test -n "$recursive"
+                               then
+                                       prefix="$prefix$sm_path/"
+                                       eval cmd_sync
+                               fi
                        )
                        fi
                fi
index 524d5c1b21a507c5ed16edc52fb9353792b83f28..94e26c47eae37062ca0d7d24d30104fb46d06743 100755 (executable)
@@ -17,18 +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 relative-clone &&
-       (cd relative-clone && git submodule update --init)
+       (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' '
@@ -46,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 &&
@@ -61,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
@@ -70,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 &&
@@ -107,6 +141,23 @@ test_expect_success '"git submodule sync" handles origin URL of the form foo/bar
         #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"
+       )
        )
 '