@@ -6,7 +6,7 @@ use std::sync::LazyLock as Lazy;
66use anyhow::Context as ResultExt;
77use git2::{
88BranchType, Cred, CredentialType, Error, FetchOptions, Oid, RemoteCallbacks, Repository,
9-ResetType,
9+ResetType, SubmoduleUpdateOptions,
1010};
1111use url::Url;
1212@@ -89,20 +89,29 @@ pub fn checkout(repo: &Repository, oid: Oid) -> anyhow::Result<()> {
8989}
90909191/// Recursively update Git submodules.
92-pub fn submodule_update(repo: &Repository) -> Result<(), Error> {
93-fn _submodule_update(repo: &Repository, todo: &mut Vec<Repository>) -> Result<(), Error> {
92+pub fn submodule_update(repo: &Repository) -> anyhow::Result<()> {
93+fn _submodule_update(
94+repo: &Repository,
95+todo: &mut Vec<Repository>,
96+opts: &mut SubmoduleUpdateOptions<'_>,
97+) -> anyhow::Result<()> {
9498for mut submodule in repo.submodules()? {
95- submodule.update(true, None)?;
99+ submodule.update(true, Some(opts))?;
96100 todo.push(submodule.open()?);
97101}
98102Ok(())
99103}
100-let mut repos = Vec::new();
101-_submodule_update(repo, &mut repos)?;
102-while let Some(repo) = repos.pop() {
103-_submodule_update(&repo, &mut repos)?;
104-}
105-Ok(())
104+105+with_fetch_options(|fetch_opts| {
106+let mut opts = SubmoduleUpdateOptions::new();
107+let opts = opts.fetch(fetch_opts);
108+let mut repos = Vec::new();
109+_submodule_update(repo, &mut repos, opts)?;
110+while let Some(repo) = repos.pop() {
111+_submodule_update(&repo, &mut repos, opts)?;
112+}
113+Ok(())
114+})
106115}
107116108117fn resolve_refname(repo: &Repository, refname: &str) -> Result<Oid, Error> {