aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKevin Ballard <kevin@sb.org>2010-11-02 23:26:24 -0700
committerJunio C Hamano <gitster@pobox.com>2010-11-03 12:51:26 -0700
commita7eff1a87ad8cdcb93f60efc7969042bc3e669ee (patch)
tree1bb9d58f3560f299dc179b2508d47c6baee80d6d
parentc3fced64981e3d2700d83c0a6661ac347df5121e (diff)
downloadgit-a7eff1a87ad8cdcb93f60efc7969042bc3e669ee.tar.gz
git-a7eff1a87ad8cdcb93f60efc7969042bc3e669ee.tar.xz
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 <jrnieder@gmail.com> Signed-off-by: Kevin Ballard <kevin@sb.org> Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rwxr-xr-xgit-submodule.sh8
-rwxr-xr-xt/t7407-submodule-foreach.sh16
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