clone: allow an explicit argument for parallel submodule clones

Just pass it along to "git submodule update", which may pick reasonable
defaults if you don't specify an explicit number.

Reviewed-by: Jonathan Nieder <jrnieder@gmail.com>
Signed-off-by: Stefan Beller <sbeller@google.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Stefan Beller
2016-02-29 18:07:20 -08:00
committed by Junio C Hamano
parent 2335b870fa
commit 72290d6a1d
3 changed files with 33 additions and 7 deletions

View File

@ -14,7 +14,7 @@ SYNOPSIS
[-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>] [-o <name>] [-b <name>] [-u <upload-pack>] [--reference <repository>]
[--dissociate] [--separate-git-dir <git dir>] [--dissociate] [--separate-git-dir <git dir>]
[--depth <depth>] [--[no-]single-branch] [--depth <depth>] [--[no-]single-branch]
[--recursive | --recurse-submodules] [--] <repository> [--recursive | --recurse-submodules] [--jobs <n>] [--] <repository>
[<directory>] [<directory>]
DESCRIPTION DESCRIPTION
@ -221,6 +221,10 @@ objects from the source repository into a pack in the cloned repository.
The result is Git repository can be separated from working The result is Git repository can be separated from working
tree. tree.
-j <n>::
--jobs <n>::
The number of submodules fetched at the same time.
Defaults to the `submodule.fetchJobs` option.
<repository>:: <repository>::
The (possibly remote) repository to clone from. See the The (possibly remote) repository to clone from. See the

View File

@ -50,6 +50,7 @@ static int option_progress = -1;
static struct string_list option_config; static struct string_list option_config;
static struct string_list option_reference; static struct string_list option_reference;
static int option_dissociate; static int option_dissociate;
static int max_jobs = -1;
static struct option builtin_clone_options[] = { static struct option builtin_clone_options[] = {
OPT__VERBOSITY(&option_verbosity), OPT__VERBOSITY(&option_verbosity),
@ -72,6 +73,8 @@ static struct option builtin_clone_options[] = {
N_("initialize submodules in the clone")), N_("initialize submodules in the clone")),
OPT_BOOL(0, "recurse-submodules", &option_recursive, OPT_BOOL(0, "recurse-submodules", &option_recursive,
N_("initialize submodules in the clone")), N_("initialize submodules in the clone")),
OPT_INTEGER('j', "jobs", &max_jobs,
N_("number of submodules cloned in parallel")),
OPT_STRING(0, "template", &option_template, N_("template-directory"), OPT_STRING(0, "template", &option_template, N_("template-directory"),
N_("directory from which templates will be used")), N_("directory from which templates will be used")),
OPT_STRING_LIST(0, "reference", &option_reference, N_("repo"), OPT_STRING_LIST(0, "reference", &option_reference, N_("repo"),
@ -95,10 +98,6 @@ static struct option builtin_clone_options[] = {
OPT_END() OPT_END()
}; };
static const char *argv_submodule[] = {
"submodule", "update", "--init", "--recursive", NULL
};
static const char *get_repo_path_1(struct strbuf *path, int *is_bundle) static const char *get_repo_path_1(struct strbuf *path, int *is_bundle)
{ {
static char *suffix[] = { "/.git", "", ".git/.git", ".git" }; static char *suffix[] = { "/.git", "", ".git/.git", ".git" };
@ -724,8 +723,16 @@ static int checkout(void)
err |= run_hook_le(NULL, "post-checkout", sha1_to_hex(null_sha1), err |= run_hook_le(NULL, "post-checkout", sha1_to_hex(null_sha1),
sha1_to_hex(sha1), "1", NULL); sha1_to_hex(sha1), "1", NULL);
if (!err && option_recursive) if (!err && option_recursive) {
err = run_command_v_opt(argv_submodule, RUN_GIT_CMD); struct argv_array args = ARGV_ARRAY_INIT;
argv_array_pushl(&args, "submodule", "update", "--init", "--recursive", NULL);
if (max_jobs != -1)
argv_array_pushf(&args, "--jobs=%d", max_jobs);
err = run_command_v_opt(args.argv, RUN_GIT_CMD);
argv_array_clear(&args);
}
return err; return err;
} }

View File

@ -786,4 +786,19 @@ test_expect_success 'submodule update can be run in parallel' '
grep "9 tasks" trace.out grep "9 tasks" trace.out
) )
' '
test_expect_success 'git clone passes the parallel jobs config on to submodules' '
test_when_finished "rm -rf super4" &&
GIT_TRACE=$(pwd)/trace.out git clone --recurse-submodules --jobs 7 . super4 &&
grep "7 tasks" trace.out &&
rm -rf super4 &&
git config --global submodule.fetchJobs 8 &&
GIT_TRACE=$(pwd)/trace.out git clone --recurse-submodules . super4 &&
grep "8 tasks" trace.out &&
rm -rf super4 &&
GIT_TRACE=$(pwd)/trace.out git clone --recurse-submodules --jobs 9 . super4 &&
grep "9 tasks" trace.out &&
rm -rf super4
'
test_done test_done