This is a refresh of a conversation from a couple of months ago. I didn't try to implement all the desired features (e.g., smart logic for passing a -j parameter to recursive submodule invocations), but I did address the one issue that Junio insisted on: the code makes a best effort to detect whether xargs supports parallel execution on the host platform, and if it doesn't, then it prints a warning and falls back to serial execution. Stefan On Tue, Oct 30, 2012 at 11:03 AM, <szager@xxxxxxxxxx> wrote: > The --jobs parameter may be used to set the degree of per-submodule > parallel execution. > > Signed-off-by: Stefan Zager <szager@xxxxxxxxxx> > --- > Documentation/git-submodule.txt | 8 ++++++- > git-submodule.sh | 40 ++++++++++++++++++++++++++++++++++++++- > 2 files changed, 46 insertions(+), 2 deletions(-) > > diff --git a/Documentation/git-submodule.txt b/Documentation/git-submodule.txt > index b4683bb..cb23ba7 100644 > --- a/Documentation/git-submodule.txt > +++ b/Documentation/git-submodule.txt > @@ -14,7 +14,8 @@ SYNOPSIS > 'git submodule' [--quiet] status [--cached] [--recursive] [--] [<path>...] > 'git submodule' [--quiet] init [--] [<path>...] > 'git submodule' [--quiet] update [--init] [-N|--no-fetch] [--rebase] > - [--reference <repository>] [--merge] [--recursive] [--] [<path>...] > + [--reference <repository>] [--merge] [--recursive] > + [-j|--jobs [jobs]] [--] [<path>...] > 'git submodule' [--quiet] summary [--cached|--files] [(-n|--summary-limit) <n>] > [commit] [--] [<path>...] > 'git submodule' [--quiet] foreach [--recursive] <command> > @@ -146,6 +147,11 @@ If the submodule is not yet initialized, and you just want to use the > setting as stored in .gitmodules, you can automatically initialize the > submodule with the `--init` option. > + > +By default, each submodule is treated serially. You may specify a degree of > +parallel execution with the --jobs flag. If a parameter is provided, it is > +the maximum number of jobs to run in parallel; without a parameter, all jobs are > +run in parallel. > ++ > If `--recursive` is specified, this command will recurse into the > registered submodules, and update any nested submodules within. > + > diff --git a/git-submodule.sh b/git-submodule.sh > index ab6b110..60a5f96 100755 > --- a/git-submodule.sh > +++ b/git-submodule.sh > @@ -8,7 +8,7 @@ dashless=$(basename "$0" | sed -e 's/-/ /') > USAGE="[--quiet] add [-b branch] [-f|--force] [--reference <repository>] [--] <repository> [<path>] > or: $dashless [--quiet] status [--cached] [--recursive] [--] [<path>...] > or: $dashless [--quiet] init [--] [<path>...] > - or: $dashless [--quiet] update [--init] [-N|--no-fetch] [-f|--force] [--rebase] [--reference <repository>] [--merge] [--recursive] [--] [<path>...] > + or: $dashless [--quiet] update [--init] [-N|--no-fetch] [-f|--force] [--rebase] [--reference <repository>] [--merge] [--recursive] [-j|--jobs [jobs]] [--] [<path>...] > or: $dashless [--quiet] summary [--cached|--files] [--summary-limit <n>] [commit] [--] [<path>...] > or: $dashless [--quiet] foreach [--recursive] <command> > or: $dashless [--quiet] sync [--] [<path>...]" > @@ -500,6 +500,7 @@ cmd_update() > { > # parse $args after "submodule ... update". > orig_flags= > + jobs="1" > while test $# -ne 0 > do > case "$1" in > @@ -518,6 +519,20 @@ cmd_update() > -r|--rebase) > update="rebase" > ;; > + -j|--jobs) > + case "$2" in > + ''|-*) > + jobs="0" > + ;; > + *) > + jobs="$2" > + shift > + ;; > + esac > + # Don't preserve this arg. > + shift > + continue > + ;; > --reference) > case "$2" in '') usage ;; esac > reference="--reference=$2" > @@ -551,11 +566,34 @@ cmd_update() > shift > done > > + # Correctly handle the case where '-q' came before 'update' on the command line. > + if test -n "$GIT_QUIET" > + then > + orig_flags="$orig_flags -q" > + fi > + > if test -n "$init" > then > cmd_init "--" "$@" || return > fi > > + if test "$jobs" != 1 > + then > + if ( echo test | xargs -P "$jobs" true 2>/dev/null ) > + then > + if ( echo test | xargs --max-lines=1 true 2>/dev/null ); then > + max_lines="--max-lines=1" > + else > + max_lines="-L 1" > + fi > + module_list "$@" | awk '{print $4}' | > + xargs $max_lines -P "$jobs" git submodule update $orig_flags > + return > + else > + echo "Warn: parallel execution is not supported on this platform." > + fi > + fi > + > cloned_modules= > module_list "$@" | { > err= > -- > 1.7.7.3 > -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html