Thread (1 message) 1 message, 1 author, 2016-06-15

Re: [PATCH] submodule foreach: Added in --post-order=<command> and adjusted code per Jens Lehmann's suggestions

From: Eric Cousineau <hidden>
Date: 2016-06-15 22:56:48

Had accidentally sent this as HTML, resending as plain-text.

On Fri, Apr 12, 2013 at 11:09 PM, Eric Cousineau [off-list ref] wrote:
Oops... I tried out using git-send-email adding in the Message-Id, but forgot to change the title as well. My bad.

This was in response to:

[PATCH/RFC] Changing submodule foreach --recursive to be depth-first, --parent option to execute command in supermodule as well
Message-Id: [ref]

- Eric


On Fri, Apr 12, 2013 at 11:04 PM, eacousineau [off-list ref] wrote:
quoted
Signed-off-by: eacousineau <redacted>
---
I see what you meant by the extra variables, so I've fixed that so the
original flags aren't needed with recursion. Also updated it to not
print the entering command if there is only a post-order command.

Examples:

$ git submodule foreach --recursive --post-order 'echo Goodbye' "echo \"'ello\""
Entering 'b'
'ello
Entering 'b/d'
'ello
Leaving 'b/d'
Goodbye
Leaving 'b'
Goodbye
Entering 'c'
'ello
Leaving 'c'
Goodbye

$ git submodule foreach --recursive --post-order :
Leaving 'b/d'
Leaving 'b'
Leaving 'c'

 git-submodule.sh | 31 ++++++++++++++++++++++++++-----
 1 file changed, 26 insertions(+), 5 deletions(-)
diff --git a/git-submodule.sh b/git-submodule.sh
index 79bfaac..e08a724 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -11,7 +11,7 @@ USAGE="[--quiet] add [-b <branch>] [-f|--force] [--name <name>] [--reference <re
    or: $dashless [--quiet] deinit [-f|--force] [--] <path>...
    or: $dashless [--quiet] update [--init] [--remote] [-N|--no-fetch] [-f|--force] [--rebase] [--reference <repository>] [--merge] [--recursive] [--] [<path>...]
    or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...]
-   or: $dashless [--quiet] foreach [--recursive] <command>
+   or: $dashless [--quiet] foreach [--recursive] [--post-order <command>] <command>
    or: $dashless [--quiet] sync [--recursive] [--] [<path>...]"
 OPTIONS_SPEC=
 . git-sh-setup
@@ -449,6 +449,15 @@ cmd_foreach()
                --recursive)
                        recursive=1
                        ;;
+               --post-order)
+                       test "$#" = "1" && usage
+                       post_order="$2"
+                       shift
+                       ;;
+               --post-order=*)
+                       # Will skip empty commands
+                       post_order=${1#*=}
+                       ;;
                -*)
                        usage
                        ;;
@@ -471,7 +480,9 @@ cmd_foreach()
                die_if_unmatched "$mode"
                if test -e "$sm_path"/.git
                then
-                       say "$(eval_gettext "Entering '\$prefix\$sm_path'")"
+                       enter_msg="$(eval_gettext "Entering '\$prefix\$sm_path'")"
+                       leave_msg="$(eval_gettext "Leaving '\$prefix\$sm_path'")"
+                       die_msg="$(eval_gettext "Stopping at '\$sm_path'; script returned non-zero status.")"
                        name=$(module_name "$sm_path")
                        (
                                prefix="$prefix$sm_path/"
@@ -479,13 +490,23 @@ cmd_foreach()
                                # we make $path available to scripts ...
                                path=$sm_path
                                cd "$sm_path" &&
-                               eval "$@" &&
+                               if test $# -gt 0 -o -z "$post_order"
+                               then
+                                       say "$enter_msg" &&
+                                       eval "$@" || die "$die_msg"
+                               fi &&
                                if test -n "$recursive"
                                then
-                                       cmd_foreach "--recursive" "$@"
+                                       # subshell will use parent-scoped values
+                                       cmd_foreach "$@"
+                               fi &&
+                               if test -n "$post_order"
+                               then
+                                       say "$leave_msg" &&
+                                       eval "$post_order" || die "$die_msg"
                                fi
                        ) <&3 3<&- ||
-                       die "$(eval_gettext "Stopping at '\$sm_path'; script returned non-zero status.")"
+                       die "$die_msg"
                fi
        done
 }
--
1.8.2.1.390.gd4ee029
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help