Mercurial > hg
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 } |