##// END OF EJS Templates
backout: backed out changeset 5d83a40cd3f8...
backout: backed out changeset 5d83a40cd3f8 This is the re-send of the backout in D11757 that I accidentally queued. I'll rewrite the original commit message: ...sigh We do not have Python 3 packaging for thg on Windows where the vast majority of of users use the thg installer for Mercurial. Until this is done (hopefully this cycle), we're keeping Python. (end of the old commit message) On top of this, we have a solid lead to have competent people take care of this packaging issue for us in time for the 6.1 release, which is really the main reason for us to wait. We're trying our best to make this work, so please bear with us. Differential Revision: https://phab.mercurial-scm.org/D11770

File last commit:

r49064:e9faae0f default
r49233:0ad593b6 default
Show More
filelog.rs
88 lines | 2.7 KiB | application/rls-services+xml | RustLexer
Simon Sapin
rust: Add a Filelog struct that wraps Revlog...
r48775 use crate::errors::HgError;
use crate::repo::Repo;
use crate::revlog::path_encode::path_encode;
use crate::revlog::revlog::{Revlog, RevlogError};
use crate::revlog::NodePrefix;
use crate::revlog::Revision;
use crate::utils::files::get_path_from_bytes;
use crate::utils::hg_path::HgPath;
use crate::utils::SliceExt;
use std::path::PathBuf;
/// A specialized `Revlog` to work with file data logs.
pub struct Filelog {
/// The generic `revlog` format.
revlog: Revlog,
}
impl Filelog {
Simon Sapin
rust: Return HgError instead of RevlogError in revlog constructors...
r48777 pub fn open(repo: &Repo, file_path: &HgPath) -> Result<Self, HgError> {
Simon Sapin
rust: Add a Filelog struct that wraps Revlog...
r48775 let index_path = store_path(file_path, b".i");
let data_path = store_path(file_path, b".d");
let revlog = Revlog::open(repo, index_path, Some(&data_path))?;
Ok(Self { revlog })
}
/// The given node ID is that of the file as found in a manifest, not of a
/// changeset.
Simon Sapin
rust: Rename get_node methods to data_for_node, get_rev to data_for_rev...
r48783 pub fn data_for_node(
Simon Sapin
rust: Add a Filelog struct that wraps Revlog...
r48775 &self,
file_node: impl Into<NodePrefix>,
) -> Result<FilelogEntry, RevlogError> {
Simon Sapin
rust: Rename the `Revlog::get_node_rev` method to `rev_from_node`...
r48782 let file_rev = self.revlog.rev_from_node(file_node.into())?;
Simon Sapin
rust: Rename get_node methods to data_for_node, get_rev to data_for_rev...
r48783 self.data_for_rev(file_rev)
Simon Sapin
rust: Add a Filelog struct that wraps Revlog...
r48775 }
/// The given revision is that of the file as found in a manifest, not of a
/// changeset.
Simon Sapin
rust: Rename get_node methods to data_for_node, get_rev to data_for_rev...
r48783 pub fn data_for_rev(
Simon Sapin
rust: Add a Filelog struct that wraps Revlog...
r48775 &self,
file_rev: Revision,
) -> Result<FilelogEntry, RevlogError> {
Arseniy Alekseyev
rhg: internally, return a structured representation from hg cat...
r49051 let data: Vec<u8> = self.revlog.get_rev_data(file_rev)?;
Simon Sapin
rust: Add a Filelog struct that wraps Revlog...
r48775 Ok(FilelogEntry(data.into()))
}
}
fn store_path(hg_path: &HgPath, suffix: &[u8]) -> PathBuf {
let encoded_bytes =
path_encode(&[b"data/", hg_path.as_bytes(), suffix].concat());
get_path_from_bytes(&encoded_bytes).into()
}
Arseniy Alekseyev
rhg: internally, return a structured representation from hg cat...
r49051 pub struct FilelogEntry(Vec<u8>);
Simon Sapin
rust: Add a Filelog struct that wraps Revlog...
r48775
Arseniy Alekseyev
rhg: internally, return a structured representation from hg cat...
r49051 impl FilelogEntry {
Simon Sapin
rust: Add a Filelog struct that wraps Revlog...
r48775 /// Split into metadata and data
Arseniy Alekseyev
rhg: simplify split_metadata...
r49064 pub fn split(&self) -> Result<(Option<&[u8]>, &[u8]), HgError> {
Simon Sapin
rust: Add a Filelog struct that wraps Revlog...
r48775 const DELIMITER: &[u8; 2] = &[b'\x01', b'\n'];
if let Some(rest) = self.0.drop_prefix(DELIMITER) {
if let Some((metadata, data)) = rest.split_2_by_slice(DELIMITER) {
Arseniy Alekseyev
rhg: simplify split_metadata...
r49064 Ok((Some(metadata), data))
Simon Sapin
rust: Add a Filelog struct that wraps Revlog...
r48775 } else {
Err(HgError::corrupted(
"Missing metadata end delimiter in filelog entry",
))
}
} else {
Ok((None, &self.0))
}
}
/// Returns the file contents at this revision, stripped of any metadata
pub fn data(&self) -> Result<&[u8], HgError> {
let (_metadata, data) = self.split()?;
Ok(data)
}
Arseniy Alekseyev
rhg: internally, return a structured representation from hg cat...
r49051
/// Consume the entry, and convert it into data, discarding any metadata,
/// if present.
pub fn into_data(self) -> Result<Vec<u8>, HgError> {
Arseniy Alekseyev
rhg: simplify split_metadata...
r49064 if let (Some(_metadata), data) = self.split()? {
Arseniy Alekseyev
rhg: internally, return a structured representation from hg cat...
r49051 Ok(data.to_owned())
} else {
Ok(self.0)
}
}
Simon Sapin
rust: Add a Filelog struct that wraps Revlog...
r48775 }