##// END OF EJS Templates
dirstate-tree: Skip readdir() in `hg status -mard`...
dirstate-tree: Skip readdir() in `hg status -mard` When running the status algorithm in a mode where we don’t list unknown or ignored files, all we care about are files that are listed in the dirstate. We can there for skip making expensive calls to readdir() to list the contents of filesystem directories, and instead only run stat() to get the filesystem state of files listed in the dirstate. (This state may be an error for files that don’t exist anymore on the filesystem.) On 16 CPU threads, this reduces the time spent in the `status()` function for `hg status -mard` on an old snapshot of mozilla-central from ~70ms to ~50ms. Differential Revision: https://phab.mercurial-scm.org/D10752

File last commit:

r48126:ed1583a8 default
r48129:f27f2afb default
Show More
dispatch.rs
353 lines | 8.9 KiB | application/rls-services+xml | RustLexer
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 use std::path::PathBuf;
Simon Sapin
rust: Add a Timestamp struct instead of abusing Duration...
r47871 use crate::dirstate::parsers::Timestamp;
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 use crate::dirstate_tree::on_disk::DirstateV2ParseError;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 use crate::matchers::Matcher;
use crate::utils::hg_path::{HgPath, HgPathBuf};
use crate::CopyMapIter;
use crate::DirstateEntry;
use crate::DirstateError;
use crate::DirstateMap;
use crate::DirstateParents;
use crate::DirstateStatus;
use crate::EntryState;
use crate::PatternFileWarning;
use crate::StateMapIter;
use crate::StatusError;
use crate::StatusOptions;
pub trait DirstateMapMethods {
fn clear(&mut self);
fn add_file(
&mut self,
filename: &HgPath,
old_state: EntryState,
entry: DirstateEntry,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Result<(), DirstateError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
fn remove_file(
&mut self,
filename: &HgPath,
old_state: EntryState,
size: i32,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Result<(), DirstateError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
fn drop_file(
&mut self,
filename: &HgPath,
old_state: EntryState,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Result<bool, DirstateError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn clear_ambiguous_times(
&mut self,
filenames: Vec<HgPathBuf>,
now: i32,
) -> Result<(), DirstateV2ParseError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn non_normal_entries_contains(
&mut self,
key: &HgPath,
) -> Result<bool, DirstateV2ParseError>;
Simon Sapin
dirstate-tree: Abstract "non-normal" and "other parent" sets...
r47864
Simon Sapin
dirstate-tree: Add "non normal" and "from other parent" sets...
r47878 fn non_normal_entries_remove(&mut self, key: &HgPath);
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
Simon Sapin
dirstate-tree: Abstract "non-normal" and "other parent" sets...
r47864 fn non_normal_or_other_parent_paths(
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 &mut self,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Box<dyn Iterator<Item = Result<&HgPath, DirstateV2ParseError>> + '_>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
fn set_non_normal_other_parent_entries(&mut self, force: bool);
Simon Sapin
dirstate-tree: Abstract "non-normal" and "other parent" sets...
r47864 fn iter_non_normal_paths(
&mut self,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Box<
dyn Iterator<Item = Result<&HgPath, DirstateV2ParseError>> + Send + '_,
>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
Simon Sapin
dirstate-tree: Abstract "non-normal" and "other parent" sets...
r47864 fn iter_non_normal_paths_panic(
&self,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Box<
dyn Iterator<Item = Result<&HgPath, DirstateV2ParseError>> + Send + '_,
>;
Simon Sapin
dirstate-tree: Abstract "non-normal" and "other parent" sets...
r47864
fn iter_other_parent_paths(
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 &mut self,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Box<
dyn Iterator<Item = Result<&HgPath, DirstateV2ParseError>> + Send + '_,
>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
fn has_tracked_dir(
&mut self,
directory: &HgPath,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Result<bool, DirstateError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn has_dir(&mut self, directory: &HgPath) -> Result<bool, DirstateError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
Simon Sapin
dirstate-v2: Change the on-disk format when the requirement is enabled...
r48055 fn pack_v1(
&mut self,
parents: DirstateParents,
now: Timestamp,
) -> Result<Vec<u8>, DirstateError>;
fn pack_v2(
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 &mut self,
parents: DirstateParents,
Simon Sapin
rust: Add a Timestamp struct instead of abusing Duration...
r47871 now: Timestamp,
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 ) -> Result<Vec<u8>, DirstateError>;
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn set_all_dirs(&mut self) -> Result<(), DirstateError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn set_dirs(&mut self) -> Result<(), DirstateError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
fn status<'a>(
Simon Sapin
dirstate-tree: Give to `status()` mutable access to the `DirstateMap`...
r47882 &'a mut self,
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 matcher: &'a (dyn Matcher + Sync),
root_dir: PathBuf,
ignore_files: Vec<PathBuf>,
options: StatusOptions,
Simon Sapin
rust: Move "lookup" a.k.a. "unsure" paths into `DirstateStatus` struct...
r47880 ) -> Result<(DirstateStatus<'a>, Vec<PatternFileWarning>), StatusError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
fn copy_map_len(&self) -> usize;
fn copy_map_iter(&self) -> CopyMapIter<'_>;
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn copy_map_contains_key(
&self,
key: &HgPath,
) -> Result<bool, DirstateV2ParseError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn copy_map_get(
&self,
key: &HgPath,
) -> Result<Option<&HgPath>, DirstateV2ParseError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn copy_map_remove(
&mut self,
key: &HgPath,
) -> Result<Option<HgPathBuf>, DirstateV2ParseError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
fn copy_map_insert(
&mut self,
key: HgPathBuf,
value: HgPathBuf,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Result<Option<HgPathBuf>, DirstateV2ParseError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
fn len(&self) -> usize;
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn contains_key(&self, key: &HgPath)
-> Result<bool, DirstateV2ParseError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn get(
&self,
key: &HgPath,
) -> Result<Option<DirstateEntry>, DirstateV2ParseError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
fn iter(&self) -> StateMapIter<'_>;
}
impl DirstateMapMethods for DirstateMap {
fn clear(&mut self) {
self.clear()
}
fn add_file(
&mut self,
filename: &HgPath,
old_state: EntryState,
entry: DirstateEntry,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Result<(), DirstateError> {
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 self.add_file(filename, old_state, entry)
}
fn remove_file(
&mut self,
filename: &HgPath,
old_state: EntryState,
size: i32,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Result<(), DirstateError> {
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 self.remove_file(filename, old_state, size)
}
fn drop_file(
&mut self,
filename: &HgPath,
old_state: EntryState,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Result<bool, DirstateError> {
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 self.drop_file(filename, old_state)
}
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn clear_ambiguous_times(
&mut self,
filenames: Vec<HgPathBuf>,
now: i32,
) -> Result<(), DirstateV2ParseError> {
Ok(self.clear_ambiguous_times(filenames, now))
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 }
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn non_normal_entries_contains(
&mut self,
key: &HgPath,
) -> Result<bool, DirstateV2ParseError> {
Simon Sapin
dirstate-tree: Abstract "non-normal" and "other parent" sets...
r47864 let (non_normal, _other_parent) =
self.get_non_normal_other_parent_entries();
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 Ok(non_normal.contains(key))
Simon Sapin
dirstate-tree: Abstract "non-normal" and "other parent" sets...
r47864 }
Simon Sapin
dirstate-tree: Add "non normal" and "from other parent" sets...
r47878 fn non_normal_entries_remove(&mut self, key: &HgPath) {
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 self.non_normal_entries_remove(key)
}
Simon Sapin
dirstate-tree: Abstract "non-normal" and "other parent" sets...
r47864 fn non_normal_or_other_parent_paths(
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 &mut self,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Box<dyn Iterator<Item = Result<&HgPath, DirstateV2ParseError>> + '_>
{
Simon Sapin
dirstate-tree: Abstract "non-normal" and "other parent" sets...
r47864 let (non_normal, other_parent) =
self.get_non_normal_other_parent_entries();
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 Box::new(non_normal.union(other_parent).map(|p| Ok(&**p)))
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 }
fn set_non_normal_other_parent_entries(&mut self, force: bool) {
self.set_non_normal_other_parent_entries(force)
}
Simon Sapin
dirstate-tree: Abstract "non-normal" and "other parent" sets...
r47864 fn iter_non_normal_paths(
&mut self,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Box<
dyn Iterator<Item = Result<&HgPath, DirstateV2ParseError>> + Send + '_,
> {
Simon Sapin
dirstate-tree: Abstract "non-normal" and "other parent" sets...
r47864 let (non_normal, _other_parent) =
self.get_non_normal_other_parent_entries();
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 Box::new(non_normal.iter().map(|p| Ok(&**p)))
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 }
Simon Sapin
dirstate-tree: Abstract "non-normal" and "other parent" sets...
r47864 fn iter_non_normal_paths_panic(
&self,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Box<
dyn Iterator<Item = Result<&HgPath, DirstateV2ParseError>> + Send + '_,
> {
Simon Sapin
dirstate-tree: Abstract "non-normal" and "other parent" sets...
r47864 let (non_normal, _other_parent) =
self.get_non_normal_other_parent_entries_panic();
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 Box::new(non_normal.iter().map(|p| Ok(&**p)))
Simon Sapin
dirstate-tree: Abstract "non-normal" and "other parent" sets...
r47864 }
fn iter_other_parent_paths(
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 &mut self,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Box<
dyn Iterator<Item = Result<&HgPath, DirstateV2ParseError>> + Send + '_,
> {
Simon Sapin
dirstate-tree: Abstract "non-normal" and "other parent" sets...
r47864 let (_non_normal, other_parent) =
self.get_non_normal_other_parent_entries();
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 Box::new(other_parent.iter().map(|p| Ok(&**p)))
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 }
fn has_tracked_dir(
&mut self,
directory: &HgPath,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Result<bool, DirstateError> {
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 self.has_tracked_dir(directory)
}
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn has_dir(&mut self, directory: &HgPath) -> Result<bool, DirstateError> {
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 self.has_dir(directory)
}
Simon Sapin
dirstate-v2: Change the on-disk format when the requirement is enabled...
r48055 fn pack_v1(
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 &mut self,
parents: DirstateParents,
Simon Sapin
rust: Add a Timestamp struct instead of abusing Duration...
r47871 now: Timestamp,
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 ) -> Result<Vec<u8>, DirstateError> {
self.pack(parents, now)
}
Simon Sapin
dirstate-v2: Change the on-disk format when the requirement is enabled...
r48055 fn pack_v2(
&mut self,
_parents: DirstateParents,
_now: Timestamp,
) -> Result<Vec<u8>, DirstateError> {
panic!(
"should have used dirstate_tree::DirstateMap to use the v2 format"
)
}
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn set_all_dirs(&mut self) -> Result<(), DirstateError> {
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 self.set_all_dirs()
}
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn set_dirs(&mut self) -> Result<(), DirstateError> {
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 self.set_dirs()
}
fn status<'a>(
Simon Sapin
dirstate-tree: Give to `status()` mutable access to the `DirstateMap`...
r47882 &'a mut self,
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 matcher: &'a (dyn Matcher + Sync),
root_dir: PathBuf,
ignore_files: Vec<PathBuf>,
options: StatusOptions,
Simon Sapin
rust: Move "lookup" a.k.a. "unsure" paths into `DirstateStatus` struct...
r47880 ) -> Result<(DirstateStatus<'a>, Vec<PatternFileWarning>), StatusError>
{
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 crate::status(self, matcher, root_dir, ignore_files, options)
}
fn copy_map_len(&self) -> usize {
self.copy_map.len()
}
fn copy_map_iter(&self) -> CopyMapIter<'_> {
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 Box::new(
self.copy_map
.iter()
.map(|(key, value)| Ok((&**key, &**value))),
)
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 }
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn copy_map_contains_key(
&self,
key: &HgPath,
) -> Result<bool, DirstateV2ParseError> {
Ok(self.copy_map.contains_key(key))
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 }
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn copy_map_get(
&self,
key: &HgPath,
) -> Result<Option<&HgPath>, DirstateV2ParseError> {
Ok(self.copy_map.get(key).map(|p| &**p))
}
fn copy_map_remove(
&mut self,
key: &HgPath,
) -> Result<Option<HgPathBuf>, DirstateV2ParseError> {
Ok(self.copy_map.remove(key))
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 }
fn copy_map_insert(
&mut self,
key: HgPathBuf,
value: HgPathBuf,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Result<Option<HgPathBuf>, DirstateV2ParseError> {
Ok(self.copy_map.insert(key, value))
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 }
fn len(&self) -> usize {
(&**self).len()
}
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn contains_key(
&self,
key: &HgPath,
) -> Result<bool, DirstateV2ParseError> {
Ok((&**self).contains_key(key))
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 }
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 fn get(
&self,
key: &HgPath,
) -> Result<Option<DirstateEntry>, DirstateV2ParseError> {
Ok((&**self).get(key).cloned())
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 }
fn iter(&self) -> StateMapIter<'_> {
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 Box::new((&**self).iter().map(|(key, value)| Ok((&**key, *value))))
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 }
}