Mercurial > public > mercurial-scm > hg-stable
annotate rust/hg-core/src/lib.rs @ 48083:bf8837e3d7ce
dirstate: Remove the flat Rust DirstateMap implementation
Before this changeset we had two Rust implementations of `DirstateMap`.
This removes the "flat" DirstateMap so that the "tree" DirstateMap is always
used when Rust enabled. This simplifies the code a lot, and will enable
(in the next changeset) further removal of a trait abstraction.
This is a performance regression when:
* Rust is enabled, and
* The repository uses the legacy dirstate-v1?file format, and
* For `hg status`, unknown files are not listed (such as with `-mard`)
The regression is about 100 milliseconds for `hg status -mard` on a
semi-large repository (mozilla-central), from ~320ms to ~420ms.
We deem this to be small enough to be worth it.
The new dirstate-v2 is still experimental at this point, but we aim to
stabilize it (though not yet enable it by default for new repositories)
in Mercurial 6.0. Eventually, upgrating repositories to dirsate-v2 will
eliminate this regression (and enable other performance improvements).
# Background
The flat DirstateMap was introduced with the first Rust implementation of the
status algorithm. It works similarly to the previous Python + C one, with a
single `HashMap` that associates file paths to a `DirstateEntry` (where Python
has a dict).
We later added the tree DirstateMap where the root of the tree contains nodes
for files and directories that are directly at the root of the repository,
and nodes for directories can contain child nodes representing the files and
directly that *they* contain directly. The shape of this tree mirrors that of
the working directory in the filesystem. This enables the status algorithm to
traverse this tree in tandem with traversing the filesystem tree, which in
turns enables a more efficient algorithm.
Furthermore, the new dirstate-v2 file format is also based on a tree of the
same shape. The tree DirstateMap can access a dirstate-v2 file without parsing
it: binary data in a single large (possibly memory-mapped) bytes buffer is
traversed on demand. This allows `DirstateMap` creation to take `O(1)` time.
(Mutation works by creating new in-memory nodes with copy-on-write semantics,
and serialization is append-mostly.)
The tradeoff is that for "legacy" repositories that use the dirstate-v1 file
format, parsing that file into a tree DirstateMap takes more time. Profiling
shows that this time is dominated by `HashMap`. For a dirstate containing `F`
files with an average `D` directory depth, the flat DirstateMap does parsing
in `O(F)` number of HashMap operations but the tree DirstateMap in `O(F ? D)`
operations, since each node has its own HashMap containing its child nodes.
This slower costs ~140ms on an old snapshot of mozilla-central, and ~80ms
on an old snapshot of the Netbeans repository.
The status algorithm is faster, but with `-mard` (when not listing unknown
files) it is typically not faster *enough* to compensate the slower parsing.
Both Rust implementations are always faster than the Python + C implementation
# Benchmark results
All benchmarks are run on changeset 98c0408324e6, with repositories that use
the dirstate-v1 file format, on a server with 4 CPU cores and 4 CPU threads
(no HyperThreading).
`hg status` benchmarks show wall clock times of the entire command as the
average and standard deviation of serveral runs, collected by
https://github.com/sharkdp/hyperfine and reformated.
Parsing benchmarks are wall clock time of the Rust function that converts a
bytes buffer of the dirstate file into the `DirstateMap` data structure as
used by the status algorithm. A single run each, collected by running
`hg status` this environment variable:
RUST_LOG=hg::dirstate::dirstate_map=trace,hg::dirstate_tree::dirstate_map=trace
Benchmark 1: Rust flat DirstateMap ? Rust tree DirstateMap
hg status
mozilla-clean 562.3 ms ? 2.0 ms ? 462.5 ms ? 0.6 ms 1.22 ? 0.00 times faster
mozilla-dirty 859.6 ms ? 2.2 ms ? 719.5 ms ? 3.2 ms 1.19 ? 0.01 times faster
mozilla-ignored 558.2 ms ? 3.0 ms ? 457.9 ms ? 2.9 ms 1.22 ? 0.01 times faster
mozilla-unknowns 859.4 ms ? 5.7 ms ? 716.0 ms ? 4.7 ms 1.20 ? 0.01 times faster
netbeans-clean 336.5 ms ? 0.9 ms ? 339.5 ms ? 0.4 ms 0.99 ? 0.00 times faster
netbeans-dirty 491.4 ms ? 1.6 ms ? 475.1 ms ? 1.2 ms 1.03 ? 0.00 times faster
netbeans-ignored 343.7 ms ? 1.0 ms ? 347.8 ms ? 0.4 ms 0.99 ? 0.00 times faster
netbeans-unknowns 484.3 ms ? 1.0 ms ? 466.0 ms ? 1.2 ms 1.04 ? 0.00 times faster
hg status -mard
mozilla-clean 317.3 ms ? 0.6 ms ? 422.5 ms ? 1.2 ms 0.75 ? 0.00 times faster
mozilla-dirty 315.4 ms ? 0.6 ms ? 417.7 ms ? 1.1 ms 0.76 ? 0.00 times faster
mozilla-ignored 314.6 ms ? 0.6 ms ? 417.4 ms ? 1.0 ms 0.75 ? 0.00 times faster
mozilla-unknowns 312.9 ms ? 0.9 ms ? 417.3 ms ? 1.6 ms 0.75 ? 0.00 times faster
netbeans-clean 212.0 ms ? 0.6 ms ? 283.6 ms ? 0.8 ms 0.75 ? 0.00 times faster
netbeans-dirty 211.4 ms ? 1.0 ms ? 283.4 ms ? 1.6 ms 0.75 ? 0.01 times faster
netbeans-ignored 211.4 ms ? 0.9 ms ? 283.9 ms ? 0.8 ms 0.74 ? 0.01 times faster
netbeans-unknowns 211.1 ms ? 0.6 ms ? 283.4 ms ? 1.0 ms 0.74 ? 0.00 times faster
Parsing
mozilla-clean 38.4ms ? 177.6ms
mozilla-dirty 38.8ms ? 177.0ms
mozilla-ignored 38.8ms ? 178.0ms
mozilla-unknowns 38.7ms ? 176.9ms
netbeans-clean 16.5ms ? 97.3ms
netbeans-dirty 16.5ms ? 98.4ms
netbeans-ignored 16.9ms ? 97.4ms
netbeans-unknowns 16.9ms ? 96.3ms
Benchmark 2: Python + C dirstatemap ? Rust tree DirstateMap
hg status
mozilla-clean 1261.0 ms ? 3.6 ms ? 461.1 ms ? 0.5 ms 2.73 ? 0.00 times faster
mozilla-dirty 2293.4 ms ? 9.1 ms ? 719.6 ms ? 3.6 ms 3.19 ? 0.01 times faster
mozilla-ignored 1240.4 ms ? 2.3 ms ? 457.7 ms ? 1.9 ms 2.71 ? 0.00 times faster
mozilla-unknowns 2283.3 ms ? 9.0 ms ? 719.7 ms ? 3.8 ms 3.17 ? 0.01 times faster
netbeans-clean 879.7 ms ? 3.5 ms ? 339.9 ms ? 0.5 ms 2.59 ? 0.00 times faster
netbeans-dirty 1257.3 ms ? 4.7 ms ? 474.6 ms ? 1.6 ms 2.65 ? 0.01 times faster
netbeans-ignored 943.9 ms ? 1.9 ms ? 347.3 ms ? 1.1 ms 2.72 ? 0.00 times faster
netbeans-unknowns 1188.1 ms ? 5.0 ms ? 465.2 ms ? 2.3 ms 2.55 ? 0.01 times faster
hg status -mard
mozilla-clean 903.2 ms ? 3.6 ms ? 423.4 ms ? 2.2 ms 2.13 ? 0.01 times faster
mozilla-dirty 884.6 ms ? 4.5 ms ? 417.3 ms ? 1.4 ms 2.12 ? 0.01 times faster
mozilla-ignored 881.9 ms ? 1.3 ms ? 417.3 ms ? 0.8 ms 2.11 ? 0.00 times faster
mozilla-unknowns 878.5 ms ? 1.9 ms ? 416.4 ms ? 0.9 ms 2.11 ? 0.00 times faster
netbeans-clean 434.9 ms ? 1.8 ms ? 284.0 ms ? 0.8 ms 1.53 ? 0.01 times faster
netbeans-dirty 434.1 ms ? 0.8 ms ? 283.1 ms ? 0.8 ms 1.53 ? 0.00 times faster
netbeans-ignored 431.7 ms ? 1.1 ms ? 283.6 ms ? 1.8 ms 1.52 ? 0.01 times faster
netbeans-unknowns 433.0 ms ? 1.3 ms ? 283.5 ms ? 0.7 ms 1.53 ? 0.00 times faster
Differential Revision: https://phab.mercurial-scm.org/D11516
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Mon, 27 Sep 2021 12:09:15 +0200 |
parents | 9cd35c8c6044 |
children | 5734b03ecf3e |
rev | line source |
---|---|
44006
cb2e2b095dc9
rust-core: updated copyright notice
Georges Racinet <georges.racinet@octobus.net>
parents:
43922
diff
changeset
|
1 // Copyright 2018-2020 Georges Racinet <georges.racinet@octobus.net> |
cb2e2b095dc9
rust-core: updated copyright notice
Georges Racinet <georges.racinet@octobus.net>
parents:
43922
diff
changeset
|
2 // and Mercurial contributors |
40271
dbc28c91f7ff
rust: pure Rust lazyancestors iterator
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
3 // |
dbc28c91f7ff
rust: pure Rust lazyancestors iterator
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
4 // This software may be used and distributed according to the terms of the |
dbc28c91f7ff
rust: pure Rust lazyancestors iterator
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
5 // GNU General Public License version 2 or any later version. |
46511
43d63979a75e
rust: use HgError in RevlogError and Vfs
Simon Sapin <simon.sapin@octobus.net>
parents:
46508
diff
changeset
|
6 |
40271
dbc28c91f7ff
rust: pure Rust lazyancestors iterator
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
7 mod ancestors; |
41242
47881d2a9d99
rust: dagop.headrevs() Rust counterparts
Georges Racinet on ishtar.racinet.fr <georges@racinet.fr>
parents:
41241
diff
changeset
|
8 pub mod dagops; |
46506
39e9407820ac
rust: Introduce an `HgError` enum for common error cases
Simon Sapin <simon.sapin@octobus.net>
parents:
46503
diff
changeset
|
9 pub mod errors; |
41057
ef54bd33b476
rust: core implementation for lazyancestors
Georges Racinet <gracinet@anybox.fr>
parents:
40972
diff
changeset
|
10 pub use ancestors::{AncestorsIterator, LazyAncestors, MissingAncestors}; |
47115
5d62243c7732
rust: Add a Timestamp struct instead of abusing Duration
Simon Sapin <simon.sapin@octobus.net>
parents:
47107
diff
changeset
|
11 pub mod dirstate; |
47107
787ff5d21bcd
dirstate-tree: Make Rust DirstateMap bindings go through a trait object
Simon Sapin <simon.sapin@octobus.net>
parents:
46799
diff
changeset
|
12 pub mod dirstate_tree; |
42216
10b465d61556
rust-discovery: starting core implementation
Georges Racinet <georges.racinet@octobus.net>
parents:
41728
diff
changeset
|
13 pub mod discovery; |
47413
6e49769b7f97
rhg: add exit code to HgError::Abort()
Pulkit Goyal <7895pulkit@gmail.com>
parents:
47343
diff
changeset
|
14 pub mod exit_codes; |
45939
a2eda1ff22aa
requirements: move loading to hg-core and add parsing
Simon Sapin <simon-commits@exyr.org>
parents:
45384
diff
changeset
|
15 pub mod requirements; |
42330
e240bec26626
rust-dirstate: add rust-cpython bindings to the new parse/pack functions
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42329
diff
changeset
|
16 pub mod testing; // unconditionally built, for use from integration tests |
e240bec26626
rust-dirstate: add rust-cpython bindings to the new parse/pack functions
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42329
diff
changeset
|
17 pub use dirstate::{ |
42891
a03a29462c0a
rust-dirstate: specify concrete return type of DirsMultiset::iter()
Yuya Nishihara <yuya@tcha.org>
parents:
42818
diff
changeset
|
18 dirs_multiset::{DirsMultiset, DirsMultisetIter}, |
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44535
diff
changeset
|
19 status::{ |
48083
bf8837e3d7ce
dirstate: Remove the flat Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
47980
diff
changeset
|
20 BadMatch, BadType, DirstateStatus, HgPathCow, StatusError, |
46799
bcdcb4423ae3
rhg: Add more conversions between error types
Simon Sapin <simon.sapin@octobus.net>
parents:
46638
diff
changeset
|
21 StatusOptions, |
44538
c8891bca40fb
rust-status: add bare `hg status` support in hg-core
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44535
diff
changeset
|
22 }, |
48083
bf8837e3d7ce
dirstate: Remove the flat Rust DirstateMap implementation
Simon Sapin <simon.sapin@octobus.net>
parents:
47980
diff
changeset
|
23 DirstateEntry, DirstateParents, EntryState, |
42330
e240bec26626
rust-dirstate: add rust-cpython bindings to the new parse/pack functions
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42329
diff
changeset
|
24 }; |
45959
595979dc924e
copies: introduce a basic Rust function for `combine_changeset_copies`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45939
diff
changeset
|
25 pub mod copy_tracing; |
42349
e8f3740cc067
rust-filepatterns: add a Rust implementation of pattern-related utils
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42330
diff
changeset
|
26 mod filepatterns; |
43490
a77d4fe347a4
rust-matchers: add `Matcher` trait and implement `AlwaysMatcher`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43271
diff
changeset
|
27 pub mod matchers; |
46167
8a4914397d02
rust: introduce Repo and Vfs types for filesystem abstraction
Simon Sapin <simon.sapin@octobus.net>
parents:
45959
diff
changeset
|
28 pub mod repo; |
44008
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
44006
diff
changeset
|
29 pub mod revlog; |
6b332c1fc7fe
rust-core: extracted a revlog submodule
Georges Racinet <georges.racinet@octobus.net>
parents:
44006
diff
changeset
|
30 pub use revlog::*; |
46187
95d6f31e88db
hg-core: add basic config module
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46167
diff
changeset
|
31 pub mod config; |
46638
1f55cd5b292f
rust: Add a log file rotation utility
Simon Sapin <simon.sapin@octobus.net>
parents:
46512
diff
changeset
|
32 pub mod logging; |
44999
a46e36b82461
hg-core: add Operation interface for high-level hg operations
Antoine Cezar <antoine.cezar@octobus.net>
parents:
44929
diff
changeset
|
33 pub mod operations; |
46501
4b381dbbf8b7
rhg: centralize parsing of `--rev` CLI arguments
Simon Sapin <simon.sapin@octobus.net>
parents:
46441
diff
changeset
|
34 pub mod revset; |
42610
5672bb73f61e
rust-utils: add docstrings and doctests for utils.rs
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42609
diff
changeset
|
35 pub mod utils; |
47980
9cd35c8c6044
rust: Move VFS code to its own module
Simon Sapin <simon.sapin@octobus.net>
parents:
47413
diff
changeset
|
36 pub mod vfs; |
42349
e8f3740cc067
rust-filepatterns: add a Rust implementation of pattern-related utils
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42330
diff
changeset
|
37 |
44329
934a79697c36
rust-dirs-multiset: improve temporary error message
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44008
diff
changeset
|
38 use crate::utils::hg_path::{HgPathBuf, HgPathError}; |
42349
e8f3740cc067
rust-filepatterns: add a Rust implementation of pattern-related utils
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42330
diff
changeset
|
39 pub use filepatterns::{ |
44346
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
40 parse_pattern_syntax, read_pattern_file, IgnorePattern, |
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
41 PatternFileWarning, PatternSyntax, |
42349
e8f3740cc067
rust-filepatterns: add a Rust implementation of pattern-related utils
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42330
diff
changeset
|
42 }; |
43844
5ac243a92e37
rust-performance: introduce FastHashMap type alias for HashMap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43808
diff
changeset
|
43 use std::collections::HashMap; |
46512
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
44 use std::fmt; |
43844
5ac243a92e37
rust-performance: introduce FastHashMap type alias for HashMap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43808
diff
changeset
|
45 use twox_hash::RandomXxHashBuilder64; |
40271
dbc28c91f7ff
rust: pure Rust lazyancestors iterator
Georges Racinet <gracinet@anybox.fr>
parents:
diff
changeset
|
46 |
44551
d880805d5442
hg-core: add function timing information
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44538
diff
changeset
|
47 /// This is a contract between the `micro-timer` crate and us, to expose |
d880805d5442
hg-core: add function timing information
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44538
diff
changeset
|
48 /// the `log` crate as `crate::log`. |
d880805d5442
hg-core: add function timing information
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44538
diff
changeset
|
49 use log; |
d880805d5442
hg-core: add function timing information
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44538
diff
changeset
|
50 |
42349
e8f3740cc067
rust-filepatterns: add a Rust implementation of pattern-related utils
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42330
diff
changeset
|
51 pub type LineNumber = usize; |
e8f3740cc067
rust-filepatterns: add a Rust implementation of pattern-related utils
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42330
diff
changeset
|
52 |
43844
5ac243a92e37
rust-performance: introduce FastHashMap type alias for HashMap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43808
diff
changeset
|
53 /// Rust's default hasher is too slow because it tries to prevent collision |
5ac243a92e37
rust-performance: introduce FastHashMap type alias for HashMap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43808
diff
changeset
|
54 /// attacks. We are not concerned about those: if an ill-minded person has |
5ac243a92e37
rust-performance: introduce FastHashMap type alias for HashMap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43808
diff
changeset
|
55 /// write access to your repository, you have other issues. |
5ac243a92e37
rust-performance: introduce FastHashMap type alias for HashMap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43808
diff
changeset
|
56 pub type FastHashMap<K, V> = HashMap<K, V, RandomXxHashBuilder64>; |
5ac243a92e37
rust-performance: introduce FastHashMap type alias for HashMap
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43808
diff
changeset
|
57 |
42329
d1786c1d34fa
rust-dirstate: add rust implementation of `parse_dirstate` and `pack_dirstate`
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42216
diff
changeset
|
58 #[derive(Debug, PartialEq)] |
42543
2dcee6497b0b
rust-dirstate: add "dirs" Rust implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42453
diff
changeset
|
59 pub enum DirstateMapError { |
42960
7a01778bc7b7
rust-hgpath: replace all paths and filenames with HgPath/HgPathBuf
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42892
diff
changeset
|
60 PathNotFound(HgPathBuf), |
42543
2dcee6497b0b
rust-dirstate: add "dirs" Rust implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42453
diff
changeset
|
61 EmptyPath, |
44329
934a79697c36
rust-dirs-multiset: improve temporary error message
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44008
diff
changeset
|
62 InvalidPath(HgPathError), |
43808
1fe2e574616e
rust-dirs: address failing tests for `dirs` impl with a temporary fix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43490
diff
changeset
|
63 } |
1fe2e574616e
rust-dirs: address failing tests for `dirs` impl with a temporary fix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43490
diff
changeset
|
64 |
46512
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
65 impl fmt::Display for DirstateMapError { |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
66 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
43808
1fe2e574616e
rust-dirs: address failing tests for `dirs` impl with a temporary fix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43490
diff
changeset
|
67 match self { |
44329
934a79697c36
rust-dirs-multiset: improve temporary error message
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44008
diff
changeset
|
68 DirstateMapError::PathNotFound(_) => { |
46512
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
69 f.write_str("expected a value, found none") |
43808
1fe2e574616e
rust-dirs: address failing tests for `dirs` impl with a temporary fix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43490
diff
changeset
|
70 } |
46512
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
71 DirstateMapError::EmptyPath => { |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
72 f.write_str("Overflow in dirstate.") |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
73 } |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
74 DirstateMapError::InvalidPath(path_error) => path_error.fmt(f), |
43808
1fe2e574616e
rust-dirs: address failing tests for `dirs` impl with a temporary fix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43490
diff
changeset
|
75 } |
1fe2e574616e
rust-dirs: address failing tests for `dirs` impl with a temporary fix
Rapha?l Gom?s <rgomes@octobus.net>
parents:
43490
diff
changeset
|
76 } |
42543
2dcee6497b0b
rust-dirstate: add "dirs" Rust implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42453
diff
changeset
|
77 } |
2dcee6497b0b
rust-dirstate: add "dirs" Rust implementation
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42453
diff
changeset
|
78 |
46503
2e2033081274
rust: replace trivial `impl From ?` with `#[derive(derive_more::From)]`
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
79 #[derive(Debug, derive_more::From)] |
42765
7ceded4419a3
rust-dirstate: use EntryState enum instead of literals
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42764
diff
changeset
|
80 pub enum DirstateError { |
7ceded4419a3
rust-dirstate: use EntryState enum instead of literals
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42764
diff
changeset
|
81 Map(DirstateMapError), |
46507
68a15b5a7e58
rust: Replace DirstatePackError with HgError
Simon Sapin <simon.sapin@octobus.net>
parents:
46506
diff
changeset
|
82 Common(errors::HgError), |
42765
7ceded4419a3
rust-dirstate: use EntryState enum instead of literals
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42764
diff
changeset
|
83 } |
7ceded4419a3
rust-dirstate: use EntryState enum instead of literals
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42764
diff
changeset
|
84 |
47343
ed1583a845d2
dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents:
47115
diff
changeset
|
85 impl fmt::Display for DirstateError { |
ed1583a845d2
dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents:
47115
diff
changeset
|
86 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
ed1583a845d2
dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents:
47115
diff
changeset
|
87 match self { |
ed1583a845d2
dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents:
47115
diff
changeset
|
88 DirstateError::Map(error) => error.fmt(f), |
ed1583a845d2
dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents:
47115
diff
changeset
|
89 DirstateError::Common(error) => error.fmt(f), |
ed1583a845d2
dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents:
47115
diff
changeset
|
90 } |
ed1583a845d2
dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents:
47115
diff
changeset
|
91 } |
ed1583a845d2
dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents:
47115
diff
changeset
|
92 } |
ed1583a845d2
dirstate-v2: Make more APIs fallible, returning Result
Simon Sapin <simon.sapin@octobus.net>
parents:
47115
diff
changeset
|
93 |
46503
2e2033081274
rust: replace trivial `impl From ?` with `#[derive(derive_more::From)]`
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
94 #[derive(Debug, derive_more::From)] |
42349
e8f3740cc067
rust-filepatterns: add a Rust implementation of pattern-related utils
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42330
diff
changeset
|
95 pub enum PatternError { |
46503
2e2033081274
rust: replace trivial `impl From ?` with `#[derive(derive_more::From)]`
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
96 #[from] |
44346
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
97 Path(HgPathError), |
42349
e8f3740cc067
rust-filepatterns: add a Rust implementation of pattern-related utils
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42330
diff
changeset
|
98 UnsupportedSyntax(String), |
44346
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
99 UnsupportedSyntaxInFile(String, String, usize), |
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
100 TooLong(usize), |
46503
2e2033081274
rust: replace trivial `impl From ?` with `#[derive(derive_more::From)]`
Simon Sapin <simon.sapin@octobus.net>
parents:
46501
diff
changeset
|
101 #[from] |
44346
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
102 IO(std::io::Error), |
44347
2fe89bec8011
rust-filepatterns: add support for `include` and `subinclude` patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44346
diff
changeset
|
103 /// Needed a pattern that can be turned into a regex but got one that |
2fe89bec8011
rust-filepatterns: add support for `include` and `subinclude` patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44346
diff
changeset
|
104 /// can't. This should only happen through programmer error. |
2fe89bec8011
rust-filepatterns: add support for `include` and `subinclude` patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44346
diff
changeset
|
105 NonRegexPattern(IgnorePattern), |
42349
e8f3740cc067
rust-filepatterns: add a Rust implementation of pattern-related utils
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42330
diff
changeset
|
106 } |
e8f3740cc067
rust-filepatterns: add a Rust implementation of pattern-related utils
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42330
diff
changeset
|
107 |
46512
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
108 impl fmt::Display for PatternError { |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
109 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { |
44346
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
110 match self { |
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
111 PatternError::UnsupportedSyntax(syntax) => { |
46512
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
112 write!(f, "Unsupported syntax {}", syntax) |
44346
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
113 } |
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
114 PatternError::UnsupportedSyntaxInFile(syntax, file_path, line) => { |
46512
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
115 write!( |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
116 f, |
44346
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
117 "{}:{}: unsupported syntax {}", |
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
118 file_path, line, syntax |
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
119 ) |
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
120 } |
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
121 PatternError::TooLong(size) => { |
46512
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
122 write!(f, "matcher pattern is too long ({} bytes)", size) |
44346
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
123 } |
46512
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
124 PatternError::IO(error) => error.fmt(f), |
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
125 PatternError::Path(error) => error.fmt(f), |
44347
2fe89bec8011
rust-filepatterns: add support for `include` and `subinclude` patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44346
diff
changeset
|
126 PatternError::NonRegexPattern(pattern) => { |
46512
6c778d20c8c2
rust: replace ToString impls with Display
Simon Sapin <simon.sapin@octobus.net>
parents:
46511
diff
changeset
|
127 write!(f, "'{:?}' cannot be turned into a regex", pattern) |
44347
2fe89bec8011
rust-filepatterns: add support for `include` and `subinclude` patterns
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44346
diff
changeset
|
128 } |
44346
d42eea9a0494
rust-filepatterns: improve API and robustness for pattern files parsing
Rapha?l Gom?s <rgomes@octobus.net>
parents:
44329
diff
changeset
|
129 } |
42349
e8f3740cc067
rust-filepatterns: add a Rust implementation of pattern-related utils
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42330
diff
changeset
|
130 } |
e8f3740cc067
rust-filepatterns: add a Rust implementation of pattern-related utils
Rapha?l Gom?s <rgomes@octobus.net>
parents:
42330
diff
changeset
|
131 } |