##// END OF EJS Templates
windows: use raw string in test log paths...
windows: use raw string in test log paths Otherwise the backslashes will work as escapes on Windows and break everything. Differential Revision: https://phab.mercurial-scm.org/D11725

File last commit:

r48783:87e3f878 default
r49114:7a4d1874 default
Show More
manifest.rs
101 lines | 3.2 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 })
}
Simon Sapin
rust: Rename get_node methods to data_for_node, get_rev to data_for_rev...
r48783 /// Return the `Manifest` for the given node ID.
///
/// Note: this is a node ID in the manifestlog, typically found through
/// `ChangelogEntry::manifest_node`. It is *not* the node ID of any
/// changeset.
///
/// See also `Repo::manifest_for_node`
pub fn data_for_node(
&self,
node: NodePrefix,
) -> Result<Manifest, RevlogError> {
Simon Sapin
rust: Rename the `Revlog::get_node_rev` method to `rev_from_node`...
r48782 let rev = self.revlog.rev_from_node(node)?;
Simon Sapin
rust: Rename get_node methods to data_for_node, get_rev to data_for_rev...
r48783 self.data_for_rev(rev)
Antoine Cezar
hg-core: add `Manifest` a specialized `Revlog`...
r46104 }
Simon Sapin
rust: Rename get_node methods to data_for_node, get_rev to data_for_rev...
r48783 /// Return the `Manifest` of a given revision number.
///
/// Note: this is a revision number in the manifestlog, *not* of any
/// changeset.
///
/// See also `Repo::manifest_for_rev`
pub fn data_for_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 }