summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLibravatar Glen Choo <chooglen@google.com>2022-03-07 16:14:30 -0800
committerLibravatar Junio C Hamano <gitster@pobox.com>2022-03-07 16:51:03 -0800
commit73bc90d7e19c471318e799624b6d4c6d449c655d (patch)
tree51a7e2eccfe47146fe967ab50df008c3c202ecb9
parentsubmodule: store new submodule commits oid_array in a struct (diff)
downloadtgif-73bc90d7e19c471318e799624b6d4c6d449c655d.tar.xz
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>
-rw-r--r--submodule.c61
1 files changed, 36 insertions, 25 deletions
diff --git a/submodule.c b/submodule.c
index 0b9c25f9d3..7a5316b6f7 100644
--- a/submodule.c
+++ b/submodule.c
@@ -1389,6 +1389,7 @@ struct fetch_task {
struct repository *repo;
const struct submodule *sub;
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 */
};
@@ -1466,14 +1467,11 @@ static struct repository *get_submodule_repo_for(struct repository *r,
return ret;
}
-static int get_next_submodule(struct child_process *cp,
- struct strbuf *err, void *data, void **task_cb)
+static struct fetch_task *
+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++) {
const struct cache_entry *ce = spf->r->index->cache[spf->count];
- const char *default_argv;
struct fetch_task *task;
if (!S_ISGITLINK(ce->ce_mode))
@@ -1493,10 +1491,10 @@ static int get_next_submodule(struct child_process *cp,
&spf->changed_submodule_names,
task->sub->name))
continue;
- default_argv = "on-demand";
+ task->default_argv = "on-demand";
break;
case RECURSE_SUBMODULES_ON:
- default_argv = "yes";
+ task->default_argv = "yes";
break;
case RECURSE_SUBMODULES_OFF:
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());
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)
strbuf_addf(err, _("Fetching submodule %s%s\n"),
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++;
- *task_cb = task;
-
- strbuf_release(&submodule_prefix);
- return 1;
+ return task;
} else {
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);
}
}
+ 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) {
struct fetch_task *task =