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>
			
			
				maint
			
			
		
							parent
							
								
									a7eff1a87a
								
							
						
					
					
						commit
						98dbe63dbc
					
				|  | @ -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 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue
	
	 Kevin Ballard
						Kevin Ballard