submodule: preserve all arguments exactly when recursing
authorKevin Ballard <kevin@sb.org>
Wed, 3 Nov 2010 06:26:24 +0000 (23:26 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 3 Nov 2010 19:51:26 +0000 (12:51 -0700)
Shell variables only hold strings, not lists of parameters,
so $orig_args after

        orig_args="$@"

fails to remember where each parameter starts and ends, if
some include whitespace.  So

        git submodule update \
                --reference='/var/lib/common objects.git' \
                --recursive --init

becomes

        git submodule update --reference=/var/lib/common \
                objects.git --recursive --init

in the inner repositories.  Use "git rev-parse --sq-quote" to
save parameters in quoted form ready for evaluation by the
shell, avoiding this problem.

Helped-By: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Kevin Ballard <kevin@sb.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
git-submodule.sh
t/t7407-submodule-foreach.sh

index 9ebbab798d21147fc019b6183cad0c462c9dafca..4d2bb37215c29015a147b9fe79c91446f1811cda 100755 (executable)
@@ -374,7 +374,7 @@ cmd_init()
 cmd_update()
 {
        # parse $args after "submodule ... update".
-       orig_args="$@"
+       orig_args=$(git rev-parse --sq-quote "$@")
        while test $# -ne 0
        do
                case "$1" in
@@ -500,7 +500,7 @@ cmd_update()
 
                if test -n "$recursive"
                then
-                       (clear_local_git_env; cd "$path" && cmd_update $orig_args) ||
+                       (clear_local_git_env; cd "$path" && eval cmd_update "$orig_args") ||
                        die "Failed to recurse into submodule path '$path'"
                fi
        done
@@ -733,7 +733,7 @@ cmd_summary() {
 cmd_status()
 {
        # parse $args after "submodule ... status".
-       orig_args="$@"
+       orig_args=$(git rev-parse --sq-quote "$@")
        while test $# -ne 0
        do
                case "$1" in
@@ -790,7 +790,7 @@ cmd_status()
                                prefix="$displaypath/"
                                clear_local_git_env
                                cd "$path" &&
-                               cmd_status $orig_args
+                               eval cmd_status "$orig_args"
                        ) ||
                        die "Failed to recurse into submodule path '$path'"
                fi
index 905a8baae9a03a4b47512bb3eb3e0f9ec84f5ca4..15d420fca62ff32ca99658b9aec0be8adb5ffbfd 100755 (executable)
@@ -238,4 +238,20 @@ test_expect_success 'use "git clone --recursive" to checkout all submodules' '
        test -d clone4/nested1/nested2/nested3/submodule/.git
 '
 
+test_expect_success 'test "update --recursive" with a flag with spaces' '
+       git clone super "common objects" &&
+       git clone super clone5 &&
+       (
+               cd clone5 &&
+               test ! -d nested1/.git &&
+               git submodule update --init --recursive --reference="$(dirname "$PWD")/common objects" &&
+               test -d nested1/.git &&
+               test -d nested1/nested2/.git &&
+               test -d nested1/nested2/nested3/.git &&
+               test -f nested1/.git/objects/info/alternates &&
+               test -f nested1/nested2/.git/objects/info/alternates &&
+               test -f nested1/nested2/nested3/.git/objects/info/alternates
+       )
+'
+
 test_done