##// END OF EJS Templates
test-narrow: mitigate the flakyness of test-narrow-shallow...
test-narrow: mitigate the flakyness of test-narrow-shallow The actual bug still need fixing, but in the meantime the flakyness is wasting everybody's time. Differential Revision: https://phab.mercurial-scm.org/D9593

File last commit:

r46750:cc6faec6 default
r46754:34f2c634 default
Show More
changelog.rs
59 lines | 1.7 KiB | application/rls-services+xml | RustLexer
Antoine Cezar
hg-core: add `Changlog` a specialized `Revlog`...
r46103 use crate::revlog::revlog::{Revlog, RevlogError};
Simon Sapin
rust: use NodePrefix::from_hex instead of hex::decode directly...
r46647 use crate::revlog::NodePrefixRef;
Antoine Cezar
hg-core: add `Changlog` a specialized `Revlog`...
r46103 use crate::revlog::Revision;
Simon Sapin
rust: change &PathBuf parameters to &Path...
r46750 use std::path::Path;
Antoine Cezar
hg-core: add `Changlog` a specialized `Revlog`...
r46103
/// A specialized `Revlog` to work with `changelog` data format.
pub struct Changelog {
/// The generic `revlog` format.
revlog: Revlog,
}
impl Changelog {
/// Open the `changelog` of a repository given by its root.
Simon Sapin
rust: change &PathBuf parameters to &Path...
r46750 pub fn open(root: &Path) -> Result<Self, RevlogError> {
Antoine Cezar
hg-core: add `Changlog` a specialized `Revlog`...
r46103 let index_file = root.join(".hg/store/00changelog.i");
Antoine cezar
hg-core: fix path encoding usage...
r46408 let revlog = Revlog::open(&index_file, None)?;
Antoine Cezar
hg-core: add `Changlog` a specialized `Revlog`...
r46103 Ok(Self { revlog })
}
/// Return the `ChangelogEntry` a given node id.
pub fn get_node(
&self,
Simon Sapin
rust: use NodePrefix::from_hex instead of hex::decode directly...
r46647 node: NodePrefixRef,
Antoine Cezar
hg-core: add `Changlog` a specialized `Revlog`...
r46103 ) -> Result<ChangelogEntry, RevlogError> {
let rev = self.revlog.get_node_rev(node)?;
self.get_rev(rev)
}
/// Return the `ChangelogEntry` of a given node revision.
pub fn get_rev(
&self,
rev: Revision,
) -> Result<ChangelogEntry, RevlogError> {
let bytes = self.revlog.get_rev_data(rev)?;
Ok(ChangelogEntry { bytes })
}
}
/// `Changelog` entry which knows how to interpret the `changelog` data bytes.
#[derive(Debug)]
pub struct ChangelogEntry {
/// The data bytes of the `changelog` entry.
bytes: Vec<u8>,
}
impl ChangelogEntry {
/// Return an iterator over the lines of the entry.
pub fn lines(&self) -> impl Iterator<Item = &[u8]> {
self.bytes
.split(|b| b == &b'\n')
.filter(|line| !line.is_empty())
}
/// Return the node id of the `manifest` referenced by this `changelog`
/// entry.
pub fn manifest_node(&self) -> Result<&[u8], RevlogError> {
self.lines().next().ok_or(RevlogError::Corrupted)
}
}