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