Skip to content

Commit

Permalink
submodule: only preserve flags across recursive status/update invocat…
Browse files Browse the repository at this point in the history
…ions

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>
  • Loading branch information
Kevin Ballard authored and Junio C Hamano committed Nov 3, 2010
1 parent a7eff1a commit 98dbe63
Show file tree
Hide file tree
Showing 2 changed files with 42 additions and 11 deletions.
19 changes: 8 additions & 11 deletions git-submodule.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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
;;
--)
Expand All @@ -422,6 +416,8 @@ cmd_update()
break
;;
esac
orig_flags="$orig_flags $(git rev-parse --sq-quote "$1")"
shift
done

if test -n "$init"
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -757,6 +753,7 @@ cmd_status()
break
;;
esac
orig_flags="$orig_flags $(git rev-parse --sq-quote "$1")"
shift
done

Expand Down
34 changes: 34 additions & 0 deletions t/t7407-submodule-foreach.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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 &&
Expand Down Expand Up @@ -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

0 comments on commit 98dbe63

Please sign in to comment.