##// END OF EJS Templates
debugdiscovery: add flags to run discovery on subsets of the local repo...
debugdiscovery: add flags to run discovery on subsets of the local repo Generating new repository using strip of local clone is very expensive for large repositories. And such large repository are the most likely to requires debugging around discovery. So we add a simple way to run discovery using provided sets of heads. Differential Revision: https://phab.mercurial-scm.org/D9945

File last commit:

r47172:43d63979 default
r47205:4f5e9a77 default
Show More
cat.rs
75 lines | 2.7 KiB | application/rls-services+xml | RustLexer
Antoine Cezar
hg-core: add a `CatRev` operation...
r46112 // list_tracked_files.rs
//
// Copyright 2020 Antoine Cezar <antoine.cezar@octobus.net>
//
// This software may be used and distributed according to the terms of the
// GNU General Public License version 2 or any later version.
Simon Sapin
rust: introduce Repo and Vfs types for filesystem abstraction...
r46782 use std::path::PathBuf;
Antoine Cezar
hg-core: add a `CatRev` operation...
r46112
Simon Sapin
rust: introduce Repo and Vfs types for filesystem abstraction...
r46782 use crate::repo::Repo;
Antoine Cezar
hg-core: add a `CatRev` operation...
r46112 use crate::revlog::changelog::Changelog;
Simon Sapin
rust: replace most "operation" structs with functions...
r46751 use crate::revlog::manifest::Manifest;
Antoine Cezar
hg-core: add a `CatRev` operation...
r46112 use crate::revlog::path_encode::path_encode;
use crate::revlog::revlog::Revlog;
use crate::revlog::revlog::RevlogError;
Simon Sapin
rust: use NodePrefix::from_hex instead of hex::decode directly...
r46647 use crate::revlog::Node;
Antoine cezar
hg-core: fix path encoding usage...
r46408 use crate::utils::files::get_path_from_bytes;
use crate::utils::hg_path::{HgPath, HgPathBuf};
Antoine Cezar
hg-core: add a `CatRev` operation...
r46112
Antoine cezar
rhg: strip copied files metadata from `cat` output...
r46406 const METADATA_DELIMITER: [u8; 2] = [b'\x01', b'\n'];
Antoine Cezar
hg-core: add a `CatRev` operation...
r46112 /// List files under Mercurial control at a given revision.
Simon Sapin
rust: replace most "operation" structs with functions...
r46751 ///
/// * `root`: Repository root
/// * `rev`: The revision to cat the files from.
/// * `files`: The files to output.
pub fn cat(
Simon Sapin
rust: introduce Repo and Vfs types for filesystem abstraction...
r46782 repo: &Repo,
Simon Sapin
rhg: centralize parsing of `--rev` CLI arguments...
r47162 revset: &str,
Simon Sapin
rust: replace most "operation" structs with functions...
r46751 files: &[HgPathBuf],
Simon Sapin
rust: remove three enums that were identical to `RevlogError`...
r47166 ) -> Result<Vec<u8>, RevlogError> {
Simon Sapin
rhg: centralize parsing of `--rev` CLI arguments...
r47162 let rev = crate::revset::resolve_single(revset, repo)?;
Simon Sapin
rust: introduce Repo and Vfs types for filesystem abstraction...
r46782 let changelog = Changelog::open(repo)?;
let manifest = Manifest::open(repo)?;
Simon Sapin
rhg: centralize parsing of `--rev` CLI arguments...
r47162 let changelog_entry = changelog.get_rev(rev)?;
Simon Sapin
rust: use HgError in RevlogError and Vfs...
r47172 let manifest_node =
Node::from_hex_for_repo(&changelog_entry.manifest_node()?)?;
Simon Sapin
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef...
r47160 let manifest_entry = manifest.get_node(manifest_node.into())?;
Simon Sapin
rust: replace most "operation" structs with functions...
r46751 let mut bytes = vec![];
Antoine Cezar
hg-core: add a `CatRev` operation...
r46112
Simon Sapin
rust: replace most "operation" structs with functions...
r46751 for (manifest_file, node_bytes) in manifest_entry.files_with_nodes() {
for cat_file in files.iter() {
if cat_file.as_bytes() == manifest_file.as_bytes() {
Simon Sapin
rust: introduce Repo and Vfs types for filesystem abstraction...
r46782 let index_path = store_path(manifest_file, b".i");
let data_path = store_path(manifest_file, b".d");
Antoine Cezar
hg-core: add a `CatRev` operation...
r46112
Simon Sapin
rust: introduce Repo and Vfs types for filesystem abstraction...
r46782 let file_log =
Revlog::open(repo, &index_path, Some(&data_path))?;
Simon Sapin
rust: use HgError in RevlogError and Vfs...
r47172 let file_node = Node::from_hex_for_repo(node_bytes)?;
Simon Sapin
rust: Make NodePrefix allocation-free and Copy, remove NodePrefixRef...
r47160 let file_rev = file_log.get_node_rev(file_node.into())?;
Simon Sapin
rust: replace most "operation" structs with functions...
r46751 let data = file_log.get_rev_data(file_rev)?;
if data.starts_with(&METADATA_DELIMITER) {
let end_delimiter_position = data
[METADATA_DELIMITER.len()..]
.windows(METADATA_DELIMITER.len())
.position(|bytes| bytes == METADATA_DELIMITER);
if let Some(position) = end_delimiter_position {
let offset = METADATA_DELIMITER.len() * 2;
bytes.extend(data[position + offset..].iter());
}
} else {
bytes.extend(data);
}
}
}
Antoine Cezar
hg-core: add a `CatRev` operation...
r46112 }
Simon Sapin
rust: replace most "operation" structs with functions...
r46751 Ok(bytes)
Antoine Cezar
hg-core: add a `CatRev` operation...
r46112 }
Antoine cezar
hg-core: fix path encoding usage...
r46408
Simon Sapin
rust: introduce Repo and Vfs types for filesystem abstraction...
r46782 fn store_path(hg_path: &HgPath, suffix: &[u8]) -> PathBuf {
Antoine cezar
hg-core: fix path encoding usage...
r46408 let encoded_bytes =
path_encode(&[b"data/", hg_path.as_bytes(), suffix].concat());
Simon Sapin
rust: introduce Repo and Vfs types for filesystem abstraction...
r46782 get_path_from_bytes(&encoded_bytes).into()
Antoine cezar
hg-core: fix path encoding usage...
r46408 }