Skip to content
Snippets Groups Projects
  1. Feb 06, 2025
    • Georges Racinet's avatar
      rust-pyo3-dirstate: status · 38e16da74aea
      Georges Racinet authored
      This finally makes use of the latest `path` utilities.
      As a side note, `paths_py_list` cannot use `PyHgPathRef` itself
      because by calling `as_ref()` it would make the compiler believe
      it returns code owner by the inner `map` closure.
      Also, `status_path_py_list(py, &status_res.modified)?` can
      probably be replaced by
      
      ```
      PyList::new(status_res.modified.iter().map(|p| PyHgPathRef(p)))?
      ```
      
      with (granted) little benefit, but it could spare us a new utility
      each time there is a new collection type to return.
      38e16da74aea
  2. Feb 05, 2025
  3. Feb 04, 2025
    • Georges Racinet's avatar
      aa2cfeed65c9
    • Georges Racinet's avatar
      rust-pyo3-dirstate: CopyMap iterators · c917656a259d
      Georges Racinet authored
      This requires yet another `Sync` marker in `hg-core`.
      
      Of course we are leveraging the new `py_shared_iterator!` for this.
      c917656a259d
    • Georges Racinet's avatar
      rust-pyo3-dirstate: CopyMap without proxy methods · 6b38ff460f2a
      Georges Racinet authored
      It turns out that it is fairly easy to call the core `DirstateMap`
      methods from a `CopyMap` PyO3 object, hence we do not need to introduce
      proxy methods on the FFI `DirstateMap` as was done in `rust-cpython`.
      It is more straightforward, and is somewhat easier to make with PyO3
      because we have all these intermediates between the Rust and Python layers
      (`Bound`, `Py<T>`).
      
      From the Python side, a difference with the `hg-cpython` version is that
      `CopyMap` would be instantiable also directly as `CopyMap(dirstate_map)`.
      Reproducing the `from_inner`, with refcount increase the responsibility in the
      `DirstateMap.copymap()` method would have been less natural (as there is
      no need with the separate `from_inner` in PyO3 constructors) and somehow
      we felt it was sounder to force the ref cloning from `CopyMap`.
      6b38ff460f2a
  4. Jan 30, 2025
  5. Feb 05, 2025
  6. Feb 06, 2025
  7. Jan 29, 2025
  8. Feb 04, 2025
    • Georges Racinet's avatar
      rust-pyo3-sharedref: macro to define Python iterators · 8f6d25439bdc
      Georges Racinet authored
      This convenience will help reducing the boilerplate for one of
      the most common use cases of the `pyo3_sharedref` crate.
      
      It is an improved adaptation of a similar macro that was in `hg-cpython`
      (but not in `rust-cpython`). The improvement is that it takes care of
      the constructor, sparing the `share_map` to the caller.
      8f6d25439bdc
  9. Jan 29, 2025
  10. Feb 06, 2025
    • Georges Racinet's avatar
      rust-pyo3: new module for conversions of HgPath and friends · c60f69556924
      Georges Racinet authored
      Same as `PyRevision`, the `PyHgPathRef` new-type wrapper is not
      a Python type, but it implements `IntoPyObject`, which will spare
      us tedious uses of `PyBytes::new`.
      
      The `paths_py_list` function is the the analog of `revs_py_list`
      for paths. There was one similar utility in `hg-cpython`, within
      the `dirstate::status` module. We feel it should be in a more global
      location, and have a name consistent with utilities for revisions.
      
      The `paths_pyiter_collect` function is similarly the analog of
      `revs_pyiter_collect`.
      c60f69556924
  11. Jan 29, 2025
    • Georges Racinet's avatar
      rust-pyo3-dirsate: DirstateMap definition and constructors · e7b825893e1b
      Georges Racinet authored
      With rust-cpython, using `Option<T>` in the Rust signature would
      translate automatically into a Python keyword argument, leading
      to unpleasantness on the Rust side in some cases (not here, though).
      with PyO3, though the signature can be specified explicitly (positional
      in this case) and there is even a warning that the implicit keywords
      style is deprecated.
      e7b825893e1b
  12. Feb 06, 2025
    • Georges Racinet's avatar
      rust-pyo3: implementing IntoPyObject for Node · e2d2961b8383
      Georges Racinet authored
      It will be simpler to go through the `PyNode` new-type, than to call
      `PyBytes::new(py, node.as_bytes())`. This also opens up many implicit usages,
      e.g, by `PyList::new` and the various "protocol" methods
      `PyAnyMethods::set_item`.
      
      Also we made the inner `Node` public because we feel `PyNode(n)` to
      be nicer than `n.into::<PyNode>()` as typically a bare `n.into()` will
      not be enough for `into_pyobject()` to know what to do.
      e2d2961b8383
  13. Jan 29, 2025
    • Georges Racinet's avatar
      rust-pyo3-dirstate: DirstateItem class · 138e4ce24680
      Georges Racinet authored
      The rust-cpython version was using `Cell`, which is not `Sync`, hence
      we replace it with the pervasive `RwLock`. This brings in turn some
      minor simplification, as we can access a mutable reference to the inner
      data directly, and do not need the `update()` method (a shortcut to
      perform the `get`/`set` dance of the `Cell`).
      
      Tighter signature control in PyO3 means that `set_fallback_exec` can
      probably be simplified, which we might do once everything is validated
      by the tests.
      138e4ce24680
    • Georges Racinet's avatar
      rust-pyo3-dirstate: DirstateIdentity class · 4e5efcaa7e60
      Georges Racinet authored
      4e5efcaa7e60
    • Georges Racinet's avatar
      c6707e112d96
    • Georges Racinet's avatar
      rust-pyo3: making PyBytesDeref Sync · 6b3b69b32a41
      Georges Racinet authored
      This parallels what we have done earlier with the version in rust-cpython.
      It was not needed until now because the previous use of this struct
      was in `InnerRevlog` for the single revision cache, and which is shielded in
      `hg-core` behind a `Mutex`.
      
      But `DirstateMap` is needing its `owner` to be `Sync` more directly.
      In turn it means that maybe we could remove the `Mutex` of `hg-core`.
      6b3b69b32a41
    • Georges Racinet's avatar
      rust-pyo3-dirstate: making bytes slices in core Sync · d9d6ae9b9722
      Georges Racinet authored
      For the purposes of providing PyO3 bindings, the data fields that will be
      exposed to Python  have to be `Sync`, hence that is the case of
      `OwningDirstateMap` and its `owner` field.
      
      We had to do something similar for the PyO3 bindings of `revlog`.
      
      In this case, it forces us to adapt the `Deref` wrapper of `PyBytes` used
      in `hg-cpython`, because it must itself now be `Sync` and raw pointers are
      not.
      
      This looks even uglier than it used to, but it does not matter much, because
      our ultimate goal is to remove the rust-cpython bindings altogether.
      d9d6ae9b9722
  14. Jan 24, 2025
  15. Feb 12, 2025
  16. Feb 03, 2025
  17. Jan 07, 2025
  18. Jan 06, 2025
  19. Jan 05, 2025
  20. Jan 07, 2025
    • Raphaël Gomès's avatar
      rust: clean up the dependency tree from the pyo3 transition · dd378072137d
      Raphaël Gomès authored
      These dependencies are not needed anymore, so trim them down.
      dd378072137d
    • Raphaël Gomès's avatar
      rust-pyo3: remove the now unused `convert_cpython` module · b8cd277d26f4
      Raphaël Gomès authored
      This was unvaluable during the start of the transition period, but is useless
      now that the `InnerRevlog` translation is over.
      b8cd277d26f4
    • Raphaël Gomès's avatar
      rust-pyo3: switch over to the pyo3 `InnerRevlog` · e52dc683bf6b
      Raphaël Gomès authored
      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
      ```
      e52dc683bf6b
  21. Jan 06, 2025
  22. Jan 05, 2025
  23. Jan 07, 2025
  24. Jan 05, 2025
  25. Jan 03, 2025
Loading