Mercurial > hg
view relnotes/5.9 @ 52060:8b7123c8947b
update: add a Rust fast-path when updating from null (and clean)
This case is easy to detect and we have all we need to generate a valid
working copy and dirstate entirely in Rust, which speeds things up
considerably:
On my machine updating a repo of ~300k files goes from 10.00s down to 4.2s,
all while consuming 50% less system time, with all caches hot.
Something to note is that further improvements will probably happen
with the upcoming `InnerRevlog` series that does smarter
mmap hanlding, especially for filelogs.
Here are benchmark numbers on a machine with only 4 cores (and no SMT enabled)
```
### data-env-vars.name = heptapod-public-2024-03-25-ds2-pnm
# benchmark.name = hg.command.update
# bin-env-vars.hg.py-re2-module = default
# bin-env-vars.hg.changeset.node = <this change>
# benchmark.variants.atomic-update = no
# benchmark.variants.scenario = null-to-tip
# benchmark.variants.worker = default
default: 5.328762 ~~~~~
rust: 1.308654 (-75.44%, -4.02)
### data-env-vars.name = mercurial-devel-2024-03-22-ds2-pnm
# benchmark.name = hg.command.update
# bin-env-vars.hg.py-re2-module = default
# bin-env-vars.hg.changeset.node = <this change>
# benchmark.variants.atomic-update = no
# benchmark.variants.scenario = null-to-tip
# benchmark.variants.worker = default
default: 1.693271 ~~~~~
rust: 1.151053 (-32.02%, -0.54)
### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm
# benchmark.name = hg.command.update
# bin-env-vars.hg.py-re2-module = default
# bin-env-vars.hg.changeset.node = <this change>
# benchmark.variants.atomic-update = no
# benchmark.variants.scenario = null-to-tip
# benchmark.variants.worker = default
default: 38.901613 ~~~~~
rust: 11.637880 (-70.08%, -27.26)
### data-env-vars.name = netbsd-xsrc-public-2024-09-19-ds2-pnm
# benchmark.name = hg.command.update
# bin-env-vars.hg.py-re2-module = default
# bin-env-vars.hg.changeset.node = <this change>
# benchmark.variants.atomic-update = no
# benchmark.variants.scenario = null-to-tip
# benchmark.variants.worker = default
default: 4.793727 ~~~~~
rust: 1.505905 (-68.59%, -3.29)
```
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Tue, 01 Oct 2024 13:49:11 +0200 |
parents | 809e780c72e5 |
children |
line wrap: on
line source
== New Features == * `hg config` now has a `--source` option to show where each configuration value comes from. * Introduced a command (debug-repair-issue6528) to repair repositories affected by issue6528 where certain files would show up as modified even if they were clean due to an issue in the copy-tracing code. == Default Format Change == These changes affect newly created repositories (or new clone) done with Mercurial 5.9. == New Experimental Features == * A `changelogv2` format has been introduced. It is not ready for use yet, but will be used later to address some of the weaknesses of the current revlog format. * Initial experiment and support for `dirstatev2`, a new dirstate format that addresses some of the weaknesses of the current dirstate format. Python + C and Rust support are being implemented, but the Rust solution is the one currently getting the attention for performance. * Initial support for `rhg status`. `rhg` is the Rust wrapper executable for hg that shortcuts some commands for faster execution speed. == Bug Fixes == * Fixed committing empty files with `narrow` * Allow overriding `pip`'s pep517 compliance to build C or Rust extensions * Fixed regression on outgoing email when not specifying revisions * Fixed a regression causing bookmarks to disappear when using Rust persistent nodemap * Fixed a regression (in 5.9.1) introduced in 5.9 when cloning repos with deep filenames * Fixed detection of directories becoming symlinks, but only when using the Rust extensions. * Fixed ignore and include not composing in the Rust status * `hg commit --interactive` now handles deselecting edits of a rename * Fixed a case where `hg evolve` gives different results when interrupted * Fixed a memory leak in phases computation * `histedit` and `shelve` don't swallow errors when updating the working copy anymore * Improve error message when detecting content-divergence with a hidden common predecessor * No longer re-order parents in filelog, see issue6533 * Fix revisions affected by issue6533 on the fly during exchange * Many Windows fixes for stability and py3 compatibility improvements * Many other miscellaneous fixes == Backwards Compatibility Changes == == Internal API Changes == The Dirstate API have been updated as the previous function leaked some internal details and did not distinguish between two important cases: "We are changing parent and need to adjust the dirstate" and "some command is changing which file is tracked". To clarify the situation: * the following functions have been deprecated, - `dirstate.add`, - `dirstate.normal`, - `dirstate.normallookup`, - `dirstate.merge`, - `dirstate.otherparent`, - `dirstate.remove`, - `dirstate.drop`, - `dirstateitem.__getitem__`, * these new functions are added for the "adjusting parents" use-case: - `dirstate.update_file`, - `dirstate.update_file_p1`, * these new function are added for the "adjusting wc file" use-case": - `dirstate.set_tracked`, - `dirstate.set_untracked`, - `dirstate.set_clean`, - `dirstate.set_possibly_dirty`, See inline documentation of the new functions for details. * Additionally, the following have been deprecated: - `urlutil.getpath` function - `localrepository.updatecaches`' `full` argument * The following have been removed: - `revlog.revlogio` has been removed