diff --git a/gix-pack/src/bundle/write/mod.rs b/gix-pack/src/bundle/write/mod.rs index 8f45090ab3e..ad759f5eed1 100644 --- a/gix-pack/src/bundle/write/mod.rs +++ b/gix-pack/src/bundle/write/mod.rs @@ -366,6 +366,7 @@ fn resolve_entry(range: data::EntryRange, mapped_file: &memmap2::Mmap) -> Option mapped_file.get(range.start as usize..range.end as usize) } +#[allow(clippy::type_complexity)] // cannot typedef impl Fn fn new_pack_file_resolver( data_file: SharedTempFile, ) -> io::Result<( diff --git a/gix/src/reference/errors.rs b/gix/src/reference/errors.rs index 2e0f0a838c0..cacfda5aeab 100644 --- a/gix/src/reference/errors.rs +++ b/gix/src/reference/errors.rs @@ -110,14 +110,16 @@ pub mod head_tree_id { pub mod find { /// pub mod existing { + use gix_ref::PartialName; + /// The error returned by [`find_reference(…)`][crate::Repository::find_reference()], and others. #[derive(Debug, thiserror::Error)] #[allow(missing_docs)] pub enum Error { #[error(transparent)] Find(#[from] crate::reference::find::Error), - #[error("The reference did not exist")] - NotFound, + #[error("The reference '{}' did not exist", name.as_ref().as_bstr())] + NotFound { name: PartialName }, } } @@ -127,7 +129,5 @@ pub mod find { pub enum Error { #[error(transparent)] Find(#[from] gix_ref::file::find::Error), - #[error(transparent)] - PackedRefsOpen(#[from] gix_ref::packed::buffer::open::Error), } } diff --git a/gix/src/repository/reference.rs b/gix/src/repository/reference.rs index 70411318c4d..90db4032ceb 100644 --- a/gix/src/repository/reference.rs +++ b/gix/src/repository/reference.rs @@ -159,7 +159,7 @@ impl crate::Repository { Ok(match head.inner.target { Target::Symbolic(branch) => match self.find_reference(&branch) { Ok(r) => crate::head::Kind::Symbolic(r.detach()), - Err(reference::find::existing::Error::NotFound) => crate::head::Kind::Unborn(branch), + Err(reference::find::existing::Error::NotFound { .. }) => crate::head::Kind::Unborn(branch), Err(err) => return Err(err), }, Target::Object(target) => crate::head::Kind::Detached { @@ -222,11 +222,19 @@ impl crate::Repository { /// without that being considered an error. pub fn find_reference<'a, Name, E>(&self, name: Name) -> Result, reference::find::existing::Error> where - Name: TryInto<&'a PartialNameRef, Error = E>, + Name: TryInto<&'a PartialNameRef, Error = E> + Clone, gix_ref::file::find::Error: From, { + // TODO: is there a way to just pass `partial_name` to `try_find_reference()`? Compiler freaks out then + // as it still wants to see `E` there, not `Infallible`. + let partial_name = name + .clone() + .try_into() + .map_err(|err| reference::find::Error::Find(gix_ref::file::find::Error::from(err)))?; self.try_find_reference(name)? - .ok_or(reference::find::existing::Error::NotFound) + .ok_or_else(|| reference::find::existing::Error::NotFound { + name: partial_name.to_owned(), + }) } /// Return a platform for iterating references. @@ -249,8 +257,7 @@ impl crate::Repository { Name: TryInto<&'a PartialNameRef, Error = E>, gix_ref::file::find::Error: From, { - let state = self; - match state.refs.try_find(name) { + match self.refs.try_find(name) { Ok(r) => match r { Some(r) => Ok(Some(Reference::from_ref(r, self))), None => Ok(None),