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 коммит произвёл Junio C Hamano
Родитель a7eff1a87a
Коммит 98dbe63dbc
2 изменённых файлов: 42 добавлений и 11 удалений

Просмотреть файл

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

Просмотреть файл

@ -226,6 +226,21 @@ test_expect_success 'test "status --recursive"' '
test_cmp expect actual 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' ' test_expect_success 'use "git clone --recursive" to checkout all submodules' '
git clone --recursive super clone4 && git clone --recursive super clone4 &&
test -d clone4/.git && 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 test_done