##// END OF EJS Templates
rust: Make private the `index` field of the `Revlog` struct...
rust: Make private the `index` field of the `Revlog` struct To replace the previous use of this field from another module, add a `node_from_rev` method. This is the same method that already existed on `Changelog`. Differential Revision: https://phab.mercurial-scm.org/D11414

File last commit:

r48778:796206e7 default
r48781:6c653d9d default
Show More
manifest.rs
84 lines | 2.8 KiB | application/rls-services+xml | RustLexer
Simon Sapin
rust: Return HgError instead of RevlogError in revlog constructors...
r48777 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 `Manifest` a specialized `Revlog`...
r46104 use crate::revlog::revlog::{Revlog, RevlogError};
use crate::revlog::Revision;
Simon Sapin
rhg: Reuse manifest when checking status of multiple ambiguous files...
r48778 use crate::revlog::{Node, NodePrefix};
Antoine Cezar
hg-core: add `Manifest` a specialized `Revlog`...
r46104 use crate::utils::hg_path::HgPath;
/// A specialized `Revlog` to work with `manifest` data format.
Simon Sapin
rust: Rename Manifest to Manifestlog, ManifestEntry to Manifest...
r48771 pub struct Manifestlog {
Antoine Cezar
hg-core: add `Manifest` a specialized `Revlog`...
r46104 /// The generic `revlog` format.
revlog: Revlog,
}
Simon Sapin
rust: Rename Manifest to Manifestlog, ManifestEntry to Manifest...
r48771 impl Manifestlog {
Antoine Cezar
hg-core: add `Manifest` a specialized `Revlog`...
r46104 /// Open the `manifest` of a repository given by its root.
Simon Sapin
rust: Return HgError instead of RevlogError in revlog constructors...
r48777 pub fn open(repo: &Repo) -> Result<Self, HgError> {
Simon Sapin
rust: introduce Repo and Vfs types for filesystem abstraction...
r46782 let revlog = Revlog::open(repo, "00manifest.i", None)?;
Antoine Cezar
hg-core: add `Manifest` a specialized `Revlog`...
r46104 Ok(Self { revlog })
}
/// Return the `ManifestEntry` of a given node id.
Simon Sapin
rust: Rename Manifest to Manifestlog, ManifestEntry to Manifest...
r48771 pub fn get_node(&self, node: NodePrefix) -> Result<Manifest, RevlogError> {
Antoine Cezar
hg-core: add `Manifest` a specialized `Revlog`...
r46104 let rev = self.revlog.get_node_rev(node)?;
self.get_rev(rev)
}
/// Return the `ManifestEntry` of a given node revision.
Simon Sapin
rust: Rename Manifest to Manifestlog, ManifestEntry to Manifest...
r48771 pub fn get_rev(&self, rev: Revision) -> Result<Manifest, RevlogError> {
Antoine Cezar
hg-core: add `Manifest` a specialized `Revlog`...
r46104 let bytes = self.revlog.get_rev_data(rev)?;
Simon Sapin
rust: Rename Manifest to Manifestlog, ManifestEntry to Manifest...
r48771 Ok(Manifest { bytes })
Antoine Cezar
hg-core: add `Manifest` a specialized `Revlog`...
r46104 }
}
Simon Sapin
rust: Rename Manifest to Manifestlog, ManifestEntry to Manifest...
r48771 /// `Manifestlog` entry which knows how to interpret the `manifest` data bytes.
Antoine Cezar
hg-core: add `Manifest` a specialized `Revlog`...
r46104 #[derive(Debug)]
Simon Sapin
rust: Rename Manifest to Manifestlog, ManifestEntry to Manifest...
r48771 pub struct Manifest {
Antoine Cezar
hg-core: add `Manifest` a specialized `Revlog`...
r46104 bytes: Vec<u8>,
}
Simon Sapin
rust: Rename Manifest to Manifestlog, ManifestEntry to Manifest...
r48771 impl Manifest {
Antoine Cezar
hg-core: add `Manifest` a specialized `Revlog`...
r46104 /// 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 an iterator over the files of the entry.
pub fn files(&self) -> impl Iterator<Item = &HgPath> {
self.lines().filter(|line| !line.is_empty()).map(|line| {
let pos = line
.iter()
.position(|x| x == &b'\0')
.expect("manifest line should contain \\0");
HgPath::new(&line[..pos])
})
}
Antoine Cezar
hg-core: add `files_with_nodes` to `Manifest`...
r46111
/// Return an iterator over the files of the entry.
pub fn files_with_nodes(&self) -> impl Iterator<Item = (&HgPath, &[u8])> {
self.lines().filter(|line| !line.is_empty()).map(|line| {
let pos = line
.iter()
.position(|x| x == &b'\0')
.expect("manifest line should contain \\0");
let hash_start = pos + 1;
let hash_end = hash_start + 40;
(HgPath::new(&line[..pos]), &line[hash_start..hash_end])
})
}
Simon Sapin
rhg: Reuse manifest when checking status of multiple ambiguous files...
r48778
/// If the given path is in this manifest, return its filelog node ID
pub fn find_file(&self, path: &HgPath) -> Result<Option<Node>, HgError> {
// TODO: use binary search instead of linear scan. This may involve
// building (and caching) an index of the byte indicex of each manifest
// line.
for (manifest_path, node) in self.files_with_nodes() {
if manifest_path == path {
return Ok(Some(Node::from_hex_for_repo(node)?));
}
}
Ok(None)
}
Antoine Cezar
hg-core: add `Manifest` a specialized `Revlog`...
r46104 }