git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCHv2 2/2] submodule: only preserve flags across recursive status/update invocations

From
Kevin Ballard <kevin@sb.org>
Date
Nov 3, 2010, 05:05 UTC
Message-ID
<1288760740-10075-2-git-send-email-kevin@sb.org>
In-Reply-To
<5BE96A08-B8AB-4041-ABF2-7095EB5DD585@sb.org>

Recursive invocations of submodule update/status preserve all arguments in the recursive invocation. This tends to cause undesired behavior when those arguments include the name of a submodule, as it tries to recurse into a nested submodule with the same name rather than recursing into all child submodules of the named submodule.

This commit changes the argument preservation to only preserve flags. When specifying a submodule name on the command-line, all child submodules of that named submodule will be recursed into correctly, and it will not attempt to recurse into a phantom nested submodule with the same name as its parent.

Signed-off-by: Kevin Ballard <kevin@sb.org>
---
I'm tempted to make this commit also omit the --reference flag in recursive
calls to cmd_update, as I don't believe it makes sense to use --reference
in conjunction with --recursive, but it may be a better idea to simply
produce an error if both flags are used together.
 git-submodule.sh             |   19 ++++++++-----------
 t/t7407-submodule-foreach.sh |   19 +++++++++++++++++++
 2 files changed, 27 insertions(+), 11 deletions(-)
diff --git a/git-submodule.sh b/git-submodule.sh
index 543554b..4fd8982 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -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
 
diff --git a/t/t7407-submodule-foreach.sh b/t/t7407-submodule-foreach.sh
index 905a8ba..2d5a855 100755
--- a/t/t7407-submodule-foreach.sh
+++ b/t/t7407-submodule-foreach.sh
@@ -238,4 +238,23 @@ test_expect_success 'use "git clone --recursive" to checkout all submodules' '
 	test -d clone4/nested1/nested2/nested3/submodule/.git
 '
 
+test_expect_success 'use "update --recursive nested1" to checkout all submodules rooted in nested1' '
+	git clone super clone5 &&
+	(
+		cd clone5 &&
+		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
-- 
1.7.3.2.200.g479de
Previous: Kevin BallardNext: Jonathan Nieder
Message 8 of 17 in “submodule: preserve all arguments exactly when recursing”
  1. 1/2 submodule: preserve all arguments exactly when recursingKevin Ballard, Nov 3, 2010
  2. 2/2 submodule: only preserve flags across recursive status/update invocationsKevin Ballard, Nov 3, 2010
  3. Jonathan NiederNov 3, 2010
  4. Kevin BallardNov 3, 2010
  5. 1/2 submodule: preserve all arguments exactly when recursingKevin Ballard, Nov 3, 2010
  6. Jonathan NiederNov 3, 2010
  7. Kevin BallardNov 3, 2010
  8. 2/2 submodule: only preserve flags across recursive status/update invocationsKevin Ballard, Nov 3, 2010
  9. Jonathan NiederNov 3, 2010
  10. Kevin BallardNov 3, 2010
  11. 1/2 submodule: preserve all arguments exactly when recursingKevin Ballard, Nov 3, 2010
  12. 2/2 submodule: only preserve flags across recursive status/update invocationsKevin Ballard, Nov 3, 2010
  13. Junio C HamanoNov 5, 2010
  14. Jonathan NiederNov 3, 2010
  15. Kevin BallardNov 3, 2010
  16. Jonathan NiederNov 3, 2010
  17. Kevin BallardNov 3, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.