comparison rust/hg-core/src/repo.rs @ 47992:796206e74b10

rhg: Reuse manifest when checking status of multiple ambiguous files When `rhg status` cannot determine whether a file is clean based on mtime and size alone, it needs to compare its contents with those found in the parent commit. Previously, rhg would find the (same) manifest of that commit again for every such file. This is lifted out of the loop and reused. Differential Revision: https://phab.mercurial-scm.org/D11411
author Simon Sapin <simon.sapin@octobus.net>
date Mon, 13 Sep 2021 18:09:10 +0200
parents 001d747c2baf
children 87e3f878e65f
comparison
equal deleted inserted replaced
47991:001d747c2baf 47992:796206e74b10
3 use crate::dirstate::DirstateParents; 3 use crate::dirstate::DirstateParents;
4 use crate::dirstate_tree::dirstate_map::DirstateMap; 4 use crate::dirstate_tree::dirstate_map::DirstateMap;
5 use crate::dirstate_tree::owning::OwningDirstateMap; 5 use crate::dirstate_tree::owning::OwningDirstateMap;
6 use crate::errors::HgError; 6 use crate::errors::HgError;
7 use crate::errors::HgResultExt; 7 use crate::errors::HgResultExt;
8 use crate::exit_codes;
8 use crate::manifest::{Manifest, Manifestlog}; 9 use crate::manifest::{Manifest, Manifestlog};
9 use crate::requirements;
10 use crate::revlog::filelog::Filelog; 10 use crate::revlog::filelog::Filelog;
11 use crate::revlog::revlog::RevlogError; 11 use crate::revlog::revlog::RevlogError;
12 use crate::utils::files::get_path_from_bytes; 12 use crate::utils::files::get_path_from_bytes;
13 use crate::utils::hg_path::HgPath; 13 use crate::utils::hg_path::HgPath;
14 use crate::utils::SliceExt; 14 use crate::utils::SliceExt;
15 use crate::vfs::{is_dir, is_file, Vfs}; 15 use crate::vfs::{is_dir, is_file, Vfs};
16 use crate::{exit_codes, Node}; 16 use crate::{requirements, NodePrefix};
17 use crate::{DirstateError, Revision}; 17 use crate::{DirstateError, Revision};
18 use std::cell::{Cell, Ref, RefCell, RefMut}; 18 use std::cell::{Cell, Ref, RefCell, RefMut};
19 use std::collections::HashSet; 19 use std::collections::HashSet;
20 use std::path::{Path, PathBuf}; 20 use std::path::{Path, PathBuf};
21 21
334 334
335 pub fn manifestlog_mut(&self) -> Result<RefMut<Manifestlog>, HgError> { 335 pub fn manifestlog_mut(&self) -> Result<RefMut<Manifestlog>, HgError> {
336 self.manifestlog.get_mut_or_init(self) 336 self.manifestlog.get_mut_or_init(self)
337 } 337 }
338 338
339 /// Returns the manifest of the given node ID
340 pub fn manifest_for_node(
341 &self,
342 node: impl Into<NodePrefix>,
343 ) -> Result<Manifest, RevlogError> {
344 self.manifestlog()?.get_node(
345 self.changelog()?
346 .get_node(node.into())?
347 .manifest_node()?
348 .into(),
349 )
350 }
351
339 /// Returns the manifest of the given revision 352 /// Returns the manifest of the given revision
340 pub fn manifest( 353 pub fn manifest_for_rev(
341 &self, 354 &self,
342 revision: Revision, 355 revision: Revision,
343 ) -> Result<Manifest, RevlogError> { 356 ) -> Result<Manifest, RevlogError> {
344 let changelog = self.changelog()?; 357 self.manifestlog()?.get_node(
345 let manifest = self.manifestlog()?; 358 self.changelog()?.get_rev(revision)?.manifest_node()?.into(),
346 let changelog_entry = changelog.get_rev(revision)?; 359 )
347 let manifest_node =
348 Node::from_hex_for_repo(&changelog_entry.manifest_node()?)?;
349 manifest.get_node(manifest_node.into())
350 } 360 }
351 361
352 pub fn filelog(&self, path: &HgPath) -> Result<Filelog, HgError> { 362 pub fn filelog(&self, path: &HgPath) -> Result<Filelog, HgError> {
353 Filelog::open(self, path) 363 Filelog::open(self, path)
354 } 364 }