submodule: extract get_fetch_task()
get_next_submodule() configures the parallel submodule fetch by performing two functions: * iterate the index to find submodules * configure the child processes to fetch the submodules found in the previous step Extract the index iterating code into an iterator function, get_fetch_task(), so that get_next_submodule() is agnostic of how to find submodules. This prepares for a subsequent commit will teach the fetch machinery to also iterate through the list of changed submodules (in addition to the index). Signed-off-by: Glen Choo <chooglen@google.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
6e1e0c9959
commit
73bc90d7e1
61
submodule.c
61
submodule.c
@ -1389,6 +1389,7 @@ struct fetch_task {
|
|||||||
struct repository *repo;
|
struct repository *repo;
|
||||||
const struct submodule *sub;
|
const struct submodule *sub;
|
||||||
unsigned free_sub : 1; /* Do we need to free the submodule? */
|
unsigned free_sub : 1; /* Do we need to free the submodule? */
|
||||||
|
const char *default_argv; /* The default fetch mode. */
|
||||||
|
|
||||||
struct oid_array *commits; /* Ensure these commits are fetched */
|
struct oid_array *commits; /* Ensure these commits are fetched */
|
||||||
};
|
};
|
||||||
@ -1466,14 +1467,11 @@ static struct repository *get_submodule_repo_for(struct repository *r,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int get_next_submodule(struct child_process *cp,
|
static struct fetch_task *
|
||||||
struct strbuf *err, void *data, void **task_cb)
|
get_fetch_task(struct submodule_parallel_fetch *spf, struct strbuf *err)
|
||||||
{
|
{
|
||||||
struct submodule_parallel_fetch *spf = data;
|
|
||||||
|
|
||||||
for (; spf->count < spf->r->index->cache_nr; spf->count++) {
|
for (; spf->count < spf->r->index->cache_nr; spf->count++) {
|
||||||
const struct cache_entry *ce = spf->r->index->cache[spf->count];
|
const struct cache_entry *ce = spf->r->index->cache[spf->count];
|
||||||
const char *default_argv;
|
|
||||||
struct fetch_task *task;
|
struct fetch_task *task;
|
||||||
|
|
||||||
if (!S_ISGITLINK(ce->ce_mode))
|
if (!S_ISGITLINK(ce->ce_mode))
|
||||||
@ -1493,10 +1491,10 @@ static int get_next_submodule(struct child_process *cp,
|
|||||||
&spf->changed_submodule_names,
|
&spf->changed_submodule_names,
|
||||||
task->sub->name))
|
task->sub->name))
|
||||||
continue;
|
continue;
|
||||||
default_argv = "on-demand";
|
task->default_argv = "on-demand";
|
||||||
break;
|
break;
|
||||||
case RECURSE_SUBMODULES_ON:
|
case RECURSE_SUBMODULES_ON:
|
||||||
default_argv = "yes";
|
task->default_argv = "yes";
|
||||||
break;
|
break;
|
||||||
case RECURSE_SUBMODULES_OFF:
|
case RECURSE_SUBMODULES_OFF:
|
||||||
continue;
|
continue;
|
||||||
@ -1504,29 +1502,12 @@ static int get_next_submodule(struct child_process *cp,
|
|||||||
|
|
||||||
task->repo = get_submodule_repo_for(spf->r, task->sub->path, null_oid());
|
task->repo = get_submodule_repo_for(spf->r, task->sub->path, null_oid());
|
||||||
if (task->repo) {
|
if (task->repo) {
|
||||||
struct strbuf submodule_prefix = STRBUF_INIT;
|
|
||||||
child_process_init(cp);
|
|
||||||
cp->dir = task->repo->gitdir;
|
|
||||||
prepare_submodule_repo_env_in_gitdir(&cp->env_array);
|
|
||||||
cp->git_cmd = 1;
|
|
||||||
if (!spf->quiet)
|
if (!spf->quiet)
|
||||||
strbuf_addf(err, _("Fetching submodule %s%s\n"),
|
strbuf_addf(err, _("Fetching submodule %s%s\n"),
|
||||||
spf->prefix, ce->name);
|
spf->prefix, ce->name);
|
||||||
strvec_init(&cp->args);
|
|
||||||
strvec_pushv(&cp->args, spf->args.v);
|
|
||||||
strvec_push(&cp->args, default_argv);
|
|
||||||
strvec_push(&cp->args, "--submodule-prefix");
|
|
||||||
|
|
||||||
strbuf_addf(&submodule_prefix, "%s%s/",
|
|
||||||
spf->prefix,
|
|
||||||
task->sub->path);
|
|
||||||
strvec_push(&cp->args, submodule_prefix.buf);
|
|
||||||
|
|
||||||
spf->count++;
|
spf->count++;
|
||||||
*task_cb = task;
|
return task;
|
||||||
|
|
||||||
strbuf_release(&submodule_prefix);
|
|
||||||
return 1;
|
|
||||||
} else {
|
} else {
|
||||||
struct strbuf empty_submodule_path = STRBUF_INIT;
|
struct strbuf empty_submodule_path = STRBUF_INIT;
|
||||||
|
|
||||||
@ -1550,6 +1531,36 @@ static int get_next_submodule(struct child_process *cp,
|
|||||||
strbuf_release(&empty_submodule_path);
|
strbuf_release(&empty_submodule_path);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int get_next_submodule(struct child_process *cp, struct strbuf *err,
|
||||||
|
void *data, void **task_cb)
|
||||||
|
{
|
||||||
|
struct submodule_parallel_fetch *spf = data;
|
||||||
|
struct fetch_task *task = get_fetch_task(spf, err);
|
||||||
|
|
||||||
|
if (task) {
|
||||||
|
struct strbuf submodule_prefix = STRBUF_INIT;
|
||||||
|
|
||||||
|
child_process_init(cp);
|
||||||
|
cp->dir = task->repo->gitdir;
|
||||||
|
prepare_submodule_repo_env_in_gitdir(&cp->env_array);
|
||||||
|
cp->git_cmd = 1;
|
||||||
|
strvec_init(&cp->args);
|
||||||
|
strvec_pushv(&cp->args, spf->args.v);
|
||||||
|
strvec_push(&cp->args, task->default_argv);
|
||||||
|
strvec_push(&cp->args, "--submodule-prefix");
|
||||||
|
|
||||||
|
strbuf_addf(&submodule_prefix, "%s%s/",
|
||||||
|
spf->prefix,
|
||||||
|
task->sub->path);
|
||||||
|
strvec_push(&cp->args, submodule_prefix.buf);
|
||||||
|
*task_cb = task;
|
||||||
|
|
||||||
|
strbuf_release(&submodule_prefix);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (spf->oid_fetch_tasks_nr) {
|
if (spf->oid_fetch_tasks_nr) {
|
||||||
struct fetch_task *task =
|
struct fetch_task *task =
|
||||||
|
Loading…
Reference in New Issue
Block a user