git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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

From
Jens Lehmann <jens.lehmann@web.de>
Date
Apr 2, 2013, 20:14 UTC
Message-ID
<515B3C0E.9000802@web.de>
In-Reply-To
<51511E04.6070504@gmail.com>

Seems were getting closer, some comments from a quick read of your patch below.

Am 26.03.2013 05:03, schrieb Eric Cousineau:
Show 12 quoted lines
> From 2c2923ada809d671828aa58dcda05a1b71222b70 Mon Sep 17 00:00:00 2001
> From: Eric Cousineau <eacousineau@gmail.com>
> Date: Mon, 25 Mar 2013 22:27:06 -0500
> Subject: [PATCH] submodule-foreach: Added in --post-order=<command> and
>  adjusted code per Jens Lehmann's suggestion
> 
> Signed-off-by: Eric Cousineau <eacousineau@gmail.com>
> ---
> Updated the usage line.
> I had put the locals in there before because I think I was having trouble with resolving some
> of the variables in nested submodules, but now that I've taken them out they seem to work fine.
> I also changed the message for the post-order to say "Exiting".

That's better than "Stopping", but while I'm not a native speaker I'd propose to use "Leaving" as the opposite of "Entering".

Show 41 quoted lines
> I did not have a chance to look into why I couldn't group the --post-order stuff into a string
> when passing it on to submodule. I can look at it later on though.
> 
> Now the output is as follows:
> 
> $ git submodule foreach --recursive --post-order 'echo Post $name' 'echo Pre $path'
> Entering 'b'
> Pre b
> Entering 'b/d'
> Pre d
> Exiting 'b/d'
> Post d
> Exiting 'b'
> Post b
> Entering 'c'
> Pre c
> Exiting 'c'
> Post c
> 
>  git-submodule.sh |   35 ++++++++++++++++++++++++++++++-----
>  1 file changed, 30 insertions(+), 5 deletions(-)
> 
> diff --git a/git-submodule.sh b/git-submodule.sh
> index 004c034..4c9923a 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] [--post-order <command>] <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".
> +    recursive=
> +    post_order=

I'm still not sure we need that here, in fact the problem you have with the cmd_foreach invocation below might just be because you reset these variables here instead of once at the top of this file.

Show 59 quoted lines
>      while test $# -ne 0
>      do
>          case "$1" in
> @@ -443,6 +445,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
>              ;;
> @@ -465,7 +476,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'")"
> +            exit_msg="$(eval_gettext "Exiting '\$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/"
> @@ -473,13 +486,25 @@ cmd_foreach()
>                  # we make $path available to scripts ...
>                  path=$sm_path
>                  cd "$sm_path" &&
> -                eval "$@" &&
> +                say "$enter_msg" &&
> +                eval "$@" || die "$die_msg" &&
>                  if test -n "$recursive"
>                  then
> -                    cmd_foreach "--recursive" "$@"
> +                    if test -n "$post_order"
> +                    then
> +                        # tried keeping flags as a variable, but was having difficulty
> +                        cmd_foreach --recursive --post-order "$post_order" "$@"
> +                    else
> +                        cmd_foreach --recursive "$@"
> +                    fi
> +                fi &&
> +                if test -n "$post_order"
> +                then
> +                    say "$exit_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
>  }
Previous: Eric CousineauNext: eacousineau
Message 17 of 25 in “Changing submodule foreach --recursive to be depth-first, --parent option to execute command in supermodule as well”
  1. Changing submodule foreach --recursive to be depth-first, --parent option to execute command in supermodule as wellEric Cousineau, Mar 4, 2013
  2. Jens LehmannMar 4, 2013
  3. Junio C HamanoMar 4, 2013
  4. Eric CousineauMar 5, 2013
  5. Heiko VoigtMar 5, 2013
  6. Junio C HamanoMar 5, 2013
  7. Eric CousineauMar 5, 2013
  8. Junio C HamanoMar 5, 2013
  9. Jens LehmannMar 5, 2013
  10. Phil HordMar 5, 2013
  11. Jens LehmannMar 9, 2013
  12. Heiko VoigtMar 11, 2013
  13. Phil HordMar 12, 2013
  14. Eric CousineauMar 14, 2013
  15. Jens LehmannMar 18, 2013
  16. Eric CousineauMar 26, 2013
  17. Jens LehmannApr 2, 2013
  18. submodule foreach: Added in --post-order=<command> and adjusted code per Jens Lehmann's suggestionseacousineau, Apr 13, 2013
  19. Jens LehmannApr 14, 2013
  20. Jens LehmannMar 18, 2013
  21. Eric CousineauMar 26, 2013
  22. Eric CousineauMar 26, 2013
  23. Junio C HamanoMar 26, 2013
  24. Junio C HamanoMar 26, 2013
  25. Eric CousineauApr 13, 2013

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.