submodule: fetch missing objects from default remote

When be76c21282 (fetch: ensure submodule objects fetched, 2018-12-06)
added support for fetching a missing submodule object by id, it
hardcoded the remote name as "origin" and deferred anything more
complicated for a later patch. Implement the NEEDSWORK item to remove
the hardcoded assumption by adding and using a submodule helper subcmd
'get-default-remote'. Fixing this lets 'git fetch --recurse-submodules'
succeed when the fetched commit(s) in the superproject trigger a
submodule fetch, and that submodule's default remote name is not
"origin".

Add non-"origin" remote tests to t5526-fetch-submodules.sh and
t5572-pull-submodule.sh demonstrating this works as expected and add
dedicated tests for get-default-remote.

Signed-off-by: Nasser Grainawi <nasser.grainawi@oss.qualcomm.com>
Reviewed-by: Jacob Keller <jacob.keller@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Nasser Grainawi
2026-03-03 15:40:44 -08:00
committed by Junio C Hamano
parent 1faf5b085a
commit 3b5fb32da8
6 changed files with 330 additions and 4 deletions

View File

@@ -1706,6 +1706,8 @@ static int get_next_submodule(struct child_process *cp, struct strbuf *err,
if (spf->oid_fetch_tasks_nr) {
struct fetch_task *task =
spf->oid_fetch_tasks[spf->oid_fetch_tasks_nr - 1];
struct child_process cp_remote = CHILD_PROCESS_INIT;
struct strbuf remote_name = STRBUF_INIT;
spf->oid_fetch_tasks_nr--;
child_process_init(cp);
@@ -1719,8 +1721,19 @@ static int get_next_submodule(struct child_process *cp, struct strbuf *err,
strvec_pushf(&cp->args, "--submodule-prefix=%s%s/",
spf->prefix, task->sub->path);
/* NEEDSWORK: have get_default_remote from submodule--helper */
strvec_push(&cp->args, "origin");
cp_remote.git_cmd = 1;
strvec_pushl(&cp_remote.args, "submodule--helper",
"get-default-remote", task->sub->path, NULL);
if (!capture_command(&cp_remote, &remote_name, 0)) {
strbuf_trim_trailing_newline(&remote_name);
strvec_push(&cp->args, remote_name.buf);
} else {
/* Fallback to "origin" if the helper fails */
strvec_push(&cp->args, "origin");
}
strbuf_release(&remote_name);
oid_array_for_each_unique(task->commits,
append_oid_to_argv, &cp->args);