Mercurial > public > mercurial-scm > hg-stable
changeset 52851:e52dc683bf6b
rust-pyo3: switch over to the pyo3 `InnerRevlog`
This does many things that would involve a lot of churn if done separately:
- Move the ancestors, revision and dagops modules to use the
new `SharedByPyObject` instead of the old `UnsafePyLeaked`
- Move the ancestors and discovery Python tests to using PyO3
- Change all calls to `importrust` to use `pyo3=True`, where applicable
# Benchmarks
I've run a bunch of benchmarks that involve revlog use. The TL;DR is that
the pyo3 code is basically always very slightly faster if/when it's not within
the noise levels.
Here is the report:
```
### data-env-vars.name = heptapod-public-2024-03-25-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 8.425445 ~~~~~
after: 8.170007 (-3.03%, -0.26)
### data-env-vars.name = heptapod-public-2024-03-25-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 8.328969 ~~~~~
after: 8.193693 (-1.62%, -0.14)
### data-env-vars.name = heptapod-public-2024-03-25-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.318721 ~~~~~
after: 0.317050
### data-env-vars.name = heptapod-public-2024-03-25-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.315603 ~~~~~
after: 0.311842 (-1.19%, -0.00)
### data-env-vars.name = heptapod-public-2024-03-25-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 15.422452 ~~~~~
after: 15.417195
### data-env-vars.name = heptapod-public-2024-03-25-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 15.424805 ~~~~~
after: 15.417188
### data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 8.447181 ~~~~~
after: 8.279321 (-1.99%, -0.17)
### data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 8.399840 ~~~~~
after: 8.310752 (-1.06%, -0.09)
### data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.352319 ~~~~~
after: 0.353375
### data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.322006 ~~~~~
after: 0.323852
### data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 16.183304 ~~~~~
after: 16.177351
### data-env-vars.name = heptapod-public-2024-03-25-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 16.169041 ~~~~~
after: 16.173200
### data-env-vars.name = mercurial-public-2018-08-01-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 0.559746 ~~~~~
after: 0.548727 (-1.97%, -0.01)
### data-env-vars.name = mercurial-public-2018-08-01-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 0.551662 ~~~~~
after: 0.548478
### data-env-vars.name = mercurial-public-2018-08-01-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.294767 ~~~~~
after: 0.291008 (-1.28%, -0.00)
### data-env-vars.name = mercurial-public-2018-08-01-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.290598 ~~~~~
after: 0.288139
### data-env-vars.name = mercurial-public-2018-08-01-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 0.128753 ~~~~~
after: 0.127942
### data-env-vars.name = mercurial-public-2018-08-01-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 0.128310 ~~~~~
after: 0.128236
### data-env-vars.name = mercurial-public-2018-08-01-ds2-pnm
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 4.968975 ~~~~~
after: 4.804225 (-3.32%, -0.16)
### data-env-vars.name = mercurial-public-2018-08-01-ds2-pnm
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 5.038150 ~~~~~
after: 4.821872 (-4.29%, -0.22)
### data-env-vars.name = mercurial-public-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 0.560542 ~~~~~
after: 0.557323
### data-env-vars.name = mercurial-public-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 0.554099 ~~~~~
after: 0.553200
### data-env-vars.name = mercurial-public-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.292676 ~~~~~
after: 0.292513
### data-env-vars.name = mercurial-public-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.288629 ~~~~~
after: 0.287737
### data-env-vars.name = mercurial-public-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 0.223442 ~~~~~
after: 0.223168
### data-env-vars.name = mercurial-public-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 0.223376 ~~~~~
after: 0.222181
### data-env-vars.name = mercurial-public-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 4.691464 ~~~~~
after: 4.567641 (-2.64%, -0.12)
### data-env-vars.name = mercurial-public-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 4.700062 ~~~~~
after: 4.616739 (-1.77%, -0.08)
### data-env-vars.name = mercurial-public-2024-03-22-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 0.708915 ~~~~~
after: 0.697581 (-1.60%, -0.01)
### data-env-vars.name = mercurial-public-2024-03-22-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 0.698667 ~~~~~
after: 0.693792
### data-env-vars.name = mercurial-public-2024-03-22-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.302459 ~~~~~
after: 0.296517 (-1.96%, -0.01)
### data-env-vars.name = mercurial-public-2024-03-22-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.297432 ~~~~~
after: 0.293347 (-1.37%, -0.00)
### data-env-vars.name = mercurial-public-2024-03-22-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 0.200229 ~~~~~
after: 0.199035
### data-env-vars.name = mercurial-public-2024-03-22-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 0.199995 ~~~~~
after: 0.199130
### data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 0.712384 ~~~~~
after: 0.703804 (-1.20%, -0.01)
### data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 0.704736 ~~~~~
after: 0.699944
### data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.300989 ~~~~~
after: 0.300870
### data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.296388 ~~~~~
after: 0.295122
### data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 0.323753 ~~~~~
after: 0.328260 (+1.39%, +0.00)
### data-env-vars.name = mercurial-public-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 0.326091 ~~~~~
after: 0.325825
### data-env-vars.name = mozilla-central-2018-08-01-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 36.797693 ~~~~~
after: 35.395390 (-3.81%, -1.40)
### data-env-vars.name = mozilla-central-2018-08-01-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 36.400602 ~~~~~
after: 35.793828 (-1.67%, -0.61)
### data-env-vars.name = mozilla-central-2018-08-01-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.303372 ~~~~~
after: 0.302275
### data-env-vars.name = mozilla-central-2018-08-01-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.300228 ~~~~~
after: 0.299014
### data-env-vars.name = mozilla-central-2018-08-01-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 133.610273 ~~~~~
after: 134.082667
### data-env-vars.name = mozilla-central-2018-08-01-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 133.560602 ~~~~~
after: 133.560186
### data-env-vars.name = mozilla-central-2018-08-01-ds2-pnm
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 32.279654 ~~~~~
after: 31.937365 (-1.06%, -0.34)
### data-env-vars.name = mozilla-central-2018-08-01-ds2-pnm
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 32.393790 ~~~~~
after: 32.059161 (-1.03%, -0.33)
### data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 36.750314 ~~~~~
after: 35.659837 (-2.97%, -1.09)
### data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 36.132511 ~~~~~
after: 35.533999 (-1.66%, -0.60)
### data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.426249 ~~~~~
after: 0.427237
### data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.297567 ~~~~~
after: 0.297548
### data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 135.684726 ~~~~~
after: 135.554733
### data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 135.521429 ~~~~~
after: 135.471735
### data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 32.138181 ~~~~~
after: 31.376612 (-2.37%, -0.76)
### data-env-vars.name = mozilla-central-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 32.436170 ~~~~~
after: 31.800662 (-1.96%, -0.64)
### data-env-vars.name = mozilla-central-2024-03-22-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 56.412651 ~~~~~
after: 55.968979
### data-env-vars.name = mozilla-central-2024-03-22-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 57.291139 ~~~~~
after: 55.623600 (-2.91%, -1.67)
### data-env-vars.name = mozilla-central-2024-03-22-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.305015 ~~~~~
after: 0.302645
### data-env-vars.name = mozilla-central-2024-03-22-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.299651 ~~~~~
after: 0.296140 (-1.17%, -0.00)
### data-env-vars.name = mozilla-central-2024-03-22-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 372.603646 ~~~~~
after: 379.958592 (+1.97%, +7.35)
### data-env-vars.name = mozilla-central-2024-03-22-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 372.571283 ~~~~~
after: 376.975082 (+1.18%, +4.40)
### data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 57.900620 ~~~~~
after: 56.628974 (-2.20%, -1.27)
### data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 56.772457 ~~~~~
after: 56.219994
### data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.497401 ~~~~~
after: 0.498934
### data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.298446 ~~~~~
after: 0.297411
### data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 376.794500 ~~~~~
after: 377.126872
### data-env-vars.name = mozilla-central-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 377.108643 ~~~~~
after: 378.355222
### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 58.211350 ~~~~~
after: 56.179941 (-3.49%, -2.03)
### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 1.221867 ~~~~~
after: 1.171836 (-4.09%, -0.05)
### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = yes
# benchmark.variants.rev = none
before: 169.190180 ~~~~~
after: 167.816681
### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm
# benchmark.name = hg.command.unbundle
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.resource-usage = default
# benchmark.variants.reuse-external-delta-parent = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = unbundle
# benchmark.variants.validate = default
# benchmark.variants.verbosity = quiet
before: 70.573063 ~~~~~
after: 70.149730
### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 2469.554928 ~~~~~
after: 2459.756854
### data-env-vars.name = mozilla-try-2024-03-26-ds2-pnm
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 63.259498 ~~~~~
after: 62.934324
### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 52.009024 ~~~~~
after: 51.021327 (-1.90%, -0.99)
### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 52.021120 ~~~~~
after: 51.187100 (-1.60%, -0.83)
### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.316214 ~~~~~
after: 0.313213
### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.314039 ~~~~~
after: 0.309434 (-1.47%, -0.00)
### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 419.229602 ~~~~~
after: 418.731461
### data-env-vars.name = mozilla-unified-2024-03-22-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 419.121169 ~~~~~
after: 418.893086
### data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 52.298052 ~~~~~
after: 51.680823 (-1.18%, -0.62)
### data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 51.979719 ~~~~~
after: 50.517619 (-2.81%, -1.46)
### data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.542347 ~~~~~
after: 0.541494
### data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.361585 ~~~~~
after: 0.359601
### data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 424.435573 ~~~~~
after: 425.054393
### data-env-vars.name = mozilla-unified-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 425.369579 ~~~~~
after: 424.182501
### data-env-vars.name = netbeans-2018-08-01-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 17.169597 ~~~~~
after: 16.809620 (-2.10%, -0.36)
### data-env-vars.name = netbeans-2018-08-01-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 17.052174 ~~~~~
after: 16.873865 (-1.05%, -0.18)
### data-env-vars.name = netbeans-2018-08-01-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.300405 ~~~~~
after: 0.296493 (-1.30%, -0.00)
### data-env-vars.name = netbeans-2018-08-01-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.296907 ~~~~~
after: 0.291884 (-1.69%, -0.01)
### data-env-vars.name = netbeans-2018-08-01-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 76.353166 ~~~~~
after: 76.315550
### data-env-vars.name = netbeans-2018-08-01-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 76.304418 ~~~~~
after: 76.314896
### data-env-vars.name = netbeans-2018-08-01-ds2-pnm
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 41.448226 ~~~~~
after: 39.696075 (-4.23%, -1.75)
### data-env-vars.name = netbeans-2018-08-01-ds2-pnm
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 41.489911 ~~~~~
after: 40.213760 (-3.08%, -1.28)
### data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 17.276211 ~~~~~
after: 16.934238 (-1.98%, -0.34)
### data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 17.275566 ~~~~~
after: 17.151560
### data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.363647 ~~~~~
after: 0.364217
### data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.292249 ~~~~~
after: 0.293737
### data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 77.242740 ~~~~~
after: 77.165247
### data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 77.189009 ~~~~~
after: 77.153971
### data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 40.341299 ~~~~~
after: 40.604985
### data-env-vars.name = netbeans-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 40.585503 ~~~~~
after: 40.820806
### data-env-vars.name = netbeans-2019-11-07-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 17.515332 ~~~~~
after: 17.190762 (-1.85%, -0.32)
### data-env-vars.name = netbeans-2019-11-07-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 17.343596 ~~~~~
after: 17.050369 (-1.69%, -0.29)
### data-env-vars.name = netbeans-2019-11-07-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.316108 ~~~~~
after: 0.315292
### data-env-vars.name = netbeans-2019-11-07-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.311521 ~~~~~
after: 0.307919 (-1.16%, -0.00)
### data-env-vars.name = netbeans-2019-11-07-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 80.169792 ~~~~~
after: 80.090093
### data-env-vars.name = netbeans-2019-11-07-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 80.168257 ~~~~~
after: 80.203922
### data-env-vars.name = netbeans-2019-11-07-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 17.471723 ~~~~~
after: 17.104498 (-2.10%, -0.37)
### data-env-vars.name = netbeans-2019-11-07-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 17.351268 ~~~~~
after: 17.039244 (-1.80%, -0.31)
### data-env-vars.name = netbeans-2019-11-07-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.379920 ~~~~~
after: 0.380529
### data-env-vars.name = netbeans-2019-11-07-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.306940 ~~~~~
after: 0.308172
### data-env-vars.name = netbeans-2019-11-07-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 81.143787 ~~~~~
after: 81.205227
### data-env-vars.name = netbeans-2019-11-07-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 81.208757 ~~~~~
after: 81.201285
### data-env-vars.name = pypy-2018-08-01-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 1.409354 ~~~~~
after: 1.384783 (-1.74%, -0.02)
### data-env-vars.name = pypy-2018-08-01-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 1.395327 ~~~~~
after: 1.379295 (-1.15%, -0.02)
### data-env-vars.name = pypy-2018-08-01-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.305516 ~~~~~
after: 0.301302 (-1.38%, -0.00)
### data-env-vars.name = pypy-2018-08-01-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.300681 ~~~~~
after: 0.296424 (-1.42%, -0.00)
### data-env-vars.name = pypy-2018-08-01-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 1.228350 ~~~~~
after: 1.225184
### data-env-vars.name = pypy-2018-08-01-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 1.227250 ~~~~~
after: 1.226652
### data-env-vars.name = pypy-2018-08-01-ds2-pnm
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 10.441251 ~~~~~
after: 10.233845 (-1.99%, -0.21)
### data-env-vars.name = pypy-2018-08-01-ds2-pnm
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 10.477187 ~~~~~
after: 10.518723
### data-env-vars.name = pypy-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 1.406229 ~~~~~
after: 1.383834 (-1.59%, -0.02)
### data-env-vars.name = pypy-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 1.404700 ~~~~~
after: 1.386296 (-1.31%, -0.02)
### data-env-vars.name = pypy-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.303247 ~~~~~
after: 0.304695
### data-env-vars.name = pypy-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.295575 ~~~~~
after: 0.294873
### data-env-vars.name = pypy-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 1.614998 ~~~~~
after: 1.619019
### data-env-vars.name = pypy-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 1.608089 ~~~~~
after: 1.613761
### data-env-vars.name = pypy-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 10.494740 ~~~~~
after: 10.183642 (-2.96%, -0.31)
### data-env-vars.name = pypy-2018-08-01-zstd-sparse-revlog
# benchmark.name = hg.perf.unbundle
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.issue6528 = default
# benchmark.variants.revs = any-10000-extra-rev
# benchmark.variants.source = default
before: 10.153362 ~~~~~
after: 10.208118
### data-env-vars.name = pypy-2024-03-22-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 1.613760 ~~~~~
after: 1.595667 (-1.12%, -0.02)
### data-env-vars.name = pypy-2024-03-22-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 1.601770 ~~~~~
after: 1.589591
### data-env-vars.name = pypy-2024-03-22-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.300656 ~~~~~
after: 0.299511
### data-env-vars.name = pypy-2024-03-22-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.298116 ~~~~~
after: 0.34f44a
### data-env-vars.name = pypy-2024-03-22-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 1.451637 ~~~~~
after: 1.449828
### data-env-vars.name = pypy-2024-03-22-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 1.447463 ~~~~~
after: 1.447144
### data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 1.618347 ~~~~~
after: 1.593819 (-1.52%, -0.02)
### data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 1.610104 ~~~~~
after: 1.591181 (-1.18%, -0.02)
### data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.299082 ~~~~~
after: 0.302411 (+1.11%, +0.00)
### data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.294385 ~~~~~
after: 0.294103
### data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 1.896348 ~~~~~
after: 1.892661
### data-env-vars.name = pypy-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 1.897075 ~~~~~
after: 1.896864
### data-env-vars.name = tryton-public-2024-03-22-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 1.823667 ~~~~~
after: 1.791246 (-1.78%, -0.03)
### data-env-vars.name = tryton-public-2024-03-22-ds2-pnm
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 1.820555 ~~~~~
after: 1.765854 (-3.00%, -0.05)
### data-env-vars.name = tryton-public-2024-03-22-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.340665 ~~~~~
after: 0.336729 (-1.16%, -0.00)
### data-env-vars.name = tryton-public-2024-03-22-ds2-pnm
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.335204 ~~~~~
after: 0.333865
### data-env-vars.name = tryton-public-2024-03-22-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 0.262541 ~~~~~
after: 0.261794
### data-env-vars.name = tryton-public-2024-03-22-ds2-pnm
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 0.261495 ~~~~~
after: 0.260879
### data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 1.856138 ~~~~~
after: 1.784902 (-3.84%, -0.07)
### data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.cat
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.files = all-root
# benchmark.variants.output = plain
# benchmark.variants.rev = tip
before: 1.811432 ~~~~~
after: 1.782845 (-1.58%, -0.03)
### data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.343215 ~~~~~
after: 0.341859
### data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.command.log
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.limit-rev = 1000
# benchmark.variants.patch = no
# benchmark.variants.rev = none
before: 0.332617 ~~~~~
after: 0.331202
### data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rhg
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 0.590326 ~~~~~
after: 0.590407
### data-env-vars.name = tryton-public-2024-03-22-zstd-sparse-revlog
# benchmark.name = hg.perf.read-revisions
# bin-env-vars.hg.flavor = rust
# bin-env-vars.hg.py-re2-module = default
# benchmark.variants.order = default
# benchmark.variants.revlog = manifestlog
before: 0.589567 ~~~~~
after: 0.588821
```
author | Rapha?l Gom?s <rgomes@octobus.net> |
---|---|
date | Tue, 07 Jan 2025 17:34:25 +0100 |
parents | 01aff9437828 |
children | b8cd277d26f4 |
files | mercurial/localrepo.py mercurial/revlog.py mercurial/scmutil.py mercurial/setdiscovery.py rust/hg-pyo3/src/ancestors.rs rust/hg-pyo3/src/dagops.rs rust/hg-pyo3/src/revision.rs tests/test-rust-ancestor.py tests/test-rust-discovery.py |
diffstat | 9 files changed, 83 insertions(+), 93 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/localrepo.py Mon Jan 06 01:14:52 2025 +0100 +++ b/mercurial/localrepo.py Tue Jan 07 17:34:25 2025 +0100 @@ -3804,7 +3804,9 @@ requirements.add(requirementsmod.BOOKMARKS_IN_STORE_REQUIREMENT) # The feature is disabled unless a fast implementation is available. - persistent_nodemap_default = policy.importrust('revlog') is not None + persistent_nodemap_default = ( + policy.importrust('revlog', pyo3=True) is not None + ) if ui.configbool( b'format', b'use-persistent-nodemap', persistent_nodemap_default ):
--- a/mercurial/revlog.py Mon Jan 06 01:14:52 2025 +0100 +++ b/mercurial/revlog.py Tue Jan 07 17:34:25 2025 +0100 @@ -138,7 +138,7 @@ parsers = policy.importmod('parsers') rustancestor = policy.importrust('ancestor', pyo3=True) rustdagop = policy.importrust('dagop', pyo3=True) -rustrevlog = policy.importrust('revlog') +rustrevlog = policy.importrust('revlog', pyo3=True) # Aliased for performance. _zlibdecompress = zlib.decompress
--- a/mercurial/scmutil.py Mon Jan 06 01:14:52 2025 +0100 +++ b/mercurial/scmutil.py Tue Jan 07 17:34:25 2025 +0100 @@ -83,7 +83,7 @@ ) parsers = policy.importmod('parsers') -rustrevlog = policy.importrust('revlog') +rustrevlog = policy.importrust('revlog', pyo3=True) termsize = scmplatform.termsize
--- a/mercurial/setdiscovery.py Mon Jan 06 01:14:52 2025 +0100 +++ b/mercurial/setdiscovery.py Tue Jan 07 17:34:25 2025 +0100 @@ -276,7 +276,7 @@ pure_partialdiscovery = partialdiscovery partialdiscovery = policy.importrust( - 'discovery', member='PartialDiscovery', default=partialdiscovery + 'discovery', member='PartialDiscovery', default=partialdiscovery, pyo3=True )
--- a/rust/hg-pyo3/src/ancestors.rs Mon Jan 06 01:14:52 2025 +0100 +++ b/rust/hg-pyo3/src/ancestors.rs Tue Jan 07 17:34:25 2025 +0100 @@ -8,12 +8,11 @@ //! Bindings for the `hg::ancestors` module provided by the //! `hg-core` crate. From Python, this will be seen as `pyo3_rustext.ancestor` //! and can be used as replacement for the the pure `ancestor` Python module. -use cpython::UnsafePyLeaked; use pyo3::prelude::*; use pyo3::types::PyTuple; +use pyo3_sharedref::SharedByPyObject; use std::collections::HashSet; -use std::sync::RwLock; use hg::MissingAncestors as CoreMissing; use vcsgraph::lazy_ancestors::{ @@ -21,18 +20,16 @@ LazyAncestors as VCGLazyAncestors, }; -use crate::convert_cpython::{ - proxy_index_py_leak, py_leaked_borrow, py_leaked_borrow_mut, - py_leaked_or_map_err, +use crate::exceptions::GraphError; +use crate::revision::{rev_pyiter_collect_with_py_index, PyRevision}; +use crate::revlog::PySharedIndex; +use crate::util::{ + new_submodule, py_rust_index_to_graph, py_shared_or_map_err, }; -use crate::exceptions::{map_lock_error, GraphError}; -use crate::revision::{rev_pyiter_collect_with_py_index, PyRevision}; -use crate::util::new_submodule; -use rusthg::revlog::PySharedIndex; #[pyclass] struct AncestorsIterator { - inner: RwLock<UnsafePyLeaked<VCGAncestorsIterator<PySharedIndex>>>, + inner: SharedByPyObject<VCGAncestorsIterator<PySharedIndex>>, } #[pymethods] @@ -44,11 +41,12 @@ stoprev: PyRevision, inclusive: bool, ) -> PyResult<Self> { + let py = index_proxy.py(); let initvec: Vec<_> = rev_pyiter_collect_with_py_index(initrevs, index_proxy)?; - let (py, leaked_idx) = proxy_index_py_leak(index_proxy)?; + let shared_idx = py_rust_index_to_graph(index_proxy)?; let res_ait = unsafe { - leaked_idx.map(py, |idx| { + shared_idx.map(py, |idx| { VCGAncestorsIterator::new( idx, initvec.into_iter().map(|r| r.0), @@ -57,9 +55,8 @@ ) }) }; - let ait = - py_leaked_or_map_err(py, res_ait, GraphError::from_vcsgraph)?; - let inner = ait.into(); + let inner = + py_shared_or_map_err(py, res_ait, GraphError::from_vcsgraph)?; Ok(Self { inner }) } @@ -67,10 +64,10 @@ slf } - fn __next__(slf: PyRefMut<'_, Self>) -> PyResult<Option<PyRevision>> { - let mut leaked = slf.inner.write().map_err(map_lock_error)?; - // Safety: we don't leak the inner 'static ref out of UnsafePyLeaked - let mut inner = unsafe { py_leaked_borrow_mut(&slf, &mut leaked)? }; + fn __next__(mut slf: PyRefMut<'_, Self>) -> PyResult<Option<PyRevision>> { + let py = slf.py(); + // Safety: we don't leak the inner 'static ref out of SharedByPyObject + let mut inner = unsafe { slf.inner.try_borrow_mut(py) }?; match inner.next() { Some(Err(e)) => Err(GraphError::from_vcsgraph(e)), None => Ok(None), @@ -81,7 +78,7 @@ #[pyclass(sequence)] struct LazyAncestors { - inner: RwLock<UnsafePyLeaked<VCGLazyAncestors<PySharedIndex>>>, + inner: SharedByPyObject<VCGLazyAncestors<PySharedIndex>>, proxy_index: PyObject, initrevs: PyObject, stoprev: PyRevision, @@ -92,6 +89,7 @@ impl LazyAncestors { #[new] fn new( + py: Python<'_>, index_proxy: &Bound<'_, PyAny>, initrevs: &Bound<'_, PyAny>, stoprev: PyRevision, @@ -100,11 +98,11 @@ let cloned_proxy = index_proxy.clone().unbind(); let initvec: Vec<_> = rev_pyiter_collect_with_py_index(initrevs, index_proxy)?; - let (py, leaked_idx) = proxy_index_py_leak(index_proxy)?; + let shared_idx = py_rust_index_to_graph(index_proxy)?; // Safety: we don't leak the "faked" reference out of - // `UnsafePyLeaked` + // `SharedByPyObject` let res_lazy = unsafe { - leaked_idx.map(py, |idx| { + shared_idx.map(py, |idx| { VCGLazyAncestors::new( idx, initvec.into_iter().map(|r| r.0), @@ -113,10 +111,10 @@ ) }) }; - let lazy = - py_leaked_or_map_err(py, res_lazy, GraphError::from_vcsgraph)?; + let inner = + py_shared_or_map_err(py, res_lazy, GraphError::from_vcsgraph)?; Ok(Self { - inner: lazy.into(), + inner, proxy_index: cloned_proxy, initrevs: initrevs.clone().unbind(), stoprev, @@ -124,23 +122,21 @@ }) } - fn __bool__(slf: PyRef<'_, Self>) -> PyResult<bool> { - let leaked = slf.inner.read().map_err(map_lock_error)?; - // Safety: we don't leak the "faked" reference out of `UnsafePyLeaked` - let inner = unsafe { py_leaked_borrow(&slf, &leaked) }?; + fn __bool__(slf: PyRef<'_, Self>, py: Python<'_>) -> PyResult<bool> { + // Safety: we don't leak the "faked" reference out of + // `SharedByPyObject` + let inner = unsafe { slf.inner.try_borrow(py) }?; Ok(!inner.is_empty()) } fn __contains__( - slf: PyRefMut<'_, Self>, + mut slf: PyRefMut<'_, Self>, obj: &Bound<'_, PyAny>, ) -> PyResult<bool> { PyRevision::extract_bound(obj).map_or(Ok(false), |rev| { - let mut leaked = slf.inner.write().map_err(map_lock_error)?; // Safety: we don't leak the "faked" reference out of - // `UnsafePyLeaked` - let mut inner = - unsafe { py_leaked_borrow_mut(&slf, &mut leaked) }?; + // `SharedByPyObject` + let mut inner = unsafe { slf.inner.try_borrow_mut(obj.py()) }?; inner.contains(rev.0).map_err(GraphError::from_vcsgraph) }) } @@ -158,7 +154,7 @@ #[pyclass] struct MissingAncestors { - inner: RwLock<UnsafePyLeaked<CoreMissing<PySharedIndex>>>, + inner: SharedByPyObject<CoreMissing<PySharedIndex>>, proxy_index: PyObject, } @@ -172,52 +168,54 @@ let cloned_proxy = index_proxy.clone().unbind(); let bases_vec: Vec<_> = rev_pyiter_collect_with_py_index(bases, index_proxy)?; - let (py, leaked_idx) = proxy_index_py_leak(index_proxy)?; + let shared_idx = py_rust_index_to_graph(index_proxy)?; // Safety: we don't leak the "faked" reference out of - // `UnsafePyLeaked` + // `SharedByPyObject` let inner = unsafe { - leaked_idx.map(py, |idx| CoreMissing::new(idx, bases_vec)) + shared_idx + .map(index_proxy.py(), |idx| CoreMissing::new(idx, bases_vec)) }; Ok(Self { - inner: inner.into(), + inner, proxy_index: cloned_proxy, }) } fn hasbases(slf: PyRef<'_, Self>) -> PyResult<bool> { - let leaked = slf.inner.read().map_err(map_lock_error)?; - // Safety: we don't leak the "faked" reference out of `UnsafePyLeaked` - let inner = unsafe { py_leaked_borrow(&slf, &leaked) }?; + // Safety: we don't leak the "faked" reference out of + // `SharedByPyObject` + let inner = unsafe { slf.inner.try_borrow(slf.py()) }?; Ok(inner.has_bases()) } fn addbases( - slf: PyRefMut<'_, Self>, + mut slf: PyRefMut<'_, Self>, bases: &Bound<'_, PyAny>, ) -> PyResult<()> { - let index_proxy = slf.proxy_index.bind(slf.py()); + let py = slf.py(); + let index_proxy = slf.proxy_index.bind(py); let bases_vec: Vec<_> = rev_pyiter_collect_with_py_index(bases, index_proxy)?; - let mut leaked = slf.inner.write().map_err(map_lock_error)?; - // Safety: we don't leak the "faked" reference out of `UnsafePyLeaked` - let mut inner = unsafe { py_leaked_borrow_mut(&slf, &mut leaked) }?; + // Safety: we don't leak the "faked" reference out of + // `SharedByPyObject` + let mut inner = unsafe { slf.inner.try_borrow_mut(py) }?; inner.add_bases(bases_vec); Ok(()) } fn bases(slf: PyRef<'_, Self>) -> PyResult<HashSet<PyRevision>> { - let leaked = slf.inner.read().map_err(map_lock_error)?; - // Safety: we don't leak the "faked" reference out of `UnsafePyLeaked` - let inner = unsafe { py_leaked_borrow(&slf, &leaked) }?; + // Safety: we don't leak the "faked" reference out of + // `SharedByPyObject` + let inner = unsafe { slf.inner.try_borrow(slf.py()) }?; Ok(inner.get_bases().iter().map(|r| PyRevision(r.0)).collect()) } fn basesheads(slf: PyRef<'_, Self>) -> PyResult<HashSet<PyRevision>> { - let leaked = slf.inner.read().map_err(map_lock_error)?; - // Safety: we don't leak the "faked" reference out of `UnsafePyLeaked` - let inner = unsafe { py_leaked_borrow(&slf, &leaked) }?; + // Safety: we don't leak the "faked" reference out of + // `SharedByPyObject` + let inner = unsafe { slf.inner.try_borrow(slf.py()) }?; Ok(inner .bases_heads() .map_err(GraphError::from_hg)? @@ -227,7 +225,7 @@ } fn removeancestorsfrom( - slf: PyRef<'_, Self>, + mut slf: PyRefMut<'_, Self>, revs: &Bound<'_, PyAny>, ) -> PyResult<()> { // Original comment from hg-cpython: @@ -243,35 +241,37 @@ // PyO3 additional comment: the trait approach would probably be // simpler because we can implement it without a Py wrappper, just // on &Bound<'py, PySet> - let index_proxy = slf.proxy_index.bind(slf.py()); + let py = slf.py(); + let index_proxy = slf.proxy_index.bind(py); let mut revs_set: HashSet<_> = rev_pyiter_collect_with_py_index(revs, index_proxy)?; - let mut leaked = slf.inner.write().map_err(map_lock_error)?; - // Safety: we don't leak the "faked" reference out of `UnsafePyLeaked` - let mut inner = unsafe { py_leaked_borrow_mut(&slf, &mut leaked) }?; + // Safety: we don't leak the "faked" reference out of + // `SharedByPyObject` + let mut inner = unsafe { slf.inner.try_borrow_mut(py) }?; inner .remove_ancestors_from(&mut revs_set) .map_err(GraphError::from_hg)?; // convert as Python tuple and discard from original `revs` let remaining_tuple = - PyTuple::new(slf.py(), revs_set.iter().map(|r| PyRevision(r.0)))?; + PyTuple::new(py, revs_set.iter().map(|r| PyRevision(r.0)))?; revs.call_method("intersection_update", (remaining_tuple,), None)?; Ok(()) } fn missingancestors( - slf: PyRefMut<'_, Self>, + mut slf: PyRefMut<'_, Self>, bases: &Bound<'_, PyAny>, ) -> PyResult<Vec<PyRevision>> { - let index_proxy = slf.proxy_index.bind(slf.py()); + let py = slf.py(); + let index_proxy = slf.proxy_index.bind(py); let revs_vec: Vec<_> = rev_pyiter_collect_with_py_index(bases, index_proxy)?; - let mut leaked = slf.inner.write().map_err(map_lock_error)?; - // Safety: we don't leak the "faked" reference out of `UnsafePyLeaked` - let mut inner = unsafe { py_leaked_borrow_mut(&slf, &mut leaked) }?; + // Safety: we don't leak the "faked" reference out of + // `SharedByPyObject` + let mut inner = unsafe { slf.inner.try_borrow_mut(py) }?; let missing_vec = inner .missing_ancestors(revs_vec)
--- a/rust/hg-pyo3/src/dagops.rs Mon Jan 06 01:14:52 2025 +0100 +++ b/rust/hg-pyo3/src/dagops.rs Tue Jan 07 17:34:25 2025 +0100 @@ -15,10 +15,9 @@ use hg::{dagops, Revision}; -use crate::convert_cpython::proxy_index_extract; use crate::exceptions::GraphError; use crate::revision::{rev_pyiter_collect, PyRevision}; -use crate::util::new_submodule; +use crate::util::{new_submodule, proxy_index_extract}; /// Using the the `index_proxy`, return heads out of any Python iterable of /// Revisions @@ -29,7 +28,7 @@ index_proxy: &Bound<'_, PyAny>, revs: &Bound<'_, PyAny>, ) -> PyResult<HashSet<PyRevision>> { - // Safety: we don't leak the "faked" reference out of `UnsafePyLeaked` + // Safety: we don't leak the "faked" reference out of `SharedByPyObject` let index = unsafe { proxy_index_extract(index_proxy)? }; let mut as_set: HashSet<Revision> = rev_pyiter_collect(revs, index)?; dagops::retain_heads(index, &mut as_set).map_err(GraphError::from_hg)?;
--- a/rust/hg-pyo3/src/revision.rs Mon Jan 06 01:14:52 2025 +0100 +++ b/rust/hg-pyo3/src/revision.rs Tue Jan 07 17:34:25 2025 +0100 @@ -4,8 +4,8 @@ use hg::revlog::RevlogIndex; use hg::{BaseRevision, Revision, UncheckedRevision}; -use crate::convert_cpython::proxy_index_extract; use crate::exceptions::{rev_not_in_index, GraphError}; +use crate::util::proxy_index_extract; /// Revision as exposed to/from the Python layer. ///
--- a/tests/test-rust-ancestor.py Mon Jan 06 01:14:52 2025 +0100 +++ b/tests/test-rust-ancestor.py Tue Jan 07 17:34:25 2025 +0100 @@ -5,12 +5,11 @@ from mercurial.testing import revlog as revlogtesting try: - from mercurial import pyo3_rustext, rustext + from mercurial import pyo3_rustext - rustext.__name__ # trigger immediate actual import pyo3_rustext.__name__ except ImportError: - rustext = pyo3_rustext = None + pyo3_rustext = None try: from mercurial.cext import parsers as cparsers @@ -43,15 +42,15 @@ @classmethod def ancestors_mod(cls): - return cls.rustext_pkg.ancestor + return pyo3_rustext.ancestor @classmethod def dagop_mod(cls): - return cls.rustext_pkg.dagop + return pyo3_rustext.dagop @classmethod def graph_error(cls): - return cls.rustext_pkg.GraphError + return pyo3_rustext.GraphError def testiteratorrevlist(self): AncestorsIterator = self.ancestors_mod().AncestorsIterator @@ -193,18 +192,6 @@ missanc.removeancestorsfrom(revs) self.assertEqual(revs, {2, 3}) - -class RustCPythonAncestorsTest( - revlogtesting.RustRevlogBasedTestBase, RustAncestorsTestMixin -): - rustext_pkg = rustext - - -class PyO3AncestorsTest( - revlogtesting.RustRevlogBasedTestBase, RustAncestorsTestMixin -): - rustext_pkg = pyo3_rustext - def test_rank(self): dagop = self.dagop_mod()
--- a/tests/test-rust-discovery.py Mon Jan 06 01:14:52 2025 +0100 +++ b/tests/test-rust-discovery.py Tue Jan 07 17:34:25 2025 +0100 @@ -3,7 +3,9 @@ from mercurial import policy from mercurial.testing import revlog as revlogtesting -PartialDiscovery = policy.importrust('discovery', member='PartialDiscovery') +PartialDiscovery = policy.importrust( + 'discovery', member='PartialDiscovery', pyo3=True +) try: from mercurial.cext import parsers as cparsers @@ -48,7 +50,7 @@ "rustext or the C Extension parsers module " "discovery relies on is not available", ) -class rustdiscoverytest(revlogtesting.RustRevlogBasedTestBase): +class rustdiscoverytest(revlogtesting.PyO3RevlogBasedTestBase): """Test the correctness of binding to Rust code. This test is merely for the binding to Rust itself: extraction of