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>
This commit is contained in:
parent
c3fced6498
commit
a7eff1a87a
@ -374,7 +374,7 @@ cmd_init()
|
|||||||
cmd_update()
|
cmd_update()
|
||||||
{
|
{
|
||||||
# parse $args after "submodule ... update".
|
# parse $args after "submodule ... update".
|
||||||
orig_args="$@"
|
orig_args=$(git rev-parse --sq-quote "$@")
|
||||||
while test $# -ne 0
|
while test $# -ne 0
|
||||||
do
|
do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
@ -500,7 +500,7 @@ cmd_update()
|
|||||||
|
|
||||||
if test -n "$recursive"
|
if test -n "$recursive"
|
||||||
then
|
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'"
|
die "Failed to recurse into submodule path '$path'"
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
@ -733,7 +733,7 @@ cmd_summary() {
|
|||||||
cmd_status()
|
cmd_status()
|
||||||
{
|
{
|
||||||
# parse $args after "submodule ... status".
|
# parse $args after "submodule ... status".
|
||||||
orig_args="$@"
|
orig_args=$(git rev-parse --sq-quote "$@")
|
||||||
while test $# -ne 0
|
while test $# -ne 0
|
||||||
do
|
do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
@ -790,7 +790,7 @@ cmd_status()
|
|||||||
prefix="$displaypath/"
|
prefix="$displaypath/"
|
||||||
clear_local_git_env
|
clear_local_git_env
|
||||||
cd "$path" &&
|
cd "$path" &&
|
||||||
cmd_status $orig_args
|
eval cmd_status "$orig_args"
|
||||||
) ||
|
) ||
|
||||||
die "Failed to recurse into submodule path '$path'"
|
die "Failed to recurse into submodule path '$path'"
|
||||||
fi
|
fi
|
||||||
|
@ -238,4 +238,20 @@ test_expect_success 'use "git clone --recursive" to checkout all submodules' '
|
|||||||
test -d clone4/nested1/nested2/nested3/submodule/.git
|
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
|
test_done
|
||||||
|
Loading…
x
Reference in New Issue
Block a user