Mercurial > public > mercurial-scm > hg
diff rust/hg-core/src/revlog/index.rs @ 50975:27e773aa607d
rust: implement the `Graph` trait for all revlogs
This is trivial and makes all the algorithms relying on the trait usable
for more use cases.
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Thu, 10 Aug 2023 11:01:07 +0200 |
parents | 1928b770e3e7 |
children | 4c5f6e95df84 |
line wrap: on
line diff
--- a/rust/hg-core/src/revlog/index.rs Thu Aug 10 11:00:34 2023 +0200 +++ b/rust/hg-core/src/revlog/index.rs Thu Aug 10 11:01:07 2023 +0200 @@ -6,7 +6,7 @@ use crate::errors::HgError; use crate::revlog::node::Node; use crate::revlog::{Revision, NULL_REVISION}; -use crate::UncheckedRevision; +use crate::{Graph, GraphError, RevlogIndex, UncheckedRevision}; pub const INDEX_ENTRY_SIZE: usize = 64; @@ -97,6 +97,23 @@ } } +impl Graph for Index { + fn parents(&self, rev: Revision) -> Result<[Revision; 2], GraphError> { + let err = || GraphError::ParentOutOfRange(rev); + match self.get_entry(rev) { + Some(entry) => { + // The C implementation checks that the parents are valid + // before returning + Ok([ + self.check_revision(entry.p1()).ok_or_else(err)?, + self.check_revision(entry.p2()).ok_or_else(err)?, + ]) + } + None => Ok([NULL_REVISION, NULL_REVISION]), + } + } +} + impl Index { /// Create an index from bytes. /// Calculate the start of each entry when is_inline is true.