# HG changeset patch # User Simon Sapin # Date 1617090964 -7200 # Node ID 473abf4728bf1ef68a988394b69099417db245a8 # Parent e061a1df32a8ee4663e31ed521d022b03cf2681d dirstate-tree: Empty shell for a second Rust DirstateMap implementation For background see description of the previous changeset "Make Rust DirstateMap bindings go through a trait object". Add an empty shell for a opt-in second Rust implementation of the `DirstateMap` type and the `status` function. For now all methods panic. This can be seen in "action" with: ./hg status --config experimental.dirstate-tree.in-memory=1 Differential Revision: https://phab.mercurial-scm.org/D10364 diff -r e061a1df32a8 -r 473abf4728bf mercurial/configitems.py --- a/mercurial/configitems.py Thu Apr 08 14:58:44 2021 +0200 +++ b/mercurial/configitems.py Tue Mar 30 09:56:04 2021 +0200 @@ -959,6 +959,11 @@ ) coreconfigitem( b'experimental', + b'dirstate-tree.in-memory', + default=False, +) +coreconfigitem( + b'experimental', b'editortmpinhg', default=False, ) diff -r e061a1df32a8 -r 473abf4728bf mercurial/dirstate.py --- a/mercurial/dirstate.py Thu Apr 08 14:58:44 2021 +0200 +++ b/mercurial/dirstate.py Tue Mar 30 09:56:04 2021 +0200 @@ -1790,7 +1790,12 @@ Does not fill the Dirstatemap when called. This allows for optimizations where only setting/getting the parents is needed. """ - self._inner_rustmap = rustmod.DirstateMap(self._root) + use_dirstate_tree = self._ui.configbool( + b"experimental", + b"dirstate-tree.in-memory", + False, + ) + self._inner_rustmap = rustmod.DirstateMap(use_dirstate_tree) return self._inner_rustmap @property diff -r e061a1df32a8 -r 473abf4728bf rust/hg-core/src/dirstate_tree.rs --- a/rust/hg-core/src/dirstate_tree.rs Thu Apr 08 14:58:44 2021 +0200 +++ b/rust/hg-core/src/dirstate_tree.rs Tue Mar 30 09:56:04 2021 +0200 @@ -1,1 +1,2 @@ +pub mod dirstate_map; pub mod dispatch; diff -r e061a1df32a8 -r 473abf4728bf rust/hg-core/src/dirstate_tree/dirstate_map.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/rust/hg-core/src/dirstate_tree/dirstate_map.rs Tue Mar 30 09:56:04 2021 +0200 @@ -0,0 +1,216 @@ +use std::path::PathBuf; +use std::time::Duration; + +use crate::matchers::Matcher; +use crate::utils::hg_path::{HgPath, HgPathBuf}; +use crate::CopyMapIter; +use crate::DirstateEntry; +use crate::DirstateError; +use crate::DirstateMapError; +use crate::DirstateParents; +use crate::DirstateStatus; +use crate::EntryState; +use crate::FastHashMap; +use crate::HgPathCow; +use crate::PatternFileWarning; +use crate::StateMapIter; +use crate::StatusError; +use crate::StatusOptions; + +pub struct DirstateMap { + // TODO +} + +impl DirstateMap { + pub fn new() -> Self { + todo!() + } +} + +impl super::dispatch::DirstateMapMethods for DirstateMap { + fn clear(&mut self) { + todo!() + } + + fn add_file( + &mut self, + _filename: &HgPath, + _old_state: EntryState, + _entry: DirstateEntry, + ) -> Result<(), DirstateMapError> { + todo!() + } + + fn remove_file( + &mut self, + _filename: &HgPath, + _old_state: EntryState, + _size: i32, + ) -> Result<(), DirstateMapError> { + todo!() + } + + fn drop_file( + &mut self, + _filename: &HgPath, + _old_state: EntryState, + ) -> Result { + todo!() + } + + fn clear_ambiguous_times( + &mut self, + _filenames: Vec, + _now: i32, + ) { + todo!() + } + + fn non_normal_entries_contains(&mut self, _key: &HgPath) -> bool { + todo!() + } + + fn non_normal_entries_remove(&mut self, _key: &HgPath) -> bool { + todo!() + } + + fn non_normal_or_other_parent_paths( + &mut self, + ) -> Box + '_> { + todo!() + } + + fn set_non_normal_other_parent_entries(&mut self, _force: bool) { + todo!() + } + + fn iter_non_normal_paths( + &mut self, + ) -> Box + Send + '_> { + todo!() + } + + fn iter_non_normal_paths_panic( + &self, + ) -> Box + Send + '_> { + todo!() + } + + fn iter_other_parent_paths( + &mut self, + ) -> Box + Send + '_> { + todo!() + } + + fn has_tracked_dir( + &mut self, + _directory: &HgPath, + ) -> Result { + todo!() + } + + fn has_dir( + &mut self, + _directory: &HgPath, + ) -> Result { + todo!() + } + + fn parents( + &mut self, + _file_contents: &[u8], + ) -> Result<&DirstateParents, DirstateError> { + todo!() + } + + fn set_parents(&mut self, _parents: &DirstateParents) { + todo!() + } + + fn read<'a>( + &mut self, + _file_contents: &'a [u8], + ) -> Result, DirstateError> { + todo!() + } + + fn pack( + &mut self, + _parents: DirstateParents, + _now: Duration, + ) -> Result, DirstateError> { + todo!() + } + + fn build_file_fold_map(&mut self) -> &FastHashMap { + todo!() + } + + fn set_all_dirs(&mut self) -> Result<(), DirstateMapError> { + todo!() + } + + fn set_dirs(&mut self) -> Result<(), DirstateMapError> { + todo!() + } + + fn status<'a>( + &'a self, + _matcher: &'a (dyn Matcher + Sync), + _root_dir: PathBuf, + _ignore_files: Vec, + _options: StatusOptions, + ) -> Result< + ( + (Vec>, DirstateStatus<'a>), + Vec, + ), + StatusError, + > { + todo!() + } + + fn copy_map_len(&self) -> usize { + todo!() + } + + fn copy_map_iter(&self) -> CopyMapIter<'_> { + todo!() + } + + fn copy_map_contains_key(&self, _key: &HgPath) -> bool { + todo!() + } + + fn copy_map_get(&self, _key: &HgPath) -> Option<&HgPathBuf> { + todo!() + } + + fn copy_map_remove(&mut self, _key: &HgPath) -> Option { + todo!() + } + + fn copy_map_insert( + &mut self, + _key: HgPathBuf, + _value: HgPathBuf, + ) -> Option { + todo!() + } + + fn len(&self) -> usize { + todo!() + } + + fn contains_key(&self, _key: &HgPath) -> bool { + todo!() + } + + fn get(&self, _key: &HgPath) -> Option<&DirstateEntry> { + todo!() + } + + fn iter(&self) -> StateMapIter<'_> { + todo!() + } +} diff -r e061a1df32a8 -r 473abf4728bf rust/hg-cpython/src/dirstate/dirstate_map.rs --- a/rust/hg-cpython/src/dirstate/dirstate_map.rs Thu Apr 08 14:58:44 2021 +0200 +++ b/rust/hg-cpython/src/dirstate/dirstate_map.rs Tue Mar 30 09:56:04 2021 +0200 @@ -50,8 +50,12 @@ py_class!(pub class DirstateMap |py| { @shared data inner: Box; - def __new__(_cls, _root: PyObject) -> PyResult { - let inner = Box::new(RustDirstateMap::default()); + def __new__(_cls, use_dirstate_tree: bool) -> PyResult { + let inner = if use_dirstate_tree { + Box::new(hg::dirstate_tree::dirstate_map::DirstateMap::new()) as _ + } else { + Box::new(RustDirstateMap::default()) as _ + }; Self::create_instance(py, inner) }