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 <hvo...@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

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to