submodule: only preserve flags across recursive status/update invocations

Recursive invocations of submodule update/status preserve all arguments,
so executing

        git submodule update --recursive -- foo

attempts to recursively update a submodule named "foo".

Naturally, this fails as one cannot have an infinitely-deep stack of
submodules each containing a submodule named "foo". The desired behavior
is instead to update foo and then recursively update all submodules
inside of foo.

This commit accomplishes that by only saving the flags for use in the
recursive invocation.

Signed-off-by: Kevin Ballard <kevin@sb.org>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Kevin Ballard 2010-11-02 23:26:25 -07:00 committed by Junio C Hamano
parent a7eff1a87a
commit 98dbe63dbc
2 changed files with 42 additions and 11 deletions

View file

@ -374,41 +374,35 @@ cmd_init()
cmd_update()
{
# parse $args after "submodule ... update".
orig_args=$(git rev-parse --sq-quote "$@")
orig_flags=
while test $# -ne 0
do
case "$1" in
-q|--quiet)
shift
GIT_QUIET=1
;;
-i|--init)
init=1
shift
;;
-N|--no-fetch)
shift
nofetch=1
;;
-r|--rebase)
shift
update="rebase"
;;
--reference)
case "$2" in '') usage ;; esac
reference="--reference=$2"
shift 2
orig_flags="$orig_flags $(git rev-parse --sq-quote "$1")"
shift
;;
--reference=*)
reference="$1"
shift
;;
-m|--merge)
shift
update="merge"
;;
--recursive)
shift
recursive=1
;;
--)
@ -422,6 +416,8 @@ cmd_update()
break
;;
esac
orig_flags="$orig_flags $(git rev-parse --sq-quote "$1")"
shift
done
if test -n "$init"
@ -500,7 +496,7 @@ cmd_update()
if test -n "$recursive"
then
(clear_local_git_env; cd "$path" && eval cmd_update "$orig_args") ||
(clear_local_git_env; cd "$path" && eval cmd_update "$orig_flags") ||
die "Failed to recurse into submodule path '$path'"
fi
done
@ -733,7 +729,7 @@ cmd_summary() {
cmd_status()
{
# parse $args after "submodule ... status".
orig_args=$(git rev-parse --sq-quote "$@")
orig_flags=
while test $# -ne 0
do
case "$1" in
@ -757,6 +753,7 @@ cmd_status()
break
;;
esac
orig_flags="$orig_flags $(git rev-parse --sq-quote "$1")"
shift
done

View file

@ -226,6 +226,21 @@ test_expect_success 'test "status --recursive"' '
test_cmp expect actual
'
sed -e "/nested1 /s/.*/+$nested1sha1 nested1 (file2~1)/;/sub[1-3]/d" < expect > expect2
mv -f expect2 expect
test_expect_success 'ensure "status --cached --recursive" preserves the --cached flag' '
(
cd clone3 &&
(
cd nested1 &&
test_commit file2
) &&
git submodule status --cached --recursive -- nested1 > ../actual
) &&
test_cmp expect actual
'
test_expect_success 'use "git clone --recursive" to checkout all submodules' '
git clone --recursive super clone4 &&
test -d clone4/.git &&
@ -254,4 +269,23 @@ test_expect_success 'test "update --recursive" with a flag with spaces' '
)
'
test_expect_success 'use "update --recursive nested1" to checkout all submodules rooted in nested1' '
git clone super clone6 &&
(
cd clone6 &&
test ! -d sub1/.git &&
test ! -d sub2/.git &&
test ! -d sub3/.git &&
test ! -d nested1/.git &&
git submodule update --init --recursive -- nested1 &&
test ! -d sub1/.git &&
test ! -d sub2/.git &&
test ! -d sub3/.git &&
test -d nested1/.git &&
test -d nested1/nested2/.git &&
test -d nested1/nested2/nested3/.git &&
test -d nested1/nested2/nested3/submodule/.git
)
'
test_done