mirror of
https://github.com/git/git
synced 2024-08-27 19:49:21 +00:00
fetching submodules: respect submodule.fetchJobs
config option
This allows to configure fetching and updating in parallel without having the command line option. This moved the responsibility to determine how many parallel processes to start from builtin/fetch to submodule.c as we need a way to communicate "The user did not specify the number of parallel processes in the command line options" in the builtin fetch. The submodule code takes care of the precedence (CLI > config > default). 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:
parent
f73da11024
commit
a028a1930c
|
@ -2646,6 +2646,12 @@ submodule.<name>.ignore::
|
||||||
"--ignore-submodules" option. The 'git submodule' commands are not
|
"--ignore-submodules" option. The 'git submodule' commands are not
|
||||||
affected by this setting.
|
affected by this setting.
|
||||||
|
|
||||||
|
submodule.fetchJobs::
|
||||||
|
Specifies how many submodules are fetched/cloned at the same time.
|
||||||
|
A positive integer allows up to that number of submodules fetched
|
||||||
|
in parallel. A value of 0 will give some reasonable default.
|
||||||
|
If unset, it defaults to 1.
|
||||||
|
|
||||||
tag.sort::
|
tag.sort::
|
||||||
This variable controls the sort ordering of tags when displayed by
|
This variable controls the sort ordering of tags when displayed by
|
||||||
linkgit:git-tag[1]. Without the "--sort=<value>" option provided, the
|
linkgit:git-tag[1]. Without the "--sort=<value>" option provided, the
|
||||||
|
|
|
@ -37,7 +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 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;
|
||||||
|
|
16
submodule.c
16
submodule.c
|
@ -15,6 +15,7 @@
|
||||||
#include "thread-utils.h"
|
#include "thread-utils.h"
|
||||||
|
|
||||||
static int config_fetch_recurse_submodules = RECURSE_SUBMODULES_ON_DEMAND;
|
static int config_fetch_recurse_submodules = RECURSE_SUBMODULES_ON_DEMAND;
|
||||||
|
static int parallel_jobs = 1;
|
||||||
static struct string_list changed_submodule_paths;
|
static struct string_list changed_submodule_paths;
|
||||||
static int initialized_fetch_ref_tips;
|
static int initialized_fetch_ref_tips;
|
||||||
static struct sha1_array ref_tips_before_fetch;
|
static struct sha1_array ref_tips_before_fetch;
|
||||||
|
@ -169,7 +170,12 @@ void set_diffopt_flags_from_submodule_config(struct diff_options *diffopt,
|
||||||
|
|
||||||
int submodule_config(const char *var, const char *value, void *cb)
|
int submodule_config(const char *var, const char *value, void *cb)
|
||||||
{
|
{
|
||||||
if (starts_with(var, "submodule."))
|
if (!strcmp(var, "submodule.fetchjobs")) {
|
||||||
|
parallel_jobs = git_config_int(var, value);
|
||||||
|
if (parallel_jobs < 0)
|
||||||
|
die(_("negative values not allowed for submodule.fetchJobs"));
|
||||||
|
return 0;
|
||||||
|
} else if (starts_with(var, "submodule."))
|
||||||
return parse_submodule_config_option(var, value);
|
return parse_submodule_config_option(var, value);
|
||||||
else if (!strcmp(var, "fetch.recursesubmodules")) {
|
else if (!strcmp(var, "fetch.recursesubmodules")) {
|
||||||
config_fetch_recurse_submodules = parse_fetch_recurse_submodules_arg(var, value);
|
config_fetch_recurse_submodules = parse_fetch_recurse_submodules_arg(var, value);
|
||||||
|
@ -771,6 +777,9 @@ int fetch_populated_submodules(const struct argv_array *options,
|
||||||
argv_array_push(&spf.args, "--recurse-submodules-default");
|
argv_array_push(&spf.args, "--recurse-submodules-default");
|
||||||
/* default value, "--submodule-prefix" and its value are added later */
|
/* default value, "--submodule-prefix" and its value are added later */
|
||||||
|
|
||||||
|
if (max_parallel_jobs < 0)
|
||||||
|
max_parallel_jobs = parallel_jobs;
|
||||||
|
|
||||||
calculate_changed_submodule_paths();
|
calculate_changed_submodule_paths();
|
||||||
run_processes_parallel(max_parallel_jobs,
|
run_processes_parallel(max_parallel_jobs,
|
||||||
get_next_submodule,
|
get_next_submodule,
|
||||||
|
@ -1117,3 +1126,8 @@ void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir)
|
||||||
strbuf_release(&rel_path);
|
strbuf_release(&rel_path);
|
||||||
free((void *)real_work_tree);
|
free((void *)real_work_tree);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int parallel_submodules(void)
|
||||||
|
{
|
||||||
|
return parallel_jobs;
|
||||||
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ struct submodule_update_strategy {
|
||||||
enum submodule_update_type type;
|
enum submodule_update_type type;
|
||||||
const char *command;
|
const char *command;
|
||||||
};
|
};
|
||||||
|
#define SUBMODULE_UPDATE_STRATEGY_INIT {SM_UPDATE_UNSPECIFIED, NULL}
|
||||||
|
|
||||||
int is_staging_gitmodules_ok(void);
|
int is_staging_gitmodules_ok(void);
|
||||||
int update_path_in_gitmodules(const char *oldpath, const char *newpath);
|
int update_path_in_gitmodules(const char *oldpath, const char *newpath);
|
||||||
|
@ -57,5 +58,6 @@ int find_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_nam
|
||||||
struct string_list *needs_pushing);
|
struct string_list *needs_pushing);
|
||||||
int push_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name);
|
int push_unpushed_submodules(unsigned char new_sha1[20], const char *remotes_name);
|
||||||
void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir);
|
void connect_work_tree_and_git_dir(const char *work_tree, const char *git_dir);
|
||||||
|
int parallel_submodules(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -471,4 +471,18 @@ test_expect_success "don't fetch submodule when newly recorded commits are alrea
|
||||||
test_i18ncmp expect.err actual.err
|
test_i18ncmp expect.err actual.err
|
||||||
'
|
'
|
||||||
|
|
||||||
|
test_expect_success 'fetching submodules respects parallel settings' '
|
||||||
|
git config fetch.recurseSubmodules true &&
|
||||||
|
(
|
||||||
|
cd downstream &&
|
||||||
|
GIT_TRACE=$(pwd)/trace.out git fetch --jobs 7 &&
|
||||||
|
grep "7 tasks" trace.out &&
|
||||||
|
git config submodule.fetchJobs 8 &&
|
||||||
|
GIT_TRACE=$(pwd)/trace.out git fetch &&
|
||||||
|
grep "8 tasks" trace.out &&
|
||||||
|
GIT_TRACE=$(pwd)/trace.out git fetch --jobs 9 &&
|
||||||
|
grep "9 tasks" trace.out
|
||||||
|
)
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
Loading…
Reference in a new issue