diff --git a/gix/src/clone/fetch/mod.rs b/gix/src/clone/fetch/mod.rs index 65210022c2e..34641a89fb1 100644 --- a/gix/src/clone/fetch/mod.rs +++ b/gix/src/clone/fetch/mod.rs @@ -45,6 +45,8 @@ pub enum Error { wanted: gix_ref::PartialName, candidates: Vec, }, + #[error(transparent)] + CommitterOrFallback(#[from] crate::config::time::Error), } /// Modification @@ -80,10 +82,11 @@ impl PrepareFetch { .as_mut() .expect("user error: multiple calls are allowed only until it succeeds"); + repo.committer_or_set_generic_fallback()?; + if !self.config_overrides.is_empty() { let mut snapshot = repo.config_snapshot_mut(); snapshot.append_config(&self.config_overrides, gix_config::Source::Api)?; - snapshot.commit()?; } let remote_name = match self.remote_name.as_ref() { diff --git a/gix/src/clone/mod.rs b/gix/src/clone/mod.rs index 920214d3f20..23903943724 100644 --- a/gix/src/clone/mod.rs +++ b/gix/src/clone/mod.rs @@ -1,5 +1,5 @@ #![allow(clippy::result_large_err)] -use crate::{bstr::BString, config::tree::gitoxide, remote}; +use crate::{bstr::BString, remote}; type ConfigureRemoteFn = Box) -> Result, Box>>; @@ -46,6 +46,8 @@ pub enum Error { #[error(transparent)] Init(#[from] crate::init::Error), #[error(transparent)] + CommitterOrFallback(#[from] crate::config::time::Error), + #[error(transparent)] UrlParse(#[from] gix_url::parse::Error), #[error("Failed to turn a the relative file url \"{}\" into an absolute one", url.to_bstring())] CanonicalizeUrl { @@ -102,18 +104,7 @@ impl PrepareFetch { url: url.clone(), source: err, })?; - if repo.committer().is_none() { - let mut config = gix_config::File::new(gix_config::file::Metadata::api()); - config - .set_raw_value(&gitoxide::Committer::NAME_FALLBACK, "no name configured during clone") - .expect("works - statically known"); - config - .set_raw_value(&gitoxide::Committer::EMAIL_FALLBACK, "noEmailAvailable@example.com") - .expect("works - statically known"); - let mut repo_config = repo.config_snapshot_mut(); - repo_config.append(config); - repo_config.commit().expect("configuration is still valid"); - } + repo.committer_or_set_generic_fallback()?; Ok(PrepareFetch { url, #[cfg(any(feature = "async-network-client", feature = "blocking-network-client"))] diff --git a/gix/src/repository/identity.rs b/gix/src/repository/identity.rs index c3385746753..7837e9f2d65 100644 --- a/gix/src/repository/identity.rs +++ b/gix/src/repository/identity.rs @@ -43,6 +43,24 @@ impl crate::Repository { .into() } + /// Return the committer or its fallback just like [`committer()`](Self::committer()), but if *not* set generate a + /// possibly arbitrary fallback and configure it in memory on this instance. That fallback is then returned and future + /// calls to [`committer()`](Self::committer()) will return it as well. + pub fn committer_or_set_generic_fallback(&mut self) -> Result, config::time::Error> { + if self.committer().is_none() { + let mut config = gix_config::File::new(gix_config::file::Metadata::api()); + config + .set_raw_value(&gitoxide::Committer::NAME_FALLBACK, "no name configured") + .expect("works - statically known"); + config + .set_raw_value(&gitoxide::Committer::EMAIL_FALLBACK, "noEmailAvailable@example.com") + .expect("works - statically known"); + let mut repo_config = self.config_snapshot_mut(); + repo_config.append(config); + } + self.committer().expect("committer was just set") + } + /// Return the author as configured by this repository, which is determined by… /// /// * …the git configuration `author.name|email`… diff --git a/gix/tests/gix-init.rs b/gix/tests/gix-init.rs index 6a63c719c55..6a116b6d293 100644 --- a/gix/tests/gix-init.rs +++ b/gix/tests/gix-init.rs @@ -268,7 +268,7 @@ mod with_overrides { Ok(()) } - fn cow_bstr(s: &str) -> Cow { + fn cow_bstr(s: &str) -> Cow<'_, BStr> { Cow::Borrowed(s.into()) } } diff --git a/gix/tests/gix/clone.rs b/gix/tests/gix/clone.rs index ce9d47de3a5..573a8e3ddfe 100644 --- a/gix/tests/gix/clone.rs +++ b/gix/tests/gix/clone.rs @@ -334,7 +334,7 @@ mod blocking_io { .expect("one line")? .signature .to_owned()?; - assert_eq!(sig.name, "no name configured during clone"); + assert_eq!(sig.name, "no name configured"); assert_eq!(sig.email, "noEmailAvailable@example.com"); match out.status { diff --git a/gix/tests/gix/object/tree/diff.rs b/gix/tests/gix/object/tree/diff.rs index 6a260ce403a..225dc3148db 100644 --- a/gix/tests/gix/object/tree/diff.rs +++ b/gix/tests/gix/object/tree/diff.rs @@ -879,7 +879,7 @@ mod track_rewrites { } } -fn tree_named(repo: &gix::Repository, rev_spec: impl AsRef) -> gix::Tree { +fn tree_named(repo: &gix::Repository, rev_spec: impl AsRef) -> gix::Tree<'_> { repo.rev_parse_single(rev_spec.as_ref()) .unwrap() .object()