Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 02 Oct 2021 00:02:55 +0200] rev 48145
dirstatemap: use a common implement for reset_state
Same logic as for `set_untracked` this make sure both implementation are aligned.
The `reset_state` implementation for the Rust wrapped had signicantly diverged,
this change finally put it back in line.
Differential Revision: https://phab.mercurial-scm.org/D11578
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 02 Oct 2021 00:01:56 +0200] rev 48144
dirstatemap: add a common `_drop_entry` method for dirstatemap
This method is called to remove DirstateItem from the map.
Each variant have a different implementation (which is … the point).
Differential Revision: https://phab.mercurial-scm.org/D11577
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 01 Oct 2021 23:49:40 +0200] rev 48143
dirstatemap: use common code for set_clean
Same logic before this make sure both implementation use the same logic for this.
Differential Revision: https://phab.mercurial-scm.org/D11576
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 01 Oct 2021 23:42:24 +0200] rev 48142
dirstatemap: use common code for set_possibly_dirty
Same logic before this make sure both implementation use the same logic for this.
Differential Revision: https://phab.mercurial-scm.org/D11575
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 01 Oct 2021 23:24:01 +0200] rev 48141
dirstatemap: use a common implement for set_tracked
Same logic as for `set_untracked` this make sure both implementation use the
same logic for this.
Differential Revision: https://phab.mercurial-scm.org/D11574
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 01 Oct 2021 23:13:44 +0200] rev 48140
dirstatemap: add a common `_insert_entry` method for dirstatemap
This method is called to add a new DirstateItem to the map.
Each variant have a different implementation (which is … the point).
Differential Revision: https://phab.mercurial-scm.org/D11573
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 01 Oct 2021 19:14:09 +0200] rev 48139
dirstatemap: use a common implementation for `dirstatemap.set_untracked`
We can now make sure they use the same code, and drop the older, out of sync,
implementation of `set_untracked` for the rust wrapper.
Differential Revision: https://phab.mercurial-scm.org/D11572
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 01 Oct 2021 18:54:40 +0200] rev 48138
dirstatemap: add a common `_refresh_entry` method for dirstatemap
This method is called once a DirstateItem have been modified to apply the
change on the dirstatemap if necessary.
Each variant have a different implementation (which is … the point).
We use `addfile` for the rustmap and not `set_dirstate_item` because we need to
keep the internal counter up to date and `set_dirstate_item` does not do it.
Differential Revision: https://phab.mercurial-scm.org/D11571
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 01 Oct 2021 18:52:26 +0200] rev 48137
dirstatemap: create `_dirs_incr/_dirs_decr` methods on the common class
The Rust wrapper does not need them. However having a default, no-op,
implementation will help use to write code used by both implementation.
Differential Revision: https://phab.mercurial-scm.org/D11570
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 01 Oct 2021 18:49:21 +0200] rev 48136
dirstatemap: small rework of the `set_untracked` method
This shuffle the code a bit to have it flowing more "naturally". This will help
us to create a common version of this code in the next changesets.
Differential Revision: https://phab.mercurial-scm.org/D11569
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 02 Oct 2021 12:10:46 +0200] rev 48135
dirstatemap: arrange methods by category
The dirstatemap code cover various aspects, it grow a bit messy over the years. So we shuffle the code around into some documented categories.
This will help use to clean up the code.
No code was changed in this changeset, only code move.
Differential Revision: https://phab.mercurial-scm.org/D11568
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 02 Oct 2021 12:01:50 +0200] rev 48134
dirstatemap: move a multiple simple functions in the common class
These are small and simple, lets factor them out.
Differential Revision: https://phab.mercurial-scm.org/D11567
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 01 Oct 2021 17:10:24 +0200] rev 48133
dirstatemap: rename `_rustmap` to `_map`
This match the name of the `map` for the other implementation and will make it
simpler to share code between the two.
Differential Revision: https://phab.mercurial-scm.org/D11566
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 01 Oct 2021 16:52:44 +0200] rev 48132
dirstatemap: use a common __init__ for dirstatemap
This is the first and simplest things to put in common.
Differential Revision: https://phab.mercurial-scm.org/D11565
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 01 Oct 2021 16:14:29 +0200] rev 48131
dirstatemap: introduce a common base for the dirstatemap class
We have two dirstatemaps class. One for the python version of the dirstate map
and one for the Rust version (that has a python wrapper to deal with some
aspect of it). We end up with duplicated code between them, so we introduce a
common base class to start migrating common code in them.
Differential Revision: https://phab.mercurial-scm.org/D11564
Martin von Zweigbergk <martinvonz@google.com> [Tue, 28 Sep 2021 15:11:22 -0700] rev 48130
errors: raise InputError from revsingle() iff revset provided by the user
Same reasoning as for `revrange()` in an earlier patch.
Differential Revision: https://phab.mercurial-scm.org/D11562
Martin von Zweigbergk <martinvonz@google.com> [Tue, 28 Sep 2021 13:59:01 -0700] rev 48129
errors: raise InputError from revpair() iff revset provided by the user
Same reasoning as for `revrange()` in an earlier patch.
Differential Revision: https://phab.mercurial-scm.org/D11561
Martin von Zweigbergk <martinvonz@google.com> [Tue, 28 Sep 2021 08:47:11 -0700] rev 48128
errors: raise InputError on bad revset to revrange() iff provided by the user
Most callers of `scmutil.revrange()` pass in a revset provided by the
user. If there are problems resolving that, it should result in an
`InputError` and exit code 10 (when using detailed exit
codes). However, there are also some callers that pass in revsets not
provided by the user. `InputError` is not appropriate in those
cases. This patch therefore introduces a wrapper around
`scmutil.revrange()` that simply converts the exception type. I put it
in `logcmdutil.py` since that seems to be the lowest-level module in
the (poorly defined) UI layer.
Differential Revision: https://phab.mercurial-scm.org/D11560
Martin von Zweigbergk <martinvonz@google.com> [Tue, 28 Sep 2021 09:08:43 -0700] rev 48127
phase: avoid a no-op resolution of revset from revnums
I was surprised that `scmutil.revrange()` supports integers in the
list of revsets. I think it's clearer to not pass a list that's known
to contain only integers into the function.
Differential Revision: https://phab.mercurial-scm.org/D11559
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 01 Oct 2021 15:19:37 +0200] rev 48126
dirstate: push back the future a bit in the test
The future was set to 2021-01-01, we push it by 10 years.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 30 Sep 2021 18:07:31 +0200] rev 48125
dirstate-item: point out that `merged` is set only with p1_tracked
This is currently True, and we will use this fact to simplify the API in the
next commit. However, we add this assertion first to validate that this is
True in the whole test-suite.
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 01:23:10 +0200] rev 48124
dirstate-item: update the attribute documentation
It was very outdated. We are about to change these attribute so we should has
well have them documented so that the change get easier to grasp.
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 01 Oct 2021 03:50:37 +0200] rev 48123
dirstate-item: use `any_tracked` more
This simplify more code.
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 01 Oct 2021 03:49:03 +0200] rev 48122
dirstate-item: drop an outdated comments
This comment is no longer relevant since we moved away from the `state` internal
representation, multiple weeks ago.
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 01 Oct 2021 00:00:29 +0200] rev 48121
dirstate: remove a update_file's special case for `merged` file
This case was fishy and can be dealt with by passing more accurate data a higher
level.
This clarify the API and prepare for a larger rework of the data we feeds to
the dirstate.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 30 Sep 2021 18:00:39 +0200] rev 48120
dirstate: remove a update_file's special case for tracked file with p2 data
This case was fishy and can be dealt with by passing more accurate data a higher
level.
This clarify the API and prepare for a larger rework of the data we feeds to
the dirstate.
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 02:34:32 +0200] rev 48119
dirstate: deprecate `__getitem__` access
If we want to drop `state` usage, we need to deprecate this.
Differential Revision: https://phab.mercurial-scm.org/D11544
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 18:39:02 +0200] rev 48118
dirstate-item: use item's property instead of `state` in largefile
Differential Revision: https://phab.mercurial-scm.org/D11543
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 18:37:54 +0200] rev 48117
dirstate-item: use `added` instead of `state` when moving dirstate
Differential Revision: https://phab.mercurial-scm.org/D11542
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 18:37:20 +0200] rev 48116
dirstate-item: use item's property instead of `state` in revert
Differential Revision: https://phab.mercurial-scm.org/D11541
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 18:36:12 +0200] rev 48115
dirstate-item: use item's property when computing a copies
Differential Revision: https://phab.mercurial-scm.org/D11540
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 18:32:21 +0200] rev 48114
dirstate-item: use item's property instead of `state` in copy
Differential Revision: https://phab.mercurial-scm.org/D11539
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 17:52:39 +0200] rev 48113
dirstate-item: use `added` in debugrebuilddirstate
(instead of `state`)
Differential Revision: https://phab.mercurial-scm.org/D11538
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 17:42:57 +0200] rev 48112
dirstate-item: use `maybe_clean` instead of `state` in record
Differential Revision: https://phab.mercurial-scm.org/D11537
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 15:40:13 +0200] rev 48111
dirstate-item: use `any_tracked` instead of `state` to apply patches
Differential Revision: https://phab.mercurial-scm.org/D11536
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 15:39:33 +0200] rev 48110
dirstate-item: use item's property instead of `state` in addremove
Differential Revision: https://phab.mercurial-scm.org/D11535
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 15:26:30 +0200] rev 48109
dirstate-item: use `tracked` instead of `state` during copy detection
Differential Revision: https://phab.mercurial-scm.org/D11534
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 15:23:57 +0200] rev 48108
dirstate-item: use `maybe_clean` instead of `state` in `strip`
Differential Revision: https://phab.mercurial-scm.org/D11533
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 15:07:21 +0200] rev 48107
dirstate-item: use `tracked` instead of `state` in context.matches
Differential Revision: https://phab.mercurial-scm.org/D11532
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 30 Sep 2021 15:28:42 +0200] rev 48106
dirstate-item: use `tracked` instead of the `state` in context's iter
Differential Revision: https://phab.mercurial-scm.org/D11531
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 14:57:54 +0200] rev 48105
dirstate-item: use `tracked` instead of the `state` in context
Differential Revision: https://phab.mercurial-scm.org/D11530
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 14:56:23 +0200] rev 48104
dirstate-item: use item's property to deal with hgsubstate in mq
This is clearer than processing the `state`.
Differential Revision: https://phab.mercurial-scm.org/D11529
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 14:56:05 +0200] rev 48103
dirstate-item: use `added` instead of the `state` in the `mq` extension
Differential Revision: https://phab.mercurial-scm.org/D11528
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 14:55:29 +0200] rev 48102
dirstate-item: use maybe_clean instead of `state` in the eol extension
Differential Revision: https://phab.mercurial-scm.org/D11527
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 30 Sep 2021 12:00:15 +0200] rev 48101
dirstate: move verification code within the dirstate itself
This move implementation details further down the stack and make it the
verification code easier to discover.
Differential Revision: https://phab.mercurial-scm.org/D11526
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 14:52:44 +0200] rev 48100
dirstate-entry: use `?` for the state of entry without any tracking
This is what the dirstate use at a higher level.
Differential Revision: https://phab.mercurial-scm.org/D11525
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 14:51:31 +0200] rev 48099
dirstate-item: introduce a `any_tracked` property
This property is True is the file is tracked anywhere, either the working copy,
or any of the parent.
Differential Revision: https://phab.mercurial-scm.org/D11524
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 14:41:19 +0200] rev 48098
dirstate-item: introduce a `maybe_clean` property
It is useful for some extension that seek to invalidate some state.
Differential Revision: https://phab.mercurial-scm.org/D11523
Pierre-Yves David <pierre-yves.david@octobus.net> [Wed, 29 Sep 2021 02:37:24 +0200] rev 48097
dirstate: add a `get_entry` method to the dirstate
This method give access to the underlying `DirstateEntry` object (or an empty
one if None was there). It should allow us to use the more semantic property of
the entry instead of the state where we needs it.
Differential Revision: https://phab.mercurial-scm.org/D11522
Simon Sapin <simon.sapin@octobus.net> [Thu, 30 Sep 2021 18:06:34 +0200] rev 48096
dirstate-item: Make constructor parameters optional
… in the C implementation of DirstateItem, like they already were in the
Python and Rust ones.
Differential Revision: https://phab.mercurial-scm.org/D11521
Martin von Zweigbergk <martinvonz@google.com> [Fri, 01 Oct 2021 08:44:56 -0700] rev 48095
hg-core: silence dead-code warning by adding RevlogEntry::revion() accessor
Nightly `rustc` warns about the `RevlogEntry::rev` field not being
used. Rather than removing it, I added an accessor since it seems
useful to be able to get the entry's revision.
Differential Revision: https://phab.mercurial-scm.org/D11548
Raphaël Gomès <rgomes@octobus.net> [Fri, 01 Oct 2021 18:14:56 +0200] rev 48094
rust: remove dead code
Differential Revision: https://phab.mercurial-scm.org/D11549
Raphaël Gomès <rgomes@octobus.net> [Sat, 11 Sep 2021 00:09:29 +0200] rev 48093
rust-revset: support explicit `.` revision
This is basically the same thing as not specifying a revision, except this is
done in the revset resolution function.
This allows calls like `rhg cat some-file -r .` to work without falling back.
Differential Revision: https://phab.mercurial-scm.org/D11402
Raphaël Gomès <rgomes@octobus.net> [Sat, 11 Sep 2021 00:05:08 +0200] rev 48092
rust-revset: add separate match logic for shortcuts
The next change will add a shortcut for the `.` revision.
One day we might start matching `tip` and others, so this is an easy refactor.
Differential Revision: https://phab.mercurial-scm.org/D11401
Raphaël Gomès <rgomes@octobus.net> [Mon, 13 Sep 2021 15:12:35 +0200] rev 48091
rhg: fall back if subrepos are detected
We do not handle subrepos yet, the addition of the support for `-r .` will
break if we don't fall back.
Differential Revision: https://phab.mercurial-scm.org/D11403
Raphaël Gomès <rgomes@octobus.net> [Wed, 01 Sep 2021 18:09:35 +0200] rev 48090
rhg: fallback if `defaults` config is set for the current command
Differential Revision: https://phab.mercurial-scm.org/D11381
Raphaël Gomès <rgomes@octobus.net> [Wed, 01 Sep 2021 17:41:51 +0200] rev 48089
rhg: fallback if the current command has any generic hook defined
We do not handle hooks yet.
Differential Revision: https://phab.mercurial-scm.org/D11380
Raphaël Gomès <rgomes@octobus.net> [Wed, 01 Sep 2021 17:41:08 +0200] rev 48088
rhg-cat: fallback in presence of a fileset
These are unsupported so far.
Differential Revision: https://phab.mercurial-scm.org/D11379
Raphaël Gomès <rgomes@octobus.net> [Wed, 01 Sep 2021 17:40:25 +0200] rev 48087
rhg-cat: fallback when detecting `.` or `..` path segments
We do not normalize paths correctly yet, so exclude the shortcuts.
Differential Revision: https://phab.mercurial-scm.org/D11378
Raphaël Gomès <rgomes@octobus.net> [Wed, 01 Sep 2021 16:13:25 +0200] rev 48086
rhg: add support for calling `rhg cat` without a revision
Turns out the necessary pieces were there already.
Like the Python implementation, we default to the first parent of the dirstate.
Differential Revision: https://phab.mercurial-scm.org/D11377
Raphaël Gomès <rgomes@octobus.net> [Thu, 30 Sep 2021 17:34:28 +0200] rev 48085
branching: merge with stable
Simon Sapin <simon.sapin@octobus.net> [Mon, 27 Sep 2021 13:52:49 +0200] rev 48084
dirstate: Remove the Rust abstraction DirstateMapMethods
This Rust trait used to exist in order to allow the DirstateMap class exposed
to Python to be backed by either of two implementations: one similar to the
Python implementation based on a "flat" `HashMap<HgPathBuf, DirstateEntry>`,
and the newer one based on a tree of nodes matching the directory structure
of tracked files. A boxed trait object was used with dynamic dispatch.
With the flat implementation removed and only the tree one remaining, this
abstraction is not useful anymore and the concrete type can be stored directly.
It remains that the trait was implemented separately for `DirstateMap<'_>`
(which takes a lifetime parameter) and `OwningDirstateMap` (whose job is to
wrap the former and hide the lifetime parameter), with the latter impl only
forwarding calls.
This changeset also removes this forwarding. Instead, the methods formerly of
the `DirstateMapMethods` trait are now inherent methods implemented for
`OwningDirstateMap` (where they will actually be used) but in the module that
defines `DirstateMap`. This unusual setup gives access to the private fields
of `DirstateMap` from those methods.
Differential Revision: https://phab.mercurial-scm.org/D11517
Simon Sapin <simon.sapin@octobus.net> [Mon, 27 Sep 2021 12:09:15 +0200] rev 48083
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
Pierre-Yves David <pierre-yves.david@octobus.net> [Tue, 28 Sep 2021 20:00:19 +0200] rev 48082
dirstate: drop the from_p2_removed method
It it no longer in use.
Differential Revision: https://phab.mercurial-scm.org/D11515