git submodule return status

2 messages, 2 authors, 2016-06-15 · open the first message on its own page

git submodule return status

From: Daniel Milde <hidden>
Date: 2016-06-15 22:54:11

Hello,
if command git submodule update fails, return status is not set
properly.

Example:
$ git submodule update unknown
error: pathspec 'unknown' did not match any file(s) known to git.
Did you forget to 'git add'?
error: pathspec 'unknown' did not match any file(s) known to git.
Did you forget to 'git add'?
$ echo $?
0

I suppose the exit status should be 1 or something else, but not 0.

Best regards
Daniel Milde

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

From: Heiko Voigt <hidden>
Date: 2016-06-15 22:54:27

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 <redacted>
---
 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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help