Skip to content

Commit

Permalink
submodule: preserve all arguments exactly when recursing
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Kevin Ballard authored and Junio C Hamano committed Nov 3, 2010
1 parent c3fced6 commit a7eff1a
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 4 deletions.
8 changes: 4 additions & 4 deletions git-submodule.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
16 changes: 16 additions & 0 deletions t/t7407-submodule-foreach.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit a7eff1a

Please sign in to comment.