Mercurial > public > mercurial-scm > hg
diff rust/hg-core/src/revlog/filelog.rs @ 48542:35c47015b9b7
rhg: Expose FilelogEntry that wraps RevlogEntry
This can be later extended to access metadata such as `uncompressed_len` without
necessarily resolving deltas.
Differential Revision: https://phab.mercurial-scm.org/D11961
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Tue, 21 Dec 2021 18:50:44 +0100 |
parents | f2f57724d4eb |
children | e91aa800ae5b |
line wrap: on
line diff
--- a/rust/hg-core/src/revlog/filelog.rs Tue Dec 21 18:35:58 2021 +0100 +++ b/rust/hg-core/src/revlog/filelog.rs Tue Dec 21 18:50:44 2021 +0100 @@ -1,6 +1,7 @@ use crate::errors::HgError; use crate::repo::Repo; use crate::revlog::path_encode::path_encode; +use crate::revlog::revlog::RevlogEntry; use crate::revlog::revlog::{Revlog, RevlogError}; use crate::revlog::NodePrefix; use crate::revlog::Revision; @@ -23,7 +24,7 @@ Ok(Self { revlog }) } - /// The given node ID is that of the file as found in a manifest, not of a + /// The given node ID is that of the file as found in a filelog, not of a /// changeset. pub fn data_for_node( &self, @@ -33,7 +34,7 @@ self.data_for_rev(file_rev) } - /// The given revision is that of the file as found in a manifest, not of a + /// The given revision is that of the file as found in a filelog, not of a /// changeset. pub fn data_for_rev( &self, @@ -42,6 +43,25 @@ let data: Vec<u8> = self.revlog.get_rev_data(file_rev)?.into_owned(); Ok(FilelogRevisionData(data.into())) } + + /// The given node ID is that of the file as found in a filelog, not of a + /// changeset. + pub fn entry_for_node( + &self, + file_node: impl Into<NodePrefix>, + ) -> Result<FilelogEntry, RevlogError> { + let file_rev = self.revlog.rev_from_node(file_node.into())?; + self.entry_for_rev(file_rev) + } + + /// The given revision is that of the file as found in a filelog, not of a + /// changeset. + pub fn entry_for_rev( + &self, + file_rev: Revision, + ) -> Result<FilelogEntry, RevlogError> { + Ok(FilelogEntry(self.revlog.get_entry(file_rev)?)) + } } fn store_path(hg_path: &HgPath, suffix: &[u8]) -> PathBuf { @@ -50,6 +70,14 @@ get_path_from_bytes(&encoded_bytes).into() } +pub struct FilelogEntry<'a>(RevlogEntry<'a>); + +impl FilelogEntry<'_> { + pub fn data(&self) -> Result<FilelogRevisionData, HgError> { + Ok(FilelogRevisionData(self.0.data()?.into_owned())) + } +} + /// The data for one revision in a filelog, uncompressed and delta-resolved. pub struct FilelogRevisionData(Vec<u8>);