##// END OF EJS Templates
rhg: Add lazy/cached dirstate data file ID parsing on Repo...
rhg: Add lazy/cached dirstate data file ID parsing on Repo The `dirstate_parents`, `dirstate_data_file_uuid`, and `dirstate_map` members of `Repo` can be access in any order and the `.hg/dirstate` file should only be opened once. Differential Revision: https://phab.mercurial-scm.org/D11838

File last commit:

r49166:eb428010 default
r49248:c7c23bb0 default
Show More
manifest.rs
119 lines | 3.6 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;
Simon Sapin
rhg: Also parse flags in the manifest parser...
r49166 use crate::utils::SliceExt;
Antoine Cezar
hg-core: add `Manifest` a specialized `Revlog`...
r46104
/// 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 {
Simon Sapin
rhg: Also parse flags in the manifest parser...
r49166 pub fn iter(
&self,
) -> impl Iterator<Item = Result<ManifestEntry, HgError>> {
Antoine Cezar
hg-core: add `Manifest` a specialized `Revlog`...
r46104 self.bytes
.split(|b| b == &b'\n')
.filter(|line| !line.is_empty())
Simon Sapin
rhg: Also parse flags in the manifest parser...
r49166 .map(|line| {
let (path, rest) = line.split_2(b'\0').ok_or_else(|| {
Simon Sapin
rhg: Propogate manifest parse errors instead of panicking...
r49165 HgError::corrupted("manifest line should contain \\0")
})?;
Simon Sapin
rhg: Also parse flags in the manifest parser...
r49166 let path = HgPath::new(path);
let (hex_node_id, flags) = match rest.split_last() {
Some((&b'x', rest)) => (rest, Some(b'x')),
Some((&b'l', rest)) => (rest, Some(b'l')),
Some((&b't', rest)) => (rest, Some(b't')),
_ => (rest, None),
};
Ok(ManifestEntry {
path,
hex_node_id,
flags,
})
})
Antoine Cezar
hg-core: add `files_with_nodes` to `Manifest`...
r46111 }
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
Simon Sapin
rhg: Also parse flags in the manifest parser...
r49166 pub fn find_file(
&self,
path: &HgPath,
) -> Result<Option<ManifestEntry>, HgError> {
Simon Sapin
rhg: Reuse manifest when checking status of multiple ambiguous files...
r48778 // TODO: use binary search instead of linear scan. This may involve
// building (and caching) an index of the byte indicex of each manifest
// line.
Simon Sapin
rhg: Also parse flags in the manifest parser...
r49166
// TODO: use try_find when available (if still using linear scan)
// https://github.com/rust-lang/rust/issues/63178
for entry in self.iter() {
let entry = entry?;
if entry.path == path {
return Ok(Some(entry));
Simon Sapin
rhg: Reuse manifest when checking status of multiple ambiguous files...
r48778 }
}
Ok(None)
}
Antoine Cezar
hg-core: add `Manifest` a specialized `Revlog`...
r46104 }
Simon Sapin
rhg: Also parse flags in the manifest parser...
r49166
/// `Manifestlog` entry which knows how to interpret the `manifest` data bytes.
#[derive(Debug)]
pub struct ManifestEntry<'manifest> {
pub path: &'manifest HgPath,
pub hex_node_id: &'manifest [u8],
/// `Some` values are b'x', b'l', or 't'
pub flags: Option<u8>,
}
impl ManifestEntry<'_> {
pub fn node_id(&self) -> Result<Node, HgError> {
Node::from_hex_for_repo(self.hex_node_id)
}
}