From: Eric Cousineau <eacousineau@gmail.com>
To: Junio C Hamano <gitster@pobox.com>
Cc: Jens Lehmann <Jens.Lehmann@web.de>, git@vger.kernel.org
Subject: Re: [PATCH/RFC] Changing submodule foreach --recursive to be depth-first, --parent option to execute command in supermodule as well
Date: Mon, 04 Mar 2013 23:37:12 -0600 [thread overview]
Message-ID: <51358488.2080005@gmail.com> (raw)
In-Reply-To: <7vhakqwz1e.fsf@alter.siamese.dyndns.org>
git-submodule.sh: In foreach, make '-post-order' yield post-order
traversal and
'--include-super' execute commands at the top-level supermodule, with
both of these
options compatible with '--recursive'.
Signed-off-by: Eric Cousineau <eacousineau@gmail.com>
---
Sorry about missing the part about not included MIME attachments, hope
this is in a better format now.
Jens, I changed the '--parent' option to '--include-super' which is
hopefully less vague.
Junio, you made an excellent point about both being useful. In
particular, I overlooked the case
for doing a submodule pull / update (if, for whatever reason, it is more
convenient than a submodule
update, maybe for merging). In that case, you might want to initialize
new submodules and ignore the
old ones, instead of wasting time on them with a post-order traversal pull.
I've implemented your suggestions to have a boolean '--post-order'
option, and made the '--include-super'
option compatible with it. This way, the original behavior of 'foreach'
is preserved.
I've updated the test and uploaded it to pastebin:
http://pastebin.com/BgZNzFpi
git-submodule.sh | 102
+++++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 77 insertions(+), 25 deletions(-)
diff --git a/git-submodule.sh b/git-submodule.sh
index 004c034..652bea0 100755
--- a/git-submodule.sh
+++ b/git-submodule.sh
@@ -10,7 +10,7 @@ USAGE="[--quiet] add [-b <branch>] [-f|--force]
[--name <name>] [--reference <re
or: $dashless [--quiet] init [--] [<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] [--include-super]
[--post-order] <command>
or: $dashless [--quiet] sync [--recursive] [--] [<path>...]"
OPTIONS_SPEC=
. git-sh-setup
@@ -434,6 +434,8 @@ Use -f if you really want to add it." >&2
cmd_foreach()
{
# parse $args after "submodule ... foreach".
+ # Gratuitous (empty) local's to prevent recursive bleeding
+ local include_super= recursive= post_order=
while test $# -ne 0
do
case "$1" in
@@ -443,6 +445,12 @@ cmd_foreach()
--recursive)
recursive=1
;;
+ --post-order)
+ post_order=1
+ ;;
+ --include-super)
+ include_super=1
+ ;;
-*)
usage
;;
@@ -453,35 +461,79 @@ cmd_foreach()
shift
done
- toplevel=$(pwd)
+ if test -n "$recursive"
+ then
+ local recursive_flags="--recursive"
+ if test -n "$post_order"
+ then
+ recursive_flags="$recursive_flags --post-order"
+ fi
+ fi
+
+ local toplevel=$(pwd)
# dup stdin so that it can be restored when running the external
# command in the subshell (and a recursive call to this function)
exec 3<&0
+
+ # Use nested functions
+ super_eval() {
+ name=$(basename "$toplevel")
+ clear_local_git_env
+ path=.
+ say "$(eval_gettext "Entering '\$name'")" # Not sure of proper
thing here
+ eval "$@" || die "$(eval_gettext "Stopping at supermodule;
script returned non-zero status.")"
+ }
- module_list |
- while read mode sha1 stage sm_path
- do
- die_if_unmatched "$mode"
- if test -e "$sm_path"/.git
- then
- say "$(eval_gettext "Entering '\$prefix\$sm_path'")"
- name=$(module_name "$sm_path")
- (
- prefix="$prefix$sm_path/"
- clear_local_git_env
- # we make $path available to scripts ...
- path=$sm_path
- cd "$sm_path" &&
- eval "$@" &&
- if test -n "$recursive"
- then
- cmd_foreach "--recursive" "$@"
- fi
- ) <&3 3<&- ||
- die "$(eval_gettext "Stopping at '\$sm_path'; script
returned non-zero status.")"
- fi
- done
+ if test -n "$include_super" -a -z "$post_order"
+ then
+ super_eval "$@"
+ fi &&
+ (
+ module_list |
+ while read mode sha1 stage sm_path
+ do
+ die_if_unmatched "$mode"
+ if test -e "$sm_path"/.git
+ then
+ local name prefix path message epitaph
+ message="$(eval_gettext "Entering '\$prefix\$sm_path'")"
+ epitaph="$(eval_gettext "Stopping at '\$sm_path';
script returned non-zero status.")"
+ name=$(module_name "$sm_path")
+ (
+ prefix="$prefix$sm_path/"
+ clear_local_git_env
+ # we make $path available to scripts ...
+ path=$sm_path
+
+ sm_eval() {
+ say "$message"
+ eval "$@" || die "$epitaph"
+ }
+
+ cd "$sm_path" &&
+ if test -z "$post_order"
+ then
+ sm_eval "$@"
+ fi &&
+ if test -n "$recursive"
+ then
+ cmd_foreach $recursive_flags "$@"
+ fi &&
+ if test -n "$post_order"
+ then
+ sm_eval "$@"
+ fi
+ # Since the (...) seems to limit exit's scope, make
sure to kill things here if something goes awry
+ # (the `|| exit 1` at the end)
+ ) <&3 3<&- || exit 1
+ fi
+ done
+ ) &&
+ if test -n "$include_super" -a -n "$post_order"
+ then
+ super_eval "$@"
+ fi
}
#
--
1.8.2.rc1.24.g06d67b8.dirty
next prev parent reply other threads:[~2013-03-05 5:37 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-03-04 8:41 [PATCH/RFC] Changing submodule foreach --recursive to be depth-first, --parent option to execute command in supermodule as well Eric Cousineau
2013-03-04 22:15 ` Jens Lehmann
2013-03-04 23:00 ` Junio C Hamano
2013-03-05 5:37 ` Eric Cousineau [this message]
2013-03-05 7:59 ` Heiko Voigt
2013-03-05 16:09 ` Junio C Hamano
2013-03-05 16:42 ` Eric Cousineau
2013-03-05 18:34 ` Junio C Hamano
2013-03-05 20:51 ` Jens Lehmann
2013-03-05 21:17 ` Phil Hord
2013-03-09 18:18 ` Jens Lehmann
2013-03-11 16:46 ` Heiko Voigt
2013-03-12 16:01 ` Phil Hord
2013-03-14 6:30 ` Eric Cousineau
2013-03-18 21:25 ` Jens Lehmann
2013-03-26 4:03 ` Eric Cousineau
2013-04-02 20:14 ` Jens Lehmann
2013-04-13 4:04 ` [PATCH] submodule foreach: Added in --post-order=<command> and adjusted code per Jens Lehmann's suggestions eacousineau
[not found] ` <CA+aSAWuK9Yhvx-vO1fUteq-K=xOPgxkyeWeHG3UwZuDHsxLzAw@mail.gmail.com>
2013-04-13 4:11 ` Eric Cousineau
2013-04-14 18:52 ` Jens Lehmann
2013-03-18 21:10 ` [PATCH/RFC] Changing submodule foreach --recursive to be depth-first, --parent option to execute command in supermodule as well Jens Lehmann
2013-03-26 3:56 ` Eric Cousineau
2013-03-26 4:36 ` Eric Cousineau
2013-03-26 5:23 ` Junio C Hamano
2013-03-26 5:25 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=51358488.2080005@gmail.com \
--to=eacousineau@gmail.com \
--cc=Jens.Lehmann@web.de \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.