From a7eff1a87ad8cdcb93f60efc7969042bc3e669ee Mon Sep 17 00:00:00 2001 From: Kevin Ballard Date: Tue, 2 Nov 2010 23:26:24 -0700 Subject: [PATCH] submodule: preserve all arguments exactly when recursing 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 Signed-off-by: Kevin Ballard Signed-off-by: Junio C Hamano --- git-submodule.sh | 8 ++++---- t/t7407-submodule-foreach.sh | 16 ++++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/git-submodule.sh b/git-submodule.sh index 9ebbab798..4d2bb3721 100755 --- a/git-submodule.sh +++ b/git-submodule.sh @@ -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 diff --git a/t/t7407-submodule-foreach.sh b/t/t7407-submodule-foreach.sh index 905a8baae..15d420fca 100755 --- a/t/t7407-submodule-foreach.sh +++ b/t/t7407-submodule-foreach.sh @@ -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 -- 2.30.2