GitHub

@@ -6,7 +6,7 @@ use std::sync::LazyLock as Lazy;

66

use anyhow::Context as ResultExt;

77

use git2::{

88

BranchType, Cred, CredentialType, Error, FetchOptions, Oid, RemoteCallbacks, Repository,

9-

ResetType,

9+

ResetType, SubmoduleUpdateOptions,

1010

};

1111

use 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<()> {

9498

for mut submodule in repo.submodules()? {

95-

submodule.update(true, None)?;

99+

submodule.update(true, Some(opts))?;

96100

todo.push(submodule.open()?);

97101

}

98102

Ok(())

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

}

107116108117

fn resolve_refname(repo: &Repository, refname: &str) -> Result<Oid, Error> {

Read the original on github.com ↗