submodules: allow parallel fetching, add tests and documentation
This enables the work of the previous patches. Signed-off-by: Stefan Beller <sbeller@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
fe85ee6e23
commit
62104ba14a
@ -100,6 +100,13 @@ ifndef::git-pull[]
|
|||||||
reference to a commit that isn't already in the local submodule
|
reference to a commit that isn't already in the local submodule
|
||||||
clone.
|
clone.
|
||||||
|
|
||||||
|
-j::
|
||||||
|
--jobs=<n>::
|
||||||
|
Number of parallel children to be used for fetching submodules.
|
||||||
|
Each will fetch from different submodules, such that fetching many
|
||||||
|
submodules will be faster. By default submodules will be fetched
|
||||||
|
one at a time.
|
||||||
|
|
||||||
--no-recurse-submodules::
|
--no-recurse-submodules::
|
||||||
Disable recursive fetching of submodules (this has the same effect as
|
Disable recursive fetching of submodules (this has the same effect as
|
||||||
using the '--recurse-submodules=no' option).
|
using the '--recurse-submodules=no' option).
|
||||||
|
@ -37,6 +37,7 @@ static int prune = -1; /* unspecified */
|
|||||||
static int all, append, dry_run, force, keep, multiple, update_head_ok, verbosity;
|
static int all, append, dry_run, force, keep, multiple, update_head_ok, verbosity;
|
||||||
static int progress = -1, recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
|
static int progress = -1, recurse_submodules = RECURSE_SUBMODULES_DEFAULT;
|
||||||
static int tags = TAGS_DEFAULT, unshallow, update_shallow;
|
static int tags = TAGS_DEFAULT, unshallow, update_shallow;
|
||||||
|
static int max_children = 1;
|
||||||
static const char *depth;
|
static const char *depth;
|
||||||
static const char *upload_pack;
|
static const char *upload_pack;
|
||||||
static struct strbuf default_rla = STRBUF_INIT;
|
static struct strbuf default_rla = STRBUF_INIT;
|
||||||
@ -99,6 +100,8 @@ static struct option builtin_fetch_options[] = {
|
|||||||
N_("fetch all tags and associated objects"), TAGS_SET),
|
N_("fetch all tags and associated objects"), TAGS_SET),
|
||||||
OPT_SET_INT('n', NULL, &tags,
|
OPT_SET_INT('n', NULL, &tags,
|
||||||
N_("do not fetch all tags (--no-tags)"), TAGS_UNSET),
|
N_("do not fetch all tags (--no-tags)"), TAGS_UNSET),
|
||||||
|
OPT_INTEGER('j', "jobs", &max_children,
|
||||||
|
N_("number of submodules fetched in parallel")),
|
||||||
OPT_BOOL('p', "prune", &prune,
|
OPT_BOOL('p', "prune", &prune,
|
||||||
N_("prune remote-tracking branches no longer on remote")),
|
N_("prune remote-tracking branches no longer on remote")),
|
||||||
{ OPTION_CALLBACK, 0, "recurse-submodules", NULL, N_("on-demand"),
|
{ OPTION_CALLBACK, 0, "recurse-submodules", NULL, N_("on-demand"),
|
||||||
@ -1213,7 +1216,8 @@ int cmd_fetch(int argc, const char **argv, const char *prefix)
|
|||||||
result = fetch_populated_submodules(&options,
|
result = fetch_populated_submodules(&options,
|
||||||
submodule_prefix,
|
submodule_prefix,
|
||||||
recurse_submodules,
|
recurse_submodules,
|
||||||
verbosity < 0);
|
verbosity < 0,
|
||||||
|
max_children);
|
||||||
argv_array_clear(&options);
|
argv_array_clear(&options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -95,6 +95,7 @@ static int opt_force;
|
|||||||
static char *opt_tags;
|
static char *opt_tags;
|
||||||
static char *opt_prune;
|
static char *opt_prune;
|
||||||
static char *opt_recurse_submodules;
|
static char *opt_recurse_submodules;
|
||||||
|
static char *max_children;
|
||||||
static int opt_dry_run;
|
static int opt_dry_run;
|
||||||
static char *opt_keep;
|
static char *opt_keep;
|
||||||
static char *opt_depth;
|
static char *opt_depth;
|
||||||
@ -178,6 +179,9 @@ static struct option pull_options[] = {
|
|||||||
N_("on-demand"),
|
N_("on-demand"),
|
||||||
N_("control recursive fetching of submodules"),
|
N_("control recursive fetching of submodules"),
|
||||||
PARSE_OPT_OPTARG),
|
PARSE_OPT_OPTARG),
|
||||||
|
OPT_PASSTHRU('j', "jobs", &max_children, N_("n"),
|
||||||
|
N_("number of submodules pulled in parallel"),
|
||||||
|
PARSE_OPT_OPTARG),
|
||||||
OPT_BOOL(0, "dry-run", &opt_dry_run,
|
OPT_BOOL(0, "dry-run", &opt_dry_run,
|
||||||
N_("dry run")),
|
N_("dry run")),
|
||||||
OPT_PASSTHRU('k', "keep", &opt_keep, NULL,
|
OPT_PASSTHRU('k', "keep", &opt_keep, NULL,
|
||||||
@ -525,6 +529,8 @@ static int run_fetch(const char *repo, const char **refspecs)
|
|||||||
argv_array_push(&args, opt_prune);
|
argv_array_push(&args, opt_prune);
|
||||||
if (opt_recurse_submodules)
|
if (opt_recurse_submodules)
|
||||||
argv_array_push(&args, opt_recurse_submodules);
|
argv_array_push(&args, opt_recurse_submodules);
|
||||||
|
if (max_children)
|
||||||
|
argv_array_push(&args, max_children);
|
||||||
if (opt_dry_run)
|
if (opt_dry_run)
|
||||||
argv_array_push(&args, "--dry-run");
|
argv_array_push(&args, "--dry-run");
|
||||||
if (opt_keep)
|
if (opt_keep)
|
||||||
|
@ -729,10 +729,9 @@ static int fetch_finish(int retvalue, struct child_process *cp,
|
|||||||
|
|
||||||
int fetch_populated_submodules(const struct argv_array *options,
|
int fetch_populated_submodules(const struct argv_array *options,
|
||||||
const char *prefix, int command_line_option,
|
const char *prefix, int command_line_option,
|
||||||
int quiet)
|
int quiet, int max_parallel_jobs)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
int max_parallel_jobs = 1;
|
|
||||||
struct submodule_parallel_fetch spf = SPF_INIT;
|
struct submodule_parallel_fetch spf = SPF_INIT;
|
||||||
|
|
||||||
spf.work_tree = get_git_work_tree();
|
spf.work_tree = get_git_work_tree();
|
||||||
|
@ -31,7 +31,7 @@ void set_config_fetch_recurse_submodules(int value);
|
|||||||
void check_for_new_submodule_commits(unsigned char new_sha1[20]);
|
void check_for_new_submodule_commits(unsigned char new_sha1[20]);
|
||||||
int fetch_populated_submodules(const struct argv_array *options,
|
int fetch_populated_submodules(const struct argv_array *options,
|
||||||
const char *prefix, int command_line_option,
|
const char *prefix, int command_line_option,
|
||||||
int quiet);
|
int quiet, int max_parallel_jobs);
|
||||||
unsigned is_submodule_modified(const char *path, int ignore_untracked);
|
unsigned is_submodule_modified(const char *path, int ignore_untracked);
|
||||||
int submodule_uses_gitfile(const char *path);
|
int submodule_uses_gitfile(const char *path);
|
||||||
int ok_to_remove_submodule(const char *path);
|
int ok_to_remove_submodule(const char *path);
|
||||||
|
@ -71,6 +71,17 @@ test_expect_success "fetch --recurse-submodules recurses into submodules" '
|
|||||||
test_i18ncmp expect.err actual.err
|
test_i18ncmp expect.err actual.err
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success "fetch --recurse-submodules -j2 has the same output behaviour" '
|
||||||
|
add_upstream_commit &&
|
||||||
|
(
|
||||||
|
cd downstream &&
|
||||||
|
GIT_TRACE=$(pwd)/../trace.out git fetch --recurse-submodules -j2 2>../actual.err
|
||||||
|
) &&
|
||||||
|
test_must_be_empty actual.out &&
|
||||||
|
test_i18ncmp expect.err actual.err &&
|
||||||
|
grep "2 tasks" trace.out
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success "fetch alone only fetches superproject" '
|
test_expect_success "fetch alone only fetches superproject" '
|
||||||
add_upstream_commit &&
|
add_upstream_commit &&
|
||||||
(
|
(
|
||||||
@ -140,6 +151,15 @@ test_expect_success "--quiet propagates to submodules" '
|
|||||||
! test -s actual.err
|
! test -s actual.err
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success "--quiet propagates to parallel submodules" '
|
||||||
|
(
|
||||||
|
cd downstream &&
|
||||||
|
git fetch --recurse-submodules -j 2 --quiet >../actual.out 2>../actual.err
|
||||||
|
) &&
|
||||||
|
! test -s actual.out &&
|
||||||
|
! test -s actual.err
|
||||||
|
'
|
||||||
|
|
||||||
test_expect_success "--dry-run propagates to submodules" '
|
test_expect_success "--dry-run propagates to submodules" '
|
||||||
add_upstream_commit &&
|
add_upstream_commit &&
|
||||||
(
|
(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user