comparison rust/hg-core/src/revlog/changelog.rs @ 45532:c2317b7624fd

hg-core: add `Changlog` a specialized `Revlog` A facade to `Revlog` to provide a `changelog` specific interface. Differential Revision: https://phab.mercurial-scm.org/D9010
author Antoine Cezar <antoine.cezar@octobus.net>
date Wed, 09 Sep 2020 16:25:23 +0200
parents
children 7252f5237352
comparison
equal deleted inserted replaced
45531:b0d6309ff50c 45532:c2317b7624fd
1 use crate::revlog::revlog::{Revlog, RevlogError};
2 use crate::revlog::Revision;
3 use std::path::PathBuf;
4
5 /// A specialized `Revlog` to work with `changelog` data format.
6 pub struct Changelog {
7 /// The generic `revlog` format.
8 revlog: Revlog,
9 }
10
11 impl Changelog {
12 /// Open the `changelog` of a repository given by its root.
13 pub fn open(root: &PathBuf) -> Result<Self, RevlogError> {
14 let index_file = root.join(".hg/store/00changelog.i");
15 let revlog = Revlog::open(&index_file)?;
16 Ok(Self { revlog })
17 }
18
19 /// Return the `ChangelogEntry` a given node id.
20 pub fn get_node(
21 &self,
22 node: &[u8],
23 ) -> Result<ChangelogEntry, RevlogError> {
24 let rev = self.revlog.get_node_rev(node)?;
25 self.get_rev(rev)
26 }
27
28 /// Return the `ChangelogEntry` of a given node revision.
29 pub fn get_rev(
30 &self,
31 rev: Revision,
32 ) -> Result<ChangelogEntry, RevlogError> {
33 let bytes = self.revlog.get_rev_data(rev)?;
34 Ok(ChangelogEntry { bytes })
35 }
36 }
37
38 /// `Changelog` entry which knows how to interpret the `changelog` data bytes.
39 #[derive(Debug)]
40 pub struct ChangelogEntry {
41 /// The data bytes of the `changelog` entry.
42 bytes: Vec<u8>,
43 }
44
45 impl ChangelogEntry {
46 /// Return an iterator over the lines of the entry.
47 pub fn lines(&self) -> impl Iterator<Item = &[u8]> {
48 self.bytes
49 .split(|b| b == &b'\n')
50 .filter(|line| !line.is_empty())
51 }
52
53 /// Return the node id of the `manifest` referenced by this `changelog`
54 /// entry.
55 pub fn manifest_node(&self) -> Result<&[u8], RevlogError> {
56 self.lines().next().ok_or(RevlogError::Corrupted)
57 }
58 }