#767044 'git submodule foreach --recursive' prints progress info to stdout

Package:
git
Source:
git
Description:
fast, scalable, distributed revision control system
Submitter:
Jonathan Nieder
Date:
2018-12-17 00:27:04 UTC
Severity:
normal
#767044#5
Date:
2014-10-28 00:04:08 UTC
From:
To:
Most git commands write progress info to stderr, but 'git submodule
foreach --recursive' writes its progress info "Entering '[submodule]'"
to stdout.  This makes git submodule foreach --recursive harder to
use than it should be in a pipeline.

How about something like this patch?

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
diff --git i/git-submodule.sh w/git-submodule.sh
index 9245abf..aabe567 100755
--- i/git-submodule.sh
+++ w/git-submodule.sh
@@ -154,7 +154,7 @@ module_list()
 	eval "set $(git rev-parse --sq --prefix "$wt_prefix" -- "$@")"
 	(
 		git ls-files -z --error-unmatch --stage -- "$@" ||
-		echo "unmatched pathspec exists"
+		echo >&2 "unmatched pathspec exists"
 	) |
 	@@PERL@@ -e '
 	my %unmerged = ();
@@ -469,7 +469,7 @@ Use -f if you really want to add it." >&2
 				echo >&2 "$(eval_gettext "use the '--force' option. If the local git directory is not the correct repo")"
 				die "$(eval_gettext "or you are unsure what this means choose another name with the '--name' option.")"
 			else
-				echo "$(eval_gettext "Reactivating local git directory for submodule '\$sm_name'.")"
+				say >&2 "$(eval_gettext "Reactivating local git directory for submodule '\$sm_name'.")"
 			fi
 		fi
 		module_clone "$sm_path" "$sm_name" "$realrepo" "$reference" "$depth" || exit
@@ -539,7 +539,7 @@ cmd_foreach()
 		if test -e "$sm_path"/.git
 		then
 			displaypath=$(relative_path "$sm_path")
-			say "$(eval_gettext "Entering '\$prefix\$displaypath'")"
+			say >&2 "$(eval_gettext "Entering '\$prefix\$displaypath'")"
 			name=$(module_name "$sm_path")
 			(
 				prefix="$prefix$sm_path/"
@@ -616,7 +616,7 @@ cmd_init()
 			git config submodule."$name".url "$url" ||
 			die "$(eval_gettext "Failed to register url for submodule path '\$displaypath'")"

-			say "$(eval_gettext "Submodule '\$name' (\$url) registered for path '\$displaypath'")"
+			say >&2 "$(eval_gettext "Submodule '\$name' (\$url) registered for path '\$displaypath'")"
 		fi

 		# Copy "update" setting when it is not set yet
@@ -698,8 +698,8 @@ cmd_deinit()
 				die "$(eval_gettext "Submodule work tree '\$displaypath' contains local modifications; use '-f' to discard them")"
 			fi
 			rm -rf "$sm_path" &&
-			say "$(eval_gettext "Cleared directory '\$displaypath'")" ||
-			say "$(eval_gettext "Could not remove submodule work tree '\$displaypath'")"
+			say >&2 "$(eval_gettext "Cleared directory '\$displaypath'")" ||
+			say >&2 "$(eval_gettext "Could not remove submodule work tree '\$displaypath'")"
 		fi

 		mkdir "$sm_path" || say "$(eval_gettext "Could not create empty submodule directory '\$displaypath'")"
@@ -711,7 +711,7 @@ cmd_deinit()
 			# the user later decides to init this submodule again
 			url=$(git config submodule."$name".url)
 			git config --remove-section submodule."$name" 2>/dev/null &&
-			say "$(eval_gettext "Submodule '\$name' (\$url) unregistered for path '\$displaypath'")"
+			say >&2 "$(eval_gettext "Submodule '\$name' (\$url) unregistered for path '\$displaypath'")"
 		fi
 	done
 }
@@ -818,7 +818,7 @@ cmd_update()

 		if test "$update_module" = "none"
 		then
-			echo "Skipping submodule '$displaypath'"
+			echo >&2 "Skipping submodule '$displaypath'"
 			continue
 		fi

@@ -827,7 +827,7 @@ cmd_update()
 			# Only mention uninitialized submodules when its
 			# path have been specified
 			test "$#" != "0" &&
-			say "$(eval_gettext "Submodule path '\$displaypath' not initialized
+			say >&2 "$(eval_gettext "Submodule path '\$displaypath' not initialized
 Maybe you want to use 'update --init'?")"
 			continue
 		fi
@@ -914,7 +914,7 @@ Maybe you want to use 'update --init'?")"

 			if (clear_local_git_env; cd "$sm_path" && $command "$sha1")
 			then
-				say "$say_msg"
+				say >&2 "$say_msg"
 			elif test -n "$must_die_on_failure"
 			then
 				die_with_status 2 "$die_msg"
@@ -1161,7 +1161,7 @@ cmd_summary() {
 		then
 			# Don't give error msg for modification whose dst is not submodule
 			# i.e. deleted or changed to blob
-			test $mod_dst = 160000 && echo "$errmsg"
+			test $mod_dst = 160000 && echo >&2 "$errmsg"
 		else
 			if test $mod_src = 160000 && test $mod_dst = 160000
 			then
@@ -1328,7 +1328,7 @@ cmd_sync()
 		if git config "submodule.$name.url" >/dev/null 2>/dev/null
 		then
 			displaypath=$(relative_path "$prefix$sm_path")
-			say "$(eval_gettext "Synchronizing submodule url for '\$displaypath'")"
+			say >&2 "$(eval_gettext "Synchronizing submodule url for '\$displaypath'")"
 			git config submodule."$name".url "$super_config_url"

 			if test -e "$sm_path"/.git