##// END OF EJS Templates
errors: make exit codes class variables instead...
errors: make exit codes class variables instead Kyle pointed out to me that we can simply make the exit codes class variables. Python provides some magic for making them accessible as instance variables. This also makes it easier to let subclasses of existing errors override the exit codes by letting them simply define their own values as class variables. That means that there's no need to pass them into the superclass's constructor arguments, so the superclass doesn't need to expose the them as arguments. (Making a subclass set a different exit code for a subclass of `StorageError` was actually the goal with my recent series.) Differential Revision: https://phab.mercurial-scm.org/D10758

File last commit:

r47478:b1f2c2b3 default
r48085:73f52278 default
Show More
changelog.rs
65 lines | 1.9 KiB | application/rls-services+xml | RustLexer
Simon Sapin
rust: use HgError in RevlogError and Vfs...
r47172 use crate::errors::HgError;
Simon Sapin
rust: introduce Repo and Vfs types for filesystem abstraction...
r46782 use crate::repo::Repo;
Antoine Cezar
hg-core: add `Changlog` a specialized `Revlog`...
r46103 use crate::revlog::revlog::{Revlog, RevlogError};
use crate::revlog::Revision;
Simon Sapin
rhg: `cat` command: print error messages for missing files...
r47478 use crate::revlog::{Node, NodePrefix};
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.
Simon Sapin
rhg: centralize parsing of `--rev` CLI arguments...
r47162 pub(crate) revlog: Revlog,
Antoine Cezar
hg-core: add `Changlog` a specialized `Revlog`...
r46103 }
impl Changelog {
/// Open the `changelog` of a repository given by its root.
Simon Sapin
rust: introduce Repo and Vfs types for filesystem abstraction...
r46782 pub fn open(repo: &Repo) -> Result<Self, RevlogError> {
let revlog = Revlog::open(repo, "00changelog.i", 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: Make NodePrefix allocation-free and Copy, remove NodePrefixRef...
r47160 node: NodePrefix,
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 })
}
Simon Sapin
rhg: `cat` command: print error messages for missing files...
r47478
pub fn node_from_rev(&self, rev: Revision) -> Option<&Node> {
Some(self.revlog.index.get_entry(rev)?.hash())
}
Antoine Cezar
hg-core: add `Changlog` a specialized `Revlog`...
r46103 }
/// `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> {
Simon Sapin
rust: use HgError in RevlogError and Vfs...
r47172 self.lines()
.next()
.ok_or_else(|| HgError::corrupted("empty changelog entry").into())
Antoine Cezar
hg-core: add `Changlog` a specialized `Revlog`...
r46103 }
}