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

[PATCHv3 1/2] submodule: preserve all arguments exactly when recursing

From
Kevin Ballard <kevin@sb.org>
Date
Nov 3, 2010, 06:26 UTC
Message-ID
<1288765585-80823-1-git-send-email-kevin@sb.org>
In-Reply-To
<20101103053827.GD10631@burratino>

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>
---
This version introduces a test using --reference.
It also uses the nice description written by Jonathan
and it stops unnecessarily quoting the results of
the call to $(git rev-parse --sq-quote "$@")
 git-submodule.sh             |    8 ++++----
 t/t7407-submodule-foreach.sh |   16 ++++++++++++++++
 2 files changed, 20 insertions(+), 4 deletions(-)
diff --git a/git-submodule.sh b/git-submodule.sh
index 9ebbab7..4d2bb37 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -374,7 +374,7 @@ cmd_init()
 cmd_update()
 {
 	# parse $args after "submodule ... update".
-	orig_args="$@"
+	orig_args=$(git rev-parse --sq-quote "$@")
 	while test $# -ne 0
 	do
 		case "$1" in
@@ -500,7 +500,7 @@ cmd_update()
 
 		if test -n "$recursive"
 		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'"
 		fi
 	done
@@ -733,7 +733,7 @@ cmd_summary() {
 cmd_status()
 {
 	# parse $args after "submodule ... status".
-	orig_args="$@"
+	orig_args=$(git rev-parse --sq-quote "$@")
 	while test $# -ne 0
 	do
 		case "$1" in
@@ -790,7 +790,7 @@ cmd_status()
 				prefix="$displaypath/"
 				clear_local_git_env
 				cd "$path" &&
-				cmd_status $orig_args
+				eval cmd_status "$orig_args"
 			) ||
 			die "Failed to recurse into submodule path '$path'"
 		fi
diff --git a/t/t7407-submodule-foreach.sh b/t/t7407-submodule-foreach.sh
index 905a8ba..15d420f 100755
--- a/t/t7407-submodule-foreach.sh
+++ b/t/t7407-submodule-foreach.sh
@@ -238,4 +238,20 @@ test_expect_success 'use "git clone --recursive" to checkout all submodules' '
 	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
-- 
1.7.3.2.200.g862e8
Previous: Kevin BallardNext: Kevin Ballard
Message 11 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.