aboutsummaryrefslogtreecommitdiff
path: root/submodule.c
diff options
context:
space:
mode:
authorNasser Grainawi <nasser.grainawi@oss.qualcomm.com>2026-03-03 15:40:44 -0800
committerJunio C Hamano <gitster@pobox.com>2026-03-03 18:00:43 -0800
commit3b5fb32da836f5aead1cef319bc3e0a9b975ea35 (patch)
tree6b21ac32451adcd65ae382f4be021a52c08bc217 /submodule.c
parent1faf5b085a171f9ba9a6d7a446e0de16acccb1dc (diff)
downloadgit-3b5fb32da836f5aead1cef319bc3e0a9b975ea35.tar.xz
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>
Diffstat (limited to 'submodule.c')
-rw-r--r--submodule.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/submodule.c b/submodule.c
index 40a5c6fb9d..6599657f34 100644
--- a/submodule.c
+++ b/submodule.c
@@ -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);