diff --git a/rust/hg-core/src/revlog/filelog.rs b/rust/hg-core/src/revlog/filelog.rs --- a/rust/hg-core/src/revlog/filelog.rs +++ b/rust/hg-core/src/revlog/filelog.rs @@ -40,7 +40,7 @@ file_rev: Revision, ) -> Result { let data: Vec = self.revlog.get_rev_data(file_rev)?; - Ok(FilelogEntry(data)) + Ok(FilelogEntry(data.into())) } } @@ -54,18 +54,28 @@ impl FilelogEntry { /// Split into metadata and data - pub fn split(&self) -> Result<(Option<&[u8]>, &[u8]), HgError> { + /// Returns None if there is no metadata, so the entire entry is data. + fn split_metadata(&self) -> Result, HgError> { const DELIMITER: &[u8; 2] = &[b'\x01', b'\n']; if let Some(rest) = self.0.drop_prefix(DELIMITER) { if let Some((metadata, data)) = rest.split_2_by_slice(DELIMITER) { - Ok((Some(metadata), data)) + Ok(Some((metadata, data))) } else { Err(HgError::corrupted( "Missing metadata end delimiter in filelog entry", )) } } else { + Ok(None) + } + } + + /// Split into metadata and data + pub fn split(&self) -> Result<(Option<&[u8]>, &[u8]), HgError> { + if let Some((metadata, data)) = self.split_metadata()? { + Ok((Some(metadata), data)) + } else { Ok((None, &self.0)) } } @@ -75,4 +85,14 @@ let (_metadata, data) = self.split()?; Ok(data) } + + /// Consume the entry, and convert it into data, discarding any metadata, + /// if present. + pub fn into_data(self) -> Result, HgError> { + if let Some((_metadata, data)) = self.split_metadata()? { + Ok(data.to_owned()) + } else { + Ok(self.0) + } + } }