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

[PATCH] Let submodule command exit with error status if path does not exist

From
Heiko Voigt <hvoigt@hvoigt.net>
Date
Aug 9, 2012, 20:03 UTC
Message-ID
<20120809200302.GA93203@book.hvoigt.net>
In-Reply-To
<1340872080.2103.92.camel@athena.dnet>

Previously the exit status of git submodule was zero for various subcommands even though the user specified an unknown path.

The reason behind that was that they all pipe the output of module_list into the while loop which then does the action on the paths specified by the commandline. Since piped commands are run in parallel the status code of module_list was swallowed.

We work around this by introducing a new function module_list_valid which is used to check the leftover commandline parameters passed to module_list.

Signed-off-by: Heiko Voigt <hvoigt@hvoigt.net>
---
 git-submodule.sh           | 19 ++++++++++++++++++-
 t/t7400-submodule-basic.sh | 26 ++++++++++++++++++++++----
 2 files changed, 40 insertions(+), 5 deletions(-)
diff --git a/git-submodule.sh b/git-submodule.sh
index aac575e..1fd21da 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -103,13 +103,21 @@ resolve_relative_url ()
 	echo "${is_relative:+${up_path}}${remoteurl#./}"
 }
 
+module_list_ls_files() {
+	git ls-files --error-unmatch --stage -- "$@"
+}
+
+module_list_valid() {
+	module_list_ls_files "$@" >/dev/null
+}
+
 #
 # Get submodule info for registered submodules
 # $@ = path to limit submodule list
 #
 module_list()
 {
-	git ls-files --error-unmatch --stage -- "$@" |
+	module_list_ls_files "$@" |
 	perl -e '
 	my %unmerged = ();
 	my ($null_sha1) = ("0" x 40);
@@ -434,6 +442,8 @@ cmd_init()
 		shift
 	done
 
+	module_list_valid "$@" || exit 1
+
 	module_list "$@" |
 	while read mode sha1 stage sm_path
 	do
@@ -532,6 +542,8 @@ cmd_update()
 		cmd_init "--" "$@" || return
 	fi
 
+	module_list_valid "$@" || exit 1
+
 	cloned_modules=
 	module_list "$@" | {
 	err=
@@ -929,6 +941,8 @@ cmd_status()
 		shift
 	done
 
+	module_list_valid "$@" || exit 1
+
 	module_list "$@" |
 	while read mode sha1 stage sm_path
 	do
@@ -996,6 +1010,9 @@ cmd_sync()
 			;;
 		esac
 	done
+
+	module_list_valid "$@" || exit 1
+
 	cd_to_toplevel
 	module_list "$@" |
 	while read mode sha1 stage sm_path
diff --git a/t/t7400-submodule-basic.sh b/t/t7400-submodule-basic.sh
index c73bec9..3a40334 100755
--- a/t/t7400-submodule-basic.sh
+++ b/t/t7400-submodule-basic.sh
@@ -258,6 +258,27 @@ test_expect_success 'init should register submodule url in .git/config' '
 	test_cmp expect url
 '
 
+test_failure_with_unknown_submodule() {
+	test_must_fail git submodule $1 no-such-submodule 2>output.err &&
+	grep "^error: .*no-such-submodule" output.err
+}
+
+test_expect_success 'init should fail with unknown submodule' '
+	test_failure_with_unknown_submodule init
+'
+
+test_expect_success 'update should fail with unknown submodule' '
+	test_failure_with_unknown_submodule update
+'
+
+test_expect_success 'status should fail with unknown submodule' '
+	test_failure_with_unknown_submodule status
+'
+
+test_expect_success 'sync should fail with unknown submodule' '
+	test_failure_with_unknown_submodule sync
+'
+
 test_expect_success 'update should fail when path is used by a file' '
 	echo hello >expect &&
 
@@ -418,10 +439,7 @@ test_expect_success 'moving to a commit without submodule does not leave empty d
 '
 
 test_expect_success 'submodule <invalid-path> warns' '
-
-	git submodule no-such-submodule 2> output.err &&
-	grep "^error: .*no-such-submodule" output.err
-
+	test_failure_with_unknown_submodule
 '
 
 test_expect_success 'add submodules without specifying an explicit path' '
-- 
1.7.12.rc2.10.g45a4861
Previous: Daniel MildeNext: Junio C Hamano
Message 2 of 9 in “git submodule return status”
  1. Daniel MildeJun 28, 2012
  2. Let submodule command exit with error status if path does not existHeiko Voigt, Aug 9, 2012
  3. Junio C HamanoAug 9, 2012
  4. Let submodule command exit with error status if path does not existHeiko Voigt, Aug 11, 2012
  5. Junio C HamanoAug 12, 2012
  6. Heiko VoigtAug 13, 2012
  7. Junio C HamanoAug 13, 2012
  8. Let submodule command exit with error status if path does not existHeiko Voigt, Aug 14, 2012
  9. Junio C HamanoAug 14, 2012

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.