Skip to content
Snippets Groups Projects
  1. Feb 22, 2025
  2. Feb 20, 2025
    • Matt Harbison's avatar
      test-fix-path: avoid a test hang on Windows · 3fb2fbad4b13
      Matt Harbison authored
      Windows can't typically invoke `*.py` directly as a command, and will instead
      show a prompt asking what program should be used to open the file.  We can't
      directly invoke the interpreter as is usually done in this case, because the
      whole point is to run something not in `PATH`.  The easiest thing to do is
      invoke a *.bat file that runs the interpreter.  We can get away with this
      because the current implementation is to effectively run `cmd.exe /c %command%`,
      which doesn't need the file extension specified.
      3fb2fbad4b13
  3. Feb 19, 2025
  4. Feb 03, 2023
    • Pierre-Yves David's avatar
      diff: add a --ignore-changes-from-ancestors option · 688665425496
      Pierre-Yves David authored
      This is a generalisation of the new feature from evolve but for any diff, it
      allow to compares changes to patches regardless of the changes introduced by
      ancestors, this is typically useful after rebase and graft.
      
      I am not very happy about the name, but it is still experimental, so that can
      be improved later.
      
      Having the ability to compare ranges of commit would probably be handy too, but
      this changeset focus in getting the basic case in. We have to think about the
      UI a bit ahead however.
      688665425496
  5. Feb 07, 2025
    • Mitchell Kember's avatar
      rhg-annotate: support whitespace options · 874c64e041b5
      Mitchell Kember authored
      This adds support to rhg annotate for all the whitespace options:
      
          -w, --ignore-all-space
          -b, --ignore-space-change
          -B, --ignore-blank-lines
          -Z, --ignore-space-at-eol
      
      Note that --ignore-blank-lines has no effect on annotate so it is ignored. You
      can see this in dagop.py _annotepair which only checks if blocks are '=' or not,
      whereas the effect of --ignore-blank-lines is to change some '!' into '~'.
      
      When the other 3 are combined, we use the strongest option since -w implies -b
      and -b implies -Z. This is not explicit in the Python implementation, but I have
      verified that's how it behaves.
      874c64e041b5
  6. Feb 12, 2025
  7. Feb 18, 2025
    • Pierre-Yves David's avatar
      branching: merge with stable · 42f78c859dd1
      Pierre-Yves David authored
      42f78c859dd1
    • Pierre-Yves David's avatar
      dirstatemap: stop setting identity after reading the data · e16065bb7f42
      Pierre-Yves David authored
      The code was calling `_set_identity` in too many places, resulting in fetching
      cache information after reading the on disk data. This could result in old data
      labelled with the identity of new, never loaded data.
      
      Fixing it solve the issue spotted in the previous changesets.
      
      Further cleanup are warranted but it seems more reasonable to do them on stable.
      e16065bb7f42
    • Pierre-Yves David's avatar
      dirstate-race: fix a missing synchronisation in the python code · 51a9148f8349
      Pierre-Yves David authored
      This was giving the wrong output in the `dirstate-v2-rewrite` case. As the
      dirstate is rewritten, the data file is missing and we reload the full dirstate.
      The make the dirstate reloaded after the commit and it no longer see the file as
      dirty.
      
      Note that if we were deleting the data file less aggressively, we would see the other
      output. (for example if we were keeping old data file around for some time
      before deletion).
      
      One last thing… fixing this reveal a quite serious bug where a `hg status`
      end up overwriting a `hg update` done concurrently. Hooray for proper testing.
      51a9148f8349
    • Pierre-Yves David's avatar
      dirstate-race: simplify some output match to highligh an error · 565191843567
      Pierre-Yves David authored
      `#if dirstate-v2` is always false, because `dirstate-v2` is not one of the test
      cases. So we fix the conditionnal and adjust the expected matching.
      
      This highlight that the rhg/no-rhg output differ because an issue in the code.
      We will fix that in the next changeset.
      565191843567
    • Pierre-Yves David's avatar
      dirstate-race: add more output to highlight a "to-be-revealed" bug · 5b36cb26c650
      Pierre-Yves David authored
      We are going to fix a bug in the test framework, that will reveal a fairly
      serious bug with the Rust code. So we update the test before hand for clarity.
      5b36cb26c650
    • Julien Cristau's avatar
      bundles: filter out unsupported requirements for non-packed1 format · 961900fbd67c
      Julien Cristau authored
      stream bundle specs specify requirements, but we were ignoring this when
      selecting which bundle to apply, causing spurious clone failures.
      961900fbd67c
  8. Feb 17, 2025
  9. Jan 27, 2025
    • Pierre-Yves David's avatar
      stream-clone-v2: introduce a way to limit memory usage of the threaded version · aee193b1c784
      Pierre-Yves David authored
      This mechanism limit the read-aheadto avoid uncontrolled memory usage. Note that
      the memory target is not a hard limit and that mercurial will use more memory
      that specified in some cases, but "not too much more".
      
      The current implementation focus on "simplicity" and could be more efficient.
      However this provide a "safe" baseline for the feature. Now that the overall
      shape of the feature is here we can start making it faster.
      
      Here is more benchmark of how everything slows down. The next series will focus
      on optimizing this code path to actually speeds things up.
      
      ### benchmark.name                         = hg.perf.exchange.stream.consume
        # bin-env-vars.hg.flavor                 = default
        # bin-env-vars.hg.py-re2-module          = default
        # benchmark.variants.memory-target       = default
        # benchmark.variants.num-writer          = default
        # benchmark.variants.parallel-processing = yes
        # benchmark.variants.progress            = no
        # benchmark.variants.read-from-memory    = yes
        # benchmark.variants.version             = v2
       ## data-env-vars.name                     = heptapod-public-2024-03-25-zstd-sparse-revlog
      no-thread:    7.244015  ~~~~~
      write-thread: 9.128669  (+26.02%, +1.88)
      read-thread:  9.387256  (+29.59%, +2.14)
      mem-target:   9.901032  (+36.68%, +2.66)
       ## data-env-vars.name                     = mercurial-public-2024-03-22-zstd-sparse-revlog
      no-thread:    0.249693  ~~~~~
      write-thread: 0.275081  (+10.17%, +0.03)
      read-thread:  0.292601  (+17.18%, +0.04)
      mem-target:   0.305973  (+22.54%, +0.06)
       ## data-env-vars.name                     = netbeans-2019-11-07-zstd-sparse-revlog
      no-thread:    13.136674  ~~~~~
      write-thread: 16.374306  (+24.65%, +3.24)
      read-thread:  17.008865  (+29.48%, +3.87)
      mem-target:   18.467590  (+40.58%, +5.33)
       ## data-env-vars.name                     = netbsd-xsrc-all-2024-09-19-zstd-sparse-revlog
      no-thread:    5.317709  ~~~~~
      write-thread: 6.783031  (+27.56%, +1.47)
      read-thread:  7.107141  (+33.65%, +1.79)
      mem-target:   7.338505  (+38.00%, +2.02)
       ## data-env-vars.name                     = netbsd-xsrc-draft-2024-09-19-zstd-sparse-revlog
      no-thread:    5.398368  ~~~~~
      write-thread: 6.737864  (+24.81%, +1.34)
      read-thread:  7.163505  (+32.70%, +1.77)
      mem-target:   7.333354  (+35.84%, +1.93)
       ## data-env-vars.name                     = pypy-2024-03-22-zstd-sparse-revlog
      no-thread:    3.acbb55  ~~~~~
      write-thread: 3.758324  (+22.48%, +0.69)
      read-thread:  3.907693  (+27.34%, +0.84)
      mem-target:   4.238172  (+38.11%, +1.17)
      
       ## data-env-vars.name                     = mozilla-central-2024-03-22-zstd-sparse-revlog
      no-thread:    51.934795  ~~~~~
      write-thread: 66.561340 (+28.16%, +14.63)
      read-thread:  66.902619 (+28.82%, +14.97)
      mem-target:   78.194540 (+50.56%, +26.26)
       ## data-env-vars.name                     = mozilla-unified-2024-03-22-zstd-sparse-revlog
        # benchmark.variants.read-from-memory    = yes
      no-thread:    52.253858  ~~~~~
      write-thread: 66.955037 (+28.13%, +14.70)
      read-thread:  66.397609 (+27.07%, +14.14)
      mem-target:   77.492938 (+48.30%, +25.24)
       ## data-env-vars.name                     = mozilla-try-2024-03-26-zstd-sparse-revlog
        # benchmark.variants.read-from-memory    = no
      no-thread:    130.584329  ~~~~~
      write-thread: 138.770454   (+6.27%, +8.19)
      read-thread:  145.137477 (+11.14%, +14.55)
      mem-target:   164.366925 (+25.87%, +33.78)
      aee193b1c784
  10. Jan 21, 2025
    • Pierre-Yves David's avatar
      stream-clone-v2: use the pass through for threaded stream clone · 9abf173a958b
      Pierre-Yves David authored
      The reader thread just want to iterate over chunk, so let it do just that. This avoid some silly layer of filechunkiter and chunk buffer.
      
      Before this change, we had the following layers:
      
          bundle2part (iterator of chunks)
          → chunkbuffer (iterator of chunks to file-like)
          → filechunkiter (file-like to chunkgs)
          → _DataQueue (thread safe iterator of chunks)
          → chunkbuffer (iterator of chunks to file-like).
      
      We now have removed the first layer of chunkbuffer + filechunkiter:
      
          bundle2part (iterator of chunks)
          → _DataQueue (thread safe iterator of chunks)
          → chunkbuffer (iterator of chunks to file-like).
      
      This fix the output order change that was previously introduced.
      9abf173a958b
  11. Jan 20, 2025
    • Pierre-Yves David's avatar
      stream-clone-v2: also use a thread to read the streamed data · d5ae681834e8
      Pierre-Yves David authored
      We could do useful thing while waiting for data, so we introduce another thread
      dedicated to reading the bundle data and pass them to the thread parsing the
      bundle.
      
      This has a small impact on test output because the bundle part is consumed at a
      different time. However this will be smoothed out very soon so lets ignore that
      for now.
      
      As for the previous patch, the speed up in not there yet. We need to adjust
      various part of the implementation to see some benefit. However, this put the
      generic architecture in place so that we can focus on performance later.
      
      Below are some benchmark result to highlight the slowdown.
      
      ### benchmark.name                         = hg.perf.exchange.stream.consume
        # bin-env-vars.hg.flavor                 = default
        # bin-env-vars.hg.py-re2-module          = default
        # benchmark.variants.memory-target       = default
        # benchmark.variants.num-writer          = default
        # benchmark.variants.parallel-processing = yes
        # benchmark.variants.progress            = no
        # benchmark.variants.read-from-memory    = yes
        # benchmark.variants.version             = v2
       ## data-env-vars.name                     = heptapod-public-2024-03-25-zstd-sparse-revlog
      no-thread:    7.244015  ~~~~~
      write-thread: 9.128669  (+26.02%, +1.88)
      read-thread:  9.387256  (+29.59%, +2.14)
       ## data-env-vars.name                     = mercurial-public-2024-03-22-zstd-sparse-revlog
      no-thread:    0.249693  ~~~~~
      write-thread: 0.275081  (+10.17%, +0.03)
      read-thread:  0.292601  (+17.18%, +0.04)
       ## data-env-vars.name                     = netbeans-2019-11-07-zstd-sparse-revlog
      no-thread:    13.136674  ~~~~~
      write-thread: 16.374306  (+24.65%, +3.24)
      read-thread:  17.008865  (+29.48%, +3.87)
       ## data-env-vars.name                     = netbsd-xsrc-all-2024-09-19-zstd-sparse-revlog
      no-thread:    5.317709  ~~~~~
      write-thread: 6.783031  (+27.56%, +1.47)
      read-thread:  7.107141  (+33.65%, +1.79)
       ## data-env-vars.name                     = netbsd-xsrc-draft-2024-09-19-zstd-sparse-revlog
      no-thread:    5.398368  ~~~~~
      write-thread: 6.737864  (+24.81%, +1.34)
      read-thread:  7.163505  (+32.70%, +1.77)
       ## data-env-vars.name                     = pypy-2024-03-22-zstd-sparse-revlog
      no-thread:    3.acbb55  ~~~~~
      write-thread: 3.758324  (+22.48%, +0.69)
      read-thread:  3.907693  (+27.34%, +0.84)
       ## data-env-vars.name                     = mozilla-central-2024-03-22-zstd-sparse-revlog
      no-thread:    51.934795  ~~~~~
      write-thread: 66.561340 (+28.16%, +14.63)
      read-thread:  66.902619 (+28.82%, +14.97)
       ## data-env-vars.name                     = mozilla-unified-2024-03-22-zstd-sparse-revlog
      no-thread:    52.253858  ~~~~~
      write-thread: 66.955037 (+28.13%, +14.70)
      read-thread:  66.397609 (+27.07%, +14.14)
       ## data-env-vars.name                     = mozilla-try-2024-03-26-zstd-sparse-revlog
        # benchmark.variants.read-from-memory    = no
      no-thread:    130.584329  ~~~~~
      write-thread: 138.770454   (+6.27%, +8.19)
      read-thread:  145.137477 (+11.14%, +14.55)
      d5ae681834e8
    • Pierre-Yves David's avatar
      stream-clone-v2: use dedicated threads to write the data on disk · 7f848cfc4286
      Pierre-Yves David authored
      This could provide a significant performance boost, but various implementation
      details means it is currently slower. More update will help make this boost
      real, but here is the basic idea. The implementation in this patch is unbounded
      in memory which could be a problem in some situation. We will deal with that
      soon.
      
      There is the benchmark result showing a slower run
      
      ### benchmark.name                         = hg.perf.exchange.stream.consume
        # bin-env-vars.hg.flavor                 = default
        # bin-env-vars.hg.py-re2-module          = default
        # benchmark.variants.parallel-processing = yes
        # benchmark.variants.progress            = no
        # benchmark.variants.read-from-memory    = yes
        # benchmark.variants.version             = v2
       ## data-env-vars.name                     = mercurial-public-2024-03-22-zstd-sparse-revlog
      before: 0.249693  ~~~~~
      after:  0.275081  (+10.17%, +0.03)
       ## data-env-vars.name                     = netbsd-xsrc-all-2024-09-19-zstd-sparse-revlog
      before: 5.317709  ~~~~~
      after:  6.783031  (+27.56%, +1.47)
       ## data-env-vars.name                     = netbsd-xsrc-draft-2024-09-19-zstd-sparse-revlog
      before: 5.398368  ~~~~~
      after:  6.737864  (+24.81%, +1.34)
       ## data-env-vars.name                     = pypy-2024-03-22-zstd-sparse-revlog
      before: 3.acbb55  ~~~~~
      after:  3.758324  (+22.48%, +0.69)
       ## data-env-vars.name                     = heptapod-public-2024-03-25-zstd-sparse-revlog
      before: 7.244015  ~~~~~
      after:  9.128669  (+26.02%, +1.88)
       ## data-env-vars.name                     = netbeans-2019-11-07-zstd-sparse-revlog
      before: 13.136674  ~~~~~
      after:  16.374306  (+24.65%, +3.24)
       ## data-env-vars.name                     = mozilla-unified-2024-03-22-zstd-sparse-revlog
      before: 52.253858  ~~~~~
      after:  66.955037 (+28.13%, +14.70)
       ## data-env-vars.name                     = mozilla-central-2024-03-22-zstd-sparse-revlog
      before: 51.934795  ~~~~~
      after:  66.561340 (+28.16%, +14.63)
       ## data-env-vars.name                     = mozilla-try-2024-03-26-zstd-sparse-revlog
        # benchmark.variants.read-from-memory    = no
      before: 130.584329  ~~~~~
      after:  138.770454   (+6.27%, +8.19)
      7f848cfc4286
  12. Feb 13, 2025
    • Raphaël Gomès's avatar
      index: remember the generaldelta config instead of getting it from the revlog · 8de68446a5bd
      Raphaël Gomès authored
      The code (especially the Rust code) was jumping in 4 dimensions to make sense
      of what was going on because it wrongly assumed that we needed to somehow
      be able to ask a generaldelta index for a non-generaldelta delta chain, which
      doesn't make any sense.
      
      Removing the cargo-culted/vestigial code, this is cleaner and less confusing.
      8de68446a5bd
  13. Feb 10, 2025
    • Pierre-Yves David's avatar
      cleanup: remove the sqlitestore extension · e6069f84abbb
      Pierre-Yves David authored
      The idea of having a clear storage interface and a small extension to test it
      was not bad in theory. However this never materialize to anything concrete, and
      nobody has touched this extensions for over 6 years. So it is mainly getting in
      the way of other works.
      
      Incidently, the clarification of interface is seeing progress thanks to the Matt
      Harbison typing effort and the slow rewrite into rust of core element led by
      Octobus.
      
      So I suggest we drop this extension, freeing energy for other improvements.
      e6069f84abbb
    • Pierre-Yves David's avatar
      test-storage: actually allow things to run with rust · 513b518d07d7
      Pierre-Yves David authored
      The tests seems to run fine with `--rust` now ¯\_(ツ)_/¯
      513b518d07d7
    • Pierre-Yves David's avatar
      test-storage: add an explanation for the skip · 6dafd64d7bc1
      Pierre-Yves David authored
      It is kind of useful to know why things happens.
      6dafd64d7bc1
  14. Jan 07, 2025
    • 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
  15. Jan 02, 2025
  16. Dec 25, 2024
    • Georges Racinet's avatar
      rust-pyo3-index: _index_headrevs · adf91dfe6c04
      Georges Racinet authored
      This one demonstrates that why the `with_index_read` and similar
      helpers are useful and was actually the main motivation for doing
      them: if we kept the borrow used to grab the index before updating
      the caches, there would be a panic when calling `borrow_mut`.
      This was confirmed with an earlier version by the Python test.
      
      There are perhaps some internal API clarifications to be made, as
      the method updating the cache does a seemingly useless return), but
      we are keeping it as it was in `hg-cpython`.
      adf91dfe6c04
  17. Dec 22, 2024
  18. Dec 25, 2024
    • Georges Racinet's avatar
      rust-pyo3-index: first mutating methods · 34f44aa5e844
      Georges Racinet authored
      This brings in `append()` and `__delitem__`, and is for us the
      first validation of our inner mutability.
      
      In the case of `__delitem__`, there was a tricky case where we
      were tempted to use the higher level `PySlice::indices` API, with
      a possible dangerous change of behaviour. We test it carefully from
      the Python side.
      34f44aa5e844
    • Georges Racinet's avatar
      rust-pyo3-revlog: _index___len__ · e5f89bd1a5ee
      Georges Racinet authored
      e5f89bd1a5ee
    • Georges Racinet's avatar
      rust-pyo3-revlog: nodemap based index methods · 4e34e8fd46d4
      Georges Racinet authored
      They are rather straightforward, except for `_index_get_rev`
      that takes care of not initializing a nodetree on some conditions.
      
      In `_index_partialmatch`, we solve the todo that was in the
      `hg-cpython`, since we introduced the `py_node_for_rev` helper earlier.
      
      The new test method in `test-rust-revlog.py` provides comparison
      with the `hg-cpython` implementation of `InnerRevlog`.
      4e34e8fd46d4
  19. Dec 22, 2024
    • Georges Racinet's avatar
      rust-pyo3: reviving test-rust-revlog.py · 07740bd86fd9
      Georges Racinet authored
      This test file was removed in 7346f93be7a4. Adaptation to the
      new `InnerRevlog` / `RustIndexProxy` structure was as easy as
      redefining the `parserustindex()` method to use `RustIndexProxy`.
      
      As we did before with `test-rust-ancestors.py`, we are preparing
      a mixin class that will contain tests for both bindings.
      Existing tests will migrate from `RustInnerRevlogTest`
      (the one for `hg-cpython`) to the mixin.
      07740bd86fd9
  20. Feb 10, 2025
  21. Feb 07, 2025
    • Mitchell Kember's avatar
      annotate: add test for ancestor check starting revision · a49d6f3c971b
      Mitchell Kember authored
      Python hg annotate currently calls .introfilectx() and uses that for all
      ancestor checks. This is an unnecessary extra step, and it results in unstable
      output as shown in the test. It should instead behave like rhg annotate and use
      the starting revision passed on the command line for ancestor checks.
      
      This was discovered here:
      !1179 (comment 380887)
      a49d6f3c971b
  22. Jan 24, 2025
    • Mitchell Kember's avatar
      rhg: implement rhg annotate · 6183949219b2
      Mitchell Kember authored
      This initial implementation produces the same output as Python for all the files
      I've tried, and is usually 1.5-9x faster. The algorithm is mostly the same, but
      one key difference is that the Rust implementation only converts filelog
      revisions to changelog revisions if they will actually appear in the output.
      
      This does not support all the command line flags yet. In particular, --template,
      --include, --exclude, --skip, and whitespace-related flags will cause fallback
      to Python. Also, --rev 'wdir()' (often used by editor plugins) is not supported.
      There is also no pager.
      6183949219b2
  23. Feb 05, 2025
    • Mitchell Kember's avatar
      rust: add encoding.rs · bbf1c52252ae
      Mitchell Kember authored
      This is based on encoding.py. It reads the environment variables HGENCODING,
      HGENCODINGMODE, and HGENCODINGAMBIGUOUS. Currently it only supports UTF-8 and
      ascii, but it could be extended to support other local encodings.
      
      Unlike Python, it assumes all internal strings are UTF-8 and does not attempt to
      fallback to latin-1 (or ui.fallbackencoding).
      
      Nothing is using this now, but in the future command output and error messages
      should transition to using it.
      
      I replaced existing calls to `utf8_to_local` and `local_to_uf8` with direct
      String/bytes methods since they were not logically converting between internal
      and local encodings. Instead, they were used (for example) when an error message
      happened to be stored as String but needed to be passed somewhere as bytes. The
      proper fix for this will be to avoid String in the first place.
      bbf1c52252ae
  24. Feb 07, 2025
    • Matt Harbison's avatar
      tests: ignore unused imports warnings in `mercurial.interfaces.types` · 38095e4e9046
      Matt Harbison authored
      Supposedly, a `# noqa: F401` should be enough to ignore this warning.  PyCharm
      is happy with the comment, but `pyflakes` ignores that.  Since there's already
      precedent for filtering this out manually, apply that here too.  The imports are
      done on purpose for use elsewhere in the codebase.
      38095e4e9046
Loading