Tue, 12 Nov 2019 11:05:03 +0100 py3: avoid iterating over a literal bytes in highlight stable
Denis Laxalde <denis.laxalde@logilab.fr> [Tue, 12 Nov 2019 11:05:03 +0100] rev 43597
py3: avoid iterating over a literal bytes in highlight In Python 3, iterating over a bytes literal yields integers. Since we use the value in `text.replace()`, this fails on Python 3 with the following trackback: Traceback (most recent call last): File "/usr/lib/python3/dist-packages/mercurial/hgweb/hgwebdir_mod.py", line 378, in run_wsgi for r in self._runwsgi(req, res): File "/usr/lib/python3/dist-packages/mercurial/hgweb/hgweb_mod.py", line 326, in run_wsgi for r in self._runwsgi(req, res, repo): File "/usr/lib/python3/dist-packages/mercurial/hgweb/hgweb_mod.py", line 449, in _runwsgi return getattr(webcommands, cmd)(rctx) File "/usr/lib/python3/dist-packages/mercurial/hgweb/webcommands.py", line 211, in file return _filerevision(web, webutil.filectx(web.repo, web.req)) File "/usr/lib/python3/dist-packages/hgext/highlight/__init__.py", line 72, in filerevision_highlight pygmentize(web, b'fileline', fctx, web.tmpl) File "/usr/lib/python3/dist-packages/hgext/highlight/__init__.py", line 58, in pygmentize field, fctx, style, tmpl, guessfilenameonly=filenameonly File "/usr/lib/python3/dist-packages/hgext/highlight/highlight.py", line 62, in pygmentize text = text.replace(c, b'') TypeError: a bytes-like object is required, not 'int'
Mon, 11 Nov 2019 22:10:26 +0900 import-checker: allow 'from typing import ...'
Yuya Nishihara <yuya@tcha.org> [Mon, 11 Nov 2019 22:10:26 +0900] rev 43596
import-checker: allow 'from typing import ...' Suppresses the following error in test-check-module-imports.t: mercurial/encoding.py:24: relative import of stdlib module
Tue, 29 Oct 2019 23:33:34 -0700 match: drop support for passing '.' for root dir to visit*() methods
Martin von Zweigbergk <martinvonz@google.com> [Tue, 29 Oct 2019 23:33:34 -0700] rev 43595
match: drop support for passing '.' for root dir to visit*() methods We said we'd drop support for it after 5.1, so it's time to clean it up now. Differential Revision: https://phab.mercurial-scm.org/D7249
Wed, 16 Oct 2019 21:31:40 -0700 tests: use time.time() for relative start and stop times
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 16 Oct 2019 21:31:40 -0700] rev 43594
tests: use time.time() for relative start and stop times os.times() does not work on Windows. This was resulting in the test start, stop, and duration times being reported as 0. This commit swaps in time.time() for wall clock measurements. This isn't ideal, as time.time() is not monotonic. But Python 2.7 does not have a monotonic timer that works on Windows. So it is the best we have which is trivially usable. And test times aren't terribly important, so variances due to clock skew are arguably acceptable. Differential Revision: https://phab.mercurial-scm.org/D7126
Wed, 16 Oct 2019 21:25:08 -0700 tests: rename stopped and started variables to reflect times
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 16 Oct 2019 21:25:08 -0700] rev 43593
tests: rename stopped and started variables to reflect times In preparation for introducing more variables that will have similar names. Differential Revision: https://phab.mercurial-scm.org/D7125
Wed, 30 Oct 2019 00:00:21 -0700 revset: simplify checkstatus() by using any()
Martin von Zweigbergk <martinvonz@google.com> [Wed, 30 Oct 2019 00:00:21 -0700] rev 43592
revset: simplify checkstatus() by using any() Differential Revision: https://phab.mercurial-scm.org/D7179
Wed, 06 Nov 2019 18:28:11 -0800 rebase: check for unfinished ops even when inmemory (issue6214)
Kyle Lippincott <spectral@google.com> [Wed, 06 Nov 2019 18:28:11 -0800] rev 43591
rebase: check for unfinished ops even when inmemory (issue6214) When using rebase.experimental.inmemory, we should be able to work well with a dirty working directory, but we can not reliably work if we're in the middle of another operation (such as another rebase), as we'll potentially stomp on some state that the other operation needs. Differential Revision: https://phab.mercurial-scm.org/D7298
Fri, 18 Oct 2019 23:18:47 -0700 status: move initialization closer together
Martin von Zweigbergk <martinvonz@google.com> [Fri, 18 Oct 2019 23:18:47 -0700] rev 43590
status: move initialization closer together The default initialization happened long before it needed to happen. Differential Revision: https://phab.mercurial-scm.org/D7145
Sat, 19 Oct 2019 00:15:41 -0700 largefiles: avoid dynamically subclassing context instances
Martin von Zweigbergk <martinvonz@google.com> [Sat, 19 Oct 2019 00:15:41 -0700] rev 43589
largefiles: avoid dynamically subclassing context instances E.g. copies.pathcopies() compares context objects for equality and basectx.__eq__ compares the type. But since largefiles was dynamically creating classes, they would all be unequal. That led pathcopies(), after some changes I made, to not short-circuit to get copy info only from the dirstate. This patch fixes that short-circuiting (and other places where context are being compared for equality). Differential Revision: https://phab.mercurial-scm.org/D7143
Tue, 05 Nov 2019 13:31:40 -0800 relnotes: copy "next" to "5.2" and clear "next" stable
Martin von Zweigbergk <martinvonz@google.com> [Tue, 05 Nov 2019 13:31:40 -0800] rev 43588
relnotes: copy "next" to "5.2" and clear "next" This is the same thing as we did for 5.1 in cba59b338976 (relnotes: copy "next" to "5.1" and clear "next", 2019-08-01). Differential Revision: https://phab.mercurial-scm.org/D7231
Fri, 08 Nov 2019 10:13:05 -0800 py3: avoid `b'%s' % type(...)` in a ProgrammingError stable
Martin von Zweigbergk <martinvonz@google.com> [Fri, 08 Nov 2019 10:13:05 -0800] rev 43587
py3: avoid `b'%s' % type(...)` in a ProgrammingError Differential Revision: https://phab.mercurial-scm.org/D7363
Fri, 18 Oct 2019 22:08:20 -0700 largefiles: delete unused repo.status_nolfiles()
Martin von Zweigbergk <martinvonz@google.com> [Fri, 18 Oct 2019 22:08:20 -0700] rev 43586
largefiles: delete unused repo.status_nolfiles() Differential Revision: https://phab.mercurial-scm.org/D7142
Fri, 18 Oct 2019 21:36:19 -0700 largefiles: use context manager for wlock in repo.status() override
Martin von Zweigbergk <martinvonz@google.com> [Fri, 18 Oct 2019 21:36:19 -0700] rev 43585
largefiles: use context manager for wlock in repo.status() override Differential Revision: https://phab.mercurial-scm.org/D7141
Fri, 18 Oct 2019 17:52:19 -0700 largefiles: allow "lfstatus" context manager to set value to False
Martin von Zweigbergk <martinvonz@google.com> [Fri, 18 Oct 2019 17:52:19 -0700] rev 43584
largefiles: allow "lfstatus" context manager to set value to False Differential Revision: https://phab.mercurial-scm.org/D7140
Fri, 18 Oct 2019 17:46:37 -0700 largefiles: move lfstatus context manager to lfutil
Martin von Zweigbergk <martinvonz@google.com> [Fri, 18 Oct 2019 17:46:37 -0700] rev 43583
largefiles: move lfstatus context manager to lfutil Differential Revision: https://phab.mercurial-scm.org/D7139
Fri, 08 Nov 2019 14:35:53 -0800 revlog: delete references to deleted nullid sentinel value
Martin von Zweigbergk <martinvonz@google.com> [Fri, 08 Nov 2019 14:35:53 -0800] rev 43582
revlog: delete references to deleted nullid sentinel value We stopped keeping the nullid in the index in 781b2720d2ac (index: don't include nullid in len(), 2018-07-20). I forgot to update some comments about it. Differential Revision: https://phab.mercurial-scm.org/D7366
Sun, 10 Nov 2019 18:15:54 +0100 revlog: remove the, now unused, `revlog._nodepos` attribute
Pierre-Yves David <pierre-yves.david@octobus.net> [Sun, 10 Nov 2019 18:15:54 +0100] rev 43581
revlog: remove the, now unused, `revlog._nodepos` attribute Spotted by Yuya Nishihara.
Sat, 09 Nov 2019 10:31:58 +0100 py3: fix sorting of obsolete markers in obsutil (issue6217) stable
Denis Laxalde <denis@laxalde.org> [Sat, 09 Nov 2019 10:31:58 +0100] rev 43580
py3: fix sorting of obsolete markers in obsutil (issue6217) This is similar to 01e8eefd9434 and others. We move the sortedmarkers() function from exchange module to obsutil.
Sun, 10 Nov 2019 18:12:50 +0100 nodemap: use bytes for the error message
Pierre-Yves David <pierre-yves.david@octobus.net> [Sun, 10 Nov 2019 18:12:50 +0100] rev 43579
nodemap: use bytes for the error message Spotted by Yuya Nishihara.
Sat, 09 Nov 2019 16:16:31 +0100 py3: use native strings when forming email headers in patchbomb
Denis Laxalde <denis@laxalde.org> [Sat, 09 Nov 2019 16:16:31 +0100] rev 43578
py3: use native strings when forming email headers in patchbomb Per previous changesets, encoded header's values are native str. We complete the change in patchbomb extension to have literal header values native str as well. Then we can also change headers' keys to be str. In _msgid(), we still need to use encoding.strfromlocal() because usage of os.environ is not allowed by check-code. This finally removes the "if pycompat.ispy3:" TODO.
Sat, 09 Nov 2019 16:54:33 +0100 mail: convert addr to str early in addrlistencode()
Denis Laxalde <denis@laxalde.org> [Sat, 09 Nov 2019 16:54:33 +0100] rev 43577
mail: convert addr to str early in addrlistencode()
Sat, 09 Nov 2019 15:16:52 +0100 mail: let addressencode() / addrlistencode() return native strings
Denis Laxalde <denis@laxalde.org> [Sat, 09 Nov 2019 15:16:52 +0100] rev 43576
mail: let addressencode() / addrlistencode() return native strings Avoids conversion to "str" on py3.
Sat, 09 Nov 2019 12:45:14 +0100 mail: let headencode() return a native string
Denis Laxalde <denis@laxalde.org> [Sat, 09 Nov 2019 12:45:14 +0100] rev 43575
mail: let headencode() return a native string This is to avoid conversion to/from str on py3.
Sat, 09 Nov 2019 13:23:55 +0100 revlog: deprecate direct `nodemap` access
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:55 +0100] rev 43574
revlog: deprecate direct `nodemap` access Now that all in-core user have been updated to the new API, we can deprecated direct access to nodemap. Differential Revision: https://phab.mercurial-scm.org/D7362
Sat, 09 Nov 2019 13:23:55 +0100 revlog: drop special hack in the `nodemap` property
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:55 +0100] rev 43573
revlog: drop special hack in the `nodemap` property This code does not seems necessary anymore. Differential Revision: https://phab.mercurial-scm.org/D7361
Sat, 09 Nov 2019 13:23:55 +0100 perf: make `perfrevlogindex` use the new `index.rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:55 +0100] rev 43572
perf: make `perfrevlogindex` use the new `index.rev` api if available Differential Revision: https://phab.mercurial-scm.org/D7360
Sat, 09 Nov 2019 13:23:54 +0100 perf: make `perfnodemap` use the new `index.get_rev` api if available
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:54 +0100] rev 43571
perf: make `perfnodemap` use the new `index.get_rev` api if available Differential Revision: https://phab.mercurial-scm.org/D7358
Sat, 09 Nov 2019 13:23:54 +0100 index: use `index.get_rev` in `remotefilelog`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:54 +0100] rev 43570
index: use `index.get_rev` in `remotefilelog` Differential Revision: https://phab.mercurial-scm.org/D7357
Sat, 09 Nov 2019 13:23:54 +0100 index: use `index.get_rev` in `histedit.processreplacement`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:54 +0100] rev 43569
index: use `index.get_rev` in `histedit.processreplacement` Differential Revision: https://phab.mercurial-scm.org/D7354
Sat, 09 Nov 2019 13:23:54 +0100 index: use `index.get_rev` in `histedit.adjustreplacementsfrommarkers`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:54 +0100] rev 43568
index: use `index.get_rev` in `histedit.adjustreplacementsfrommarkers` Differential Revision: https://phab.mercurial-scm.org/D7353
Sat, 09 Nov 2019 13:23:54 +0100 index: use `index.get_rev` in `rebase._computeobsoletenotrebased`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:54 +0100] rev 43567
index: use `index.get_rev` in `rebase._computeobsoletenotrebased` Differential Revision: https://phab.mercurial-scm.org/D7350
Sat, 09 Nov 2019 13:23:53 +0100 index: use `index.get_rev` in `rebase.successorrevs`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:53 +0100] rev 43566
index: use `index.get_rev` in `rebase.successorrevs` The code is slightly updated in the process for simplicity. Differential Revision: https://phab.mercurial-scm.org/D7349
Sat, 09 Nov 2019 13:23:52 +0100 index: use `index.get_rev` in `unionrepo.unionrevlog`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:52 +0100] rev 43565
index: use `index.get_rev` in `unionrepo.unionrevlog` Differential Revision: https://phab.mercurial-scm.org/D7338
Sat, 09 Nov 2019 13:23:53 +0100 index: use `index.rev` in `bundlerepo.bundlerevlog`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:53 +0100] rev 43564
index: use `index.rev` in `bundlerepo.bundlerevlog` Differential Revision: https://phab.mercurial-scm.org/D7340
Sat, 09 Nov 2019 13:23:53 +0100 index: use `index.get_rev` in `exchange._pullapplyphases`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:53 +0100] rev 43563
index: use `index.get_rev` in `exchange._pullapplyphases` Differential Revision: https://phab.mercurial-scm.org/D7347
Sat, 09 Nov 2019 13:23:53 +0100 index: use `index.rev` in `exchange.fallbackheads`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:53 +0100] rev 43562
index: use `index.rev` in `exchange.fallbackheads` Differential Revision: https://phab.mercurial-scm.org/D7345
Sat, 09 Nov 2019 13:23:53 +0100 index: use `index.get_rev` in `revset._mapbynodefunc`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:53 +0100] rev 43561
index: use `index.get_rev` in `revset._mapbynodefunc` We slightly update the code in the process. Differential Revision: https://phab.mercurial-scm.org/D7343
Sat, 09 Nov 2019 13:23:53 +0100 index: use `index.get_rev` in `discovery._postprocessobsolete`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:53 +0100] rev 43560
index: use `index.get_rev` in `discovery._postprocessobsolete` Differential Revision: https://phab.mercurial-scm.org/D7341
Sat, 09 Nov 2019 13:23:52 +0100 index: use `index.get_rev` in `repoview.pinnedrevs`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:52 +0100] rev 43559
index: use `index.get_rev` in `repoview.pinnedrevs` We simplify the code in the process Differential Revision: https://phab.mercurial-scm.org/D7337
Sat, 09 Nov 2019 13:23:52 +0100 index: use `index.get_rev` in `obsolete._computephasedivergentset`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:52 +0100] rev 43558
index: use `index.get_rev` in `obsolete._computephasedivergentset` Differential Revision: https://phab.mercurial-scm.org/D7336
Sat, 09 Nov 2019 13:23:52 +0100 index: use `index.get_rev` in `obsutil.getobsoleted`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:52 +0100] rev 43557
index: use `index.get_rev` in `obsutil.getobsoleted` Differential Revision: https://phab.mercurial-scm.org/D7335
Sat, 09 Nov 2019 13:23:52 +0100 index: use `index.get_rev` in `phases.newheads`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:52 +0100] rev 43556
index: use `index.get_rev` in `phases.newheads` Differential Revision: https://phab.mercurial-scm.org/D7332
Sat, 09 Nov 2019 13:23:51 +0100 index: use `index.get_rev` in `localrepo.known`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:51 +0100] rev 43555
index: use `index.get_rev` in `localrepo.known` Differential Revision: https://phab.mercurial-scm.org/D7327
Sat, 09 Nov 2019 13:23:51 +0100 index: add a `get_rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:51 +0100] rev 43554
index: add a `get_rev` method (API) The new `index.getrev(node)` is to be preferred over using: `index.nodemap.get(node)`. This get us closer to be able to remove the `nodemap` attribute of the index. Differential Revision: https://phab.mercurial-scm.org/D7326
Sat, 09 Nov 2019 13:23:51 +0100 index: use `index.rev` in `revlog.rev`
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:51 +0100] rev 43553
index: use `index.rev` in `revlog.rev` Differential Revision: https://phab.mercurial-scm.org/D7325
Sat, 09 Nov 2019 13:23:51 +0100 index: add a `rev` method (API)
Pierre-Yves David <pierre-yves.david@octobus.net> [Sat, 09 Nov 2019 13:23:51 +0100] rev 43552
index: add a `rev` method (API) The new `index.rev(node)` is to be preferred over using `node index.nodemap[node]`. This get us closer to be able to remove the `nodemap` attribute of the index. Differential Revision: https://phab.mercurial-scm.org/D7324
Fri, 08 Nov 2019 13:26:55 +0100 perf: make `perfphasesremote` use the new `index.has_node` api
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2019 13:26:55 +0100] rev 43551
perf: make `perfphasesremote` use the new `index.has_node` api (If available) Differential Revision: https://phab.mercurial-scm.org/D7359
Fri, 08 Nov 2019 17:08:24 +0100 index: use `index.has_node` in `infinitypush`
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2019 17:08:24 +0100] rev 43550
index: use `index.has_node` in `infinitypush` Differential Revision: https://phab.mercurial-scm.org/D7356
Fri, 08 Nov 2019 13:26:33 +0100 index: use `index.has_node` in `phabricator.getoldnodedrevmap`
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2019 13:26:33 +0100] rev 43549
index: use `index.has_node` in `phabricator.getoldnodedrevmap` Differential Revision: https://phab.mercurial-scm.org/D7355
Fri, 08 Nov 2019 15:09:09 +0100 index: use `index.has_node` in `histedit.cleanupnode`
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2019 15:09:09 +0100] rev 43548
index: use `index.has_node` in `histedit.cleanupnode` Differential Revision: https://phab.mercurial-scm.org/D7352
Fri, 08 Nov 2019 15:08:27 +0100 index: use `index.has_node` in `histedit._finishhistedit
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2019 15:08:27 +0100] rev 43547
index: use `index.has_node` in `histedit._finishhistedit Differential Revision: https://phab.mercurial-scm.org/D7351
Fri, 08 Nov 2019 13:25:25 +0100 index: use `index.has_node` in `exchangev2._pullchangesetdiscovery`
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2019 13:25:25 +0100] rev 43546
index: use `index.has_node` in `exchangev2._pullchangesetdiscovery` Differential Revision: https://phab.mercurial-scm.org/D7348
Fri, 08 Nov 2019 16:00:47 +0100 index: use `index.has_node` in `exchange._pulldiscoverychangegroup`
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2019 16:00:47 +0100] rev 43545
index: use `index.has_node` in `exchange._pulldiscoverychangegroup` Differential Revision: https://phab.mercurial-scm.org/D7346
Fri, 08 Nov 2019 13:36:02 +0100 index: use `index.has_node` in `bookmarks.bmstore`
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2019 13:36:02 +0100] rev 43544
index: use `index.has_node` in `bookmarks.bmstore` Differential Revision: https://phab.mercurial-scm.org/D7344
Fri, 08 Nov 2019 11:44:23 +0100 index: use `index.has_node` in `tags.findglobaltags`
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2019 11:44:23 +0100] rev 43543
index: use `index.has_node` in `tags.findglobaltags` Differential Revision: https://phab.mercurial-scm.org/D7342
Fri, 08 Nov 2019 13:24:54 +0100 index: use `index.has_node` in `bundlerepo.bundlerevlog`
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2019 13:24:54 +0100] rev 43542
index: use `index.has_node` in `bundlerepo.bundlerevlog` Differential Revision: https://phab.mercurial-scm.org/D7339
Fri, 08 Nov 2019 14:20:48 +0100 index: use `index.has_node` in `obsutil.foreground`
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2019 14:20:48 +0100] rev 43541
index: use `index.has_node` in `obsutil.foreground` Differential Revision: https://phab.mercurial-scm.org/D7334
Fri, 08 Nov 2019 14:19:53 +0100 index: use `index.has_node` in `obsutil.exclusivemarkers`
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2019 14:19:53 +0100] rev 43540
index: use `index.has_node` in `obsutil.exclusivemarkers` Differential Revision: https://phab.mercurial-scm.org/D7333
Fri, 08 Nov 2019 14:17:03 +0100 index: use `index.has_node` in `phases.filterunknown`
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2019 14:17:03 +0100] rev 43539
index: use `index.has_node` in `phases.filterunknown` Differential Revision: https://phab.mercurial-scm.org/D7331
Fri, 08 Nov 2019 14:16:24 +0100 index: use `index.has_node` in `analyzeremotephases`
Pierre-Yves David <pierre-yves.david@octobus.net> [Fri, 08 Nov 2019 14:16:24 +0100] rev 43538
index: use `index.has_node` in `analyzeremotephases` Differential Revision: https://phab.mercurial-scm.org/D7330
(0) -30000 -10000 -3000 -1000 -300 -100 -60 +60 +100 +300 +1000 +3000 tip