##// END OF EJS Templates
dirstate-v2: Support appending to the same data file...
dirstate-v2: Support appending to the same data file For now we’re still writing the entire data every time, so appending is not useful yet. Later we’ll have new nodes pointing to some existing data for nodes and paths that haven’t changed. The decision whether to append is pseudo-random in order to make tests exercise both code paths. This will be replaced by a heuristic based on the amount of unused existing data. Differential Revision: https://phab.mercurial-scm.org/D11094

File last commit:

r48478:065e6162 default
r48478:065e6162 default
Show More
dispatch.rs
491 lines | 15.4 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::PatternFileWarning;
use crate::StateMapIter;
use crate::StatusError;
use crate::StatusOptions;
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// `rust/hg-cpython/src/dirstate/dirstate_map.rs` implements in Rust a
/// `DirstateMap` Python class that wraps `Box<dyn DirstateMapMethods + Send>`,
/// a trait object of this trait. Except for constructors, this trait defines
/// all APIs that the class needs to interact with its inner dirstate map.
///
/// A trait object is used to support two different concrete types:
///
/// * `rust/hg-core/src/dirstate/dirstate_map.rs` defines the "flat dirstate
/// map" which is based on a few large `HgPath`-keyed `HashMap` and `HashSet`
/// fields.
/// * `rust/hg-core/src/dirstate_tree/dirstate_map.rs` defines the "tree
/// dirstate map" based on a tree data struture with nodes for directories
/// containing child nodes for their files and sub-directories. This tree
/// enables a more efficient algorithm for `hg status`, but its details are
/// abstracted in this trait.
///
/// The dirstate map associates paths of files in the working directory to
/// various information about the state of those files.
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 pub trait DirstateMapMethods {
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Remove information about all files in this map
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 fn clear(&mut self);
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Add or change the information associated to a given file.
///
/// `old_state` is the state in the entry that `get` would have returned
/// before this call, or `EntryState::Unknown` if there was no such entry.
///
/// `entry.state` should never be `EntryState::Unknown`.
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 fn add_file(
&mut self,
filename: &HgPath,
entry: DirstateEntry,
dirstate: use a `added` parameter to _addpath...
r48314 added: bool,
dirstate: use a `merged` parameter to _addpath...
r48316 merged: bool,
dirstate: move the handling of special case within the dirstatemap...
r48310 from_p2: bool,
possibly_dirty: bool,
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
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Mark a file as "removed" (as in `hg rm`).
///
/// `old_state` is the state in the entry that `get` would have returned
/// before this call, or `EntryState::Unknown` if there was no such entry.
///
/// `size` is not actually a size but the 0 or -1 or -2 value that would be
/// put in the size field in the dirstate-v1 format.
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 fn remove_file(
&mut self,
filename: &HgPath,
dirstate: move most of the `remove` logic with dirstatemap `removefile`...
r48300 in_merge: bool,
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
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Drop information about this file from the map if any, and return
/// whether there was any.
///
/// `get` will now return `None` for this filename.
///
/// `old_state` is the state in the entry that `get` would have returned
/// before this call, or `EntryState::Unknown` if there was no such entry.
dirstate: no longer pass `oldstate` to the `dropfile`...
r48324 fn drop_file(&mut self, filename: &HgPath) -> Result<bool, DirstateError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Among given files, mark the stored `mtime` as ambiguous if there is one
/// (if `state == EntryState::Normal`) equal to the given current Unix
/// timestamp.
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
rust: Document the DirstateMapMethods trait...
r48285 /// Return whether the map has an "non-normal" entry for the given
/// filename. That is, any entry with a `state` other than
/// `EntryState::Normal` or with an ambiguous `mtime`.
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
rust: Document the DirstateMapMethods trait...
r48285 /// Mark the given path as "normal" file. This is only relevant in the flat
/// dirstate map where there is a separate `HashSet` that needs to be kept
/// up to date.
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
rust: Document the DirstateMapMethods trait...
r48285 /// Return an iterator of paths whose respective entry are either
/// "non-normal" (see `non_normal_entries_contains`) or "from other
/// parent".
///
/// If that information is cached, create the cache as needed.
///
/// "From other parent" is defined as `state == Normal && size == -2`.
///
/// Because parse errors can happen during iteration, the iterated items
/// are `Result`s.
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
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Create the cache for `non_normal_or_other_parent_paths` if needed.
///
/// If `force` is true, the cache is re-created even if it already exists.
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
rust: Document the DirstateMapMethods trait...
r48285 /// Return an iterator of paths whose respective entry are "non-normal"
/// (see `non_normal_entries_contains`).
///
/// If that information is cached, create the cache as needed.
///
/// Because parse errors can happen during iteration, the iterated items
/// are `Result`s.
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
rust: Document the DirstateMapMethods trait...
r48285 /// Same as `iter_non_normal_paths`, but takes `&self` instead of `&mut
/// self`.
///
/// Panics if a cache is necessary but does not exist yet.
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
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Return an iterator of paths whose respective entry are "from other
/// parent".
///
/// If that information is cached, create the cache as needed.
///
/// "From other parent" is defined as `state == Normal && size == -2`.
///
/// Because parse errors can happen during iteration, the iterated items
/// are `Result`s.
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
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Returns whether the sub-tree rooted at the given directory contains any
/// tracked file.
///
/// A file is tracked if it has a `state` other than `EntryState::Removed`.
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
rust: Document the DirstateMapMethods trait...
r48285 /// Returns whether the sub-tree rooted at the given directory contains any
/// file with a dirstate entry.
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
rust: Document the DirstateMapMethods trait...
r48285 /// Clear mtimes that are ambigous with `now` (similar to
/// `clear_ambiguous_times` but for all files in the dirstate map), and
/// serialize bytes to write the `.hg/dirstate` file to disk in dirstate-v1
/// format.
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>;
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Clear mtimes that are ambigous with `now` (similar to
/// `clear_ambiguous_times` but for all files in the dirstate map), and
Simon Sapin
dirstate-v2: Support appending to the same data file...
r48478 /// serialize bytes to write a dirstate data file to disk in dirstate-v2
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// format.
///
Simon Sapin
dirstate-v2: Support appending to the same data file...
r48478 /// Returns new data together with whether that data should be appended to
/// the existing data file whose content is at `self.on_disk` (true),
/// instead of written to a new data file (false).
///
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Note: this is only supported by the tree dirstate map.
Simon Sapin
dirstate-v2: Support appending to the same data file...
r48478 fn pack_v2(
&mut self,
now: Timestamp,
can_append: bool,
) -> Result<(Vec<u8>, bool), DirstateError>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Run the status algorithm.
///
/// This is not sematically a method of the dirstate map, but a different
/// algorithm is used for the flat v.s. tree dirstate map so having it in
/// this trait enables the same dynamic dispatch as with other methods.
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
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Returns how many files in the dirstate map have a recorded copy source.
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 fn copy_map_len(&self) -> usize;
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Returns an iterator of `(path, copy_source)` for all files that have a
/// copy source.
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 fn copy_map_iter(&self) -> CopyMapIter<'_>;
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Returns whether the givef file has a copy source.
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
rust: Document the DirstateMapMethods trait...
r48285 /// Returns the copy source for the given file.
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
rust: Document the DirstateMapMethods trait...
r48285 /// Removes the recorded copy source if any for the given file, and returns
/// it.
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
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Set the given `value` copy source for the given `key` file.
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
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Returns the number of files that have an entry.
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 fn len(&self) -> usize;
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Returns whether the given file has an entry.
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
rust: Document the DirstateMapMethods trait...
r48285 /// Returns the entry, if any, for the given file.
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
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// Returns a `(path, entry)` iterator of files that have an entry.
///
/// Because parse errors can happen during iteration, the iterated items
/// are `Result`s.
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 fn iter(&self) -> StateMapIter<'_>;
Simon Sapin
dirstate-v2: Add --dirs to debugdirstate command...
r48140
Simon Sapin
rust: Document the DirstateMapMethods trait...
r48285 /// In the tree dirstate, return an iterator of "directory" (entry-less)
/// nodes with the data stored for them. This is for `hg debugdirstate
/// --dirs`.
///
/// In the flat dirstate, returns an empty iterator.
///
/// Because parse errors can happen during iteration, the iterated items
/// are `Result`s.
Simon Sapin
dirstate-v2: Add --dirs to debugdirstate command...
r48140 fn iter_directories(
&self,
) -> Box<
dyn Iterator<
Item = Result<
(&HgPath, Option<Timestamp>),
DirstateV2ParseError,
>,
> + Send
+ '_,
>;
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 }
impl DirstateMapMethods for DirstateMap {
fn clear(&mut self) {
self.clear()
}
fn add_file(
&mut self,
filename: &HgPath,
entry: DirstateEntry,
dirstate: use a `added` parameter to _addpath...
r48314 added: bool,
dirstate: use a `merged` parameter to _addpath...
r48316 merged: bool,
dirstate: move the handling of special case within the dirstatemap...
r48310 from_p2: bool,
possibly_dirty: bool,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Result<(), DirstateError> {
dirstate: use a `merged` parameter to _addpath...
r48316 self.add_file(filename, entry, added, merged, from_p2, possibly_dirty)
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 }
fn remove_file(
&mut self,
filename: &HgPath,
dirstate: move most of the `remove` logic with dirstatemap `removefile`...
r48300 in_merge: bool,
Simon Sapin
dirstate-v2: Make more APIs fallible, returning Result...
r48126 ) -> Result<(), DirstateError> {
dirstate: move most of the `remove` logic with dirstatemap `removefile`...
r48300 self.remove_file(filename, in_merge)
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 }
dirstate: no longer pass `oldstate` to the `dropfile`...
r48324 fn drop_file(&mut self, filename: &HgPath) -> Result<bool, DirstateError> {
self.drop_file(filename)
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> {
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: Support appending to the same data file...
r48478 fn pack_v2(
&mut self,
_now: Timestamp,
_can_append: bool,
) -> Result<(Vec<u8>, bool), DirstateError> {
Simon Sapin
dirstate-v2: Change the on-disk format when the requirement is enabled...
r48055 panic!(
"should have used dirstate_tree::DirstateMap to use the v2 format"
)
}
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 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 }
Simon Sapin
dirstate-v2: Add --dirs to debugdirstate command...
r48140
fn iter_directories(
&self,
) -> Box<
dyn Iterator<
Item = Result<
(&HgPath, Option<Timestamp>),
DirstateV2ParseError,
>,
> + Send
+ '_,
> {
Box::new(std::iter::empty())
}
Simon Sapin
dirstate-tree: Make Rust DirstateMap bindings go through a trait object...
r47863 }