Merge branch 'ml/submodule-foreach'

* ml/submodule-foreach:
  git-submodule - Add 'foreach' subcommand
This commit is contained in:
Junio C Hamano 2008-08-20 23:42:33 -07:00
commit 5630feaf37
2 changed files with 39 additions and 2 deletions

View File

@ -14,6 +14,7 @@ SYNOPSIS
'git submodule' [--quiet] init [--] [<path>...] 'git submodule' [--quiet] init [--] [<path>...]
'git submodule' [--quiet] update [--init] [--] [<path>...] 'git submodule' [--quiet] update [--init] [--] [<path>...]
'git submodule' [--quiet] summary [--summary-limit <n>] [commit] [--] [<path>...] 'git submodule' [--quiet] summary [--summary-limit <n>] [commit] [--] [<path>...]
'git submodule' [--quiet] foreach <command>
DESCRIPTION DESCRIPTION
@ -123,6 +124,22 @@ summary::
in the submodule between the given super project commit and the in the submodule between the given super project commit and the
index or working tree (switched by --cached) are shown. index or working tree (switched by --cached) are shown.
foreach::
Evaluates an arbitrary shell command in each checked out submodule.
The command has access to the variables $path and $sha1:
$path is the name of the submodule directory relative to the
superproject, and $sha1 is the commit as recorded in the superproject.
Any submodules defined in the superproject but not checked out are
ignored by this command. Unless given --quiet, foreach prints the name
of each submodule before evaluating the command.
A non-zero return from the command in any submodule causes
the processing to terminate. This can be overridden by adding '|| :'
to the end of the command.
+
As an example, "git submodule foreach 'echo $path `git rev-parse HEAD`' will
show the path and currently checked out commit for each submodule.
OPTIONS OPTIONS
------- -------
-q:: -q::

View File

@ -6,7 +6,7 @@
USAGE="[--quiet] [--cached] \ USAGE="[--quiet] [--cached] \
[add <repo> [-b branch] <path>]|[status|init|update [-i|--init]|summary [-n|--summary-limit <n>] [<commit>]] \ [add <repo> [-b branch] <path>]|[status|init|update [-i|--init]|summary [-n|--summary-limit <n>] [<commit>]] \
[--] [<path>...]" [--] [<path>...]|[foreach <command>]"
OPTIONS_SPEC= OPTIONS_SPEC=
. git-sh-setup . git-sh-setup
require_work_tree require_work_tree
@ -198,6 +198,26 @@ cmd_add()
die "Failed to register submodule '$path'" die "Failed to register submodule '$path'"
} }
#
# Execute an arbitrary command sequence in each checked out
# submodule
#
# $@ = command to execute
#
cmd_foreach()
{
git ls-files --stage | grep '^160000 ' |
while read mode sha1 stage path
do
if test -e "$path"/.git
then
say "Entering '$path'"
(cd "$path" && eval "$@") ||
die "Stopping at '$path'; script returned non-zero status."
fi
done
}
# #
# Register submodules in .git/config # Register submodules in .git/config
# #
@ -583,7 +603,7 @@ cmd_status()
while test $# != 0 && test -z "$command" while test $# != 0 && test -z "$command"
do do
case "$1" in case "$1" in
add | init | update | status | summary) add | foreach | init | update | status | summary)
command=$1 command=$1
;; ;;
-q|--quiet) -q|--quiet)