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 · 3fb2fbad
      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.
      3fb2fbad
  3. Feb 19, 2025
  4. Feb 03, 2023
    • Pierre-Yves David's avatar
      diff: add a --ignore-changes-from-ancestors option · 68866542
      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.
      68866542
  5. Feb 07, 2025
    • Mitchell Kember's avatar
      rhg-annotate: support whitespace options · 874c64e0
      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.
      874c64e0
  6. Feb 12, 2025
  7. Feb 18, 2025
  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 · aee193b1
      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)
      aee193b1
  10. Jan 21, 2025
    • Pierre-Yves David's avatar
      stream-clone-v2: use the pass through for threaded stream clone · 9abf173a
      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.
      9abf173a
  11. Jan 20, 2025
    • Pierre-Yves David's avatar
      stream-clone-v2: also use a thread to read the streamed data · d5ae6818
      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)
      d5ae6818
    • Pierre-Yves David's avatar
      stream-clone-v2: use dedicated threads to write the data on disk · 7f848cfc
      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)
      7f848cfc
  12. Feb 13, 2025
    • Raphaël Gomès's avatar
      index: remember the generaldelta config instead of getting it from the revlog · 8de68446
      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.
      8de68446
  13. Feb 10, 2025
  14. Jan 07, 2025
    • Raphaël Gomès's avatar
      rust-pyo3: switch over to the pyo3 `InnerRevlog` · e52dc683
      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
      ```
      e52dc683
  15. Jan 02, 2025
  16. Dec 25, 2024
    • Georges Racinet's avatar
      rust-pyo3-index: _index_headrevs · adf91dfe
      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`.
      adf91dfe
  17. Dec 22, 2024
  18. Dec 25, 2024
    • Georges Racinet's avatar
      rust-pyo3-index: first mutating methods · 34f44aa5
      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.
      34f44aa5
    • Georges Racinet's avatar
      rust-pyo3-revlog: _index___len__ · e5f89bd1
      Georges Racinet authored
      e5f89bd1
    • Georges Racinet's avatar
      rust-pyo3-revlog: nodemap based index methods · 4e34e8fd
      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`.
      4e34e8fd
  19. Dec 22, 2024
    • Georges Racinet's avatar
      rust-pyo3: reviving test-rust-revlog.py · 07740bd8
      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.
      07740bd8
  20. Feb 10, 2025
  21. Feb 07, 2025
    • Mitchell Kember's avatar
      annotate: add test for ancestor check starting revision · a49d6f3c
      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)
      a49d6f3c
  22. Jan 24, 2025
    • Mitchell Kember's avatar
      rhg: implement rhg annotate · 61839492
      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.
      61839492
  23. Feb 05, 2025
    • Mitchell Kember's avatar
      rust: add encoding.rs · bbf1c522
      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.
      bbf1c522
  24. Feb 07, 2025
  25. Feb 06, 2025
  26. Feb 01, 2025
    • Matt Harbison's avatar
      test-config: handle multiple path separators on Windows · 4c99bb87
      Matt Harbison authored
      This isn't a current problem because the only thing currently passed is in the
      form `"file1:file2"`.  When I had to patch in a 3rd file to load an extension,
      that caused the config to not be read from those two files, because only the
      first `:` was replaced.  Let's save somebody else time in the future if they add
      another file.
      4c99bb87
  27. Feb 06, 2025
    • Matt Harbison's avatar
      dispatch: restore `--config` can't be abbreviated message in case of ambiguity · 8780d570
      Matt Harbison authored
      This feels kind of gross, in part because it's a surprising amount of code for
      a specific edge case, and in part because it assumes some implementation
      details.  But I don't see a better way, since `getopt.long_has_args()` will
      create a list of all known long options that start with the current option, and
      raise errors of this type if the list is either empty or has more than one
      element.  There's not a programmatic way to tell the difference between these
      two aside from parsing the message, so we replicate the check here and raise
      the expected exception in the case of ambiguity.  Otherwise, the original
      expection is re-raised.
      8780d570
  28. Jan 29, 2025
    • Matt Harbison's avatar
      dispatch: add support for the `--config-file` global option · 25b344f2
      Matt Harbison authored
      Previously, loading a one-off config file for a command could be tricky- only
      the system level `*.rc` file processing supported scanning a directory of files
      (and the current user may not have the permission to modify those directories).
      Setting `HGRCPATH=...` worked, but also disabled the normal processing of all
      system level and user level config files, and there was no way to add the normal
      path processing into `HGRCPATH`.  Therefore, there was no easy way to append a
      config file to the normally processed config.  Some programs have taken to
      rewriting config into the repo level hgrc, and removing it when they're done.
      This makes that hack unnecessary.  Some config options (like `[auth]`) shouldn't
      be passed on the command line for security reasons, so the existing `--config`
      isn't sufficient.
      
      The config items here are handled very similarly to `--config` items, namely any
      item supercedes the same item in the system, user, and repo the configs.  The
      files are processed in the order they were specified, and any `--config` item
      will override an item in one of these files, regardless of the order they were
      specified on the command line.
      
      I don't like having to disable `ui.detailed-exit-code` in `test-config.t` to
      appease chg, but since the (bad?) behavior also occurs with `--config`, whatever
      is going on was existing behavior and not a problem with this change in
      particular.  I don't see an obvious reason for this behavior difference, and
      don't want to hold this up for something that nobody seems to have complained
      about.
      
      Also note that when there are certain parsing errors (e.g. `hg --confi "foo.bar=baz"`
      in `test-globalopts.t` tripped this), the code still plows through where
      `_parse_config_files()` is called in `dispatch.py`, but `cmdargs` isn't
      initialized.  I'd expect a failure like that to bail out earlier, but just avoid
      the problem by using `pycompat.sysargv`.
      25b344f2
Loading