Fri, 20 Dec 2019 13:50:31 +0700 pullbundle: use % instead of .format() because % exists for bytes
Anton Shestakov <av6@dwimlabs.net> [Fri, 20 Dec 2019 13:50:31 +0700] rev 5046
pullbundle: use % instead of .format() because % exists for bytes
Thu, 19 Dec 2019 18:16:18 +0700 tests: test that debugpullbundlecacheoverlap command works
Anton Shestakov <av6@dwimlabs.net> [Thu, 19 Dec 2019 18:16:18 +0700] rev 5045
tests: test that debugpullbundlecacheoverlap command works
Thu, 19 Dec 2019 18:02:31 +0700 pullbundle: compatibility for progress in hg <= 4.6
Anton Shestakov <av6@dwimlabs.net> [Thu, 19 Dec 2019 18:02:31 +0700] rev 5044
pullbundle: compatibility for progress in hg <= 4.6
Thu, 19 Dec 2019 18:01:15 +0700 compat: add hg version to progress compatibility code
Anton Shestakov <av6@dwimlabs.net> [Thu, 19 Dec 2019 18:01:15 +0700] rev 5043
compat: add hg version to progress compatibility code
Mon, 09 Dec 2019 19:59:51 +0700 serverminitopic: ask pytype to disable import-error on a block handling hg 4.5
Anton Shestakov <av6@dwimlabs.net> [Mon, 09 Dec 2019 19:59:51 +0700] rev 5042
serverminitopic: ask pytype to disable import-error on a block handling hg 4.5
Mon, 09 Dec 2019 19:58:58 +0700 topic: ask pytype to disable import-error on a block handling hg 4.5
Anton Shestakov <av6@dwimlabs.net> [Mon, 09 Dec 2019 19:58:58 +0700] rev 5041
topic: ask pytype to disable import-error on a block handling hg 4.5
Mon, 09 Dec 2019 16:40:53 +0700 evolve: remove unused struct import
Anton Shestakov <av6@dwimlabs.net> [Mon, 09 Dec 2019 16:40:53 +0700] rev 5040
evolve: remove unused struct import
Mon, 09 Dec 2019 19:44:10 +0700 compat: ask pytype to ignore some warnings
Anton Shestakov <av6@dwimlabs.net> [Mon, 09 Dec 2019 19:44:10 +0700] rev 5039
compat: ask pytype to ignore some warnings It's expected to have a bunch of import and attribute errors in this module because it's for compatibility with different versions of hg and Python. Although it doesn't explain why a function wouldn't have __code__ attribute? So far I think it's a quirk of pytype.
Wed, 06 Nov 2019 18:15:00 +0530 evolve: extract logic of pre-checking divergence risk to its own function
Sushil khanchi <sushilkhanchi97@gmail.com> [Wed, 06 Nov 2019 18:15:00 +0530] rev 5038
evolve: extract logic of pre-checking divergence risk to its own function Extracting the logic (which is used to check if rewriting an obsolete revision will create divergence) to a function. This function will be used in upcoming patches of pre-checking. This is how we check if rewriting an obsolete revision will create divergence. We need to check two cases: If there is any 1) non-obsolete successor. -> easily done by `obsutil.successorssets()` 2) precursor with non-obsolete successor. -> using `evolvecmd.divergentsets()`
Tue, 24 Dec 2019 23:31:42 +0700 heptapod-ci: skip test-evolve.t in tests-py2-pure job mercurial-4.5
Anton Shestakov <av6@dwimlabs.net> [Tue, 24 Dec 2019 23:31:42 +0700] rev 5037
heptapod-ci: skip test-evolve.t in tests-py2-pure job It seems pure mode on Mercurial 4.5 was broken in case of this test. The error was: Traceback (most recent call last): File "/tmp/hgtests.YoK65c/install/bin/hg", line 41, in <module> dispatch.run() File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 88, in run status = (dispatch(req) or 0) & 255 File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 183, in dispatch ret = _runcatch(req) File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 324, in _runcatch return _callcatch(ui, _runcatchfunc) File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 332, in _callcatch return scmutil.callcatch(ui, func) File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/scmutil.py", line 154, in callcatch return func() File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 314, in _runcatchfunc return _dispatch(req) File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 918, in _dispatch cmdpats, cmdoptions) File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 673, in runcommand ret = _runcommand(ui, options, cmd, d) File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 926, in _runcommand return cmdfunc() File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/dispatch.py", line 915, in <lambda> d = lambda: util.checksignature(func)(ui, *args, **strcmdopt) File "/tmp/hgtests.YoK65c/install/lib/python/mercurial/util.py", line 1195, in check return func(*args, **kwargs) File "/builds/mercurial/evolve/hgext3rd/evolve/evolvecmd.py", line 1603, in evolve return _performevolve(ui, repo, **opts) File "/builds/mercurial/evolve/hgext3rd/evolve/evolvecmd.py", line 1726, in _performevolve targetcat, lastsolved) File "/builds/mercurial/evolve/hgext3rd/evolve/evolvecmd.py", line 1752, in _solveonerev lastsolved=lastsolved, stacktmplt=stacktmplt) File "/builds/mercurial/evolve/hgext3rd/evolve/evolvecmd.py", line 80, in _solveone lastsolved=lastsolved) File "/builds/mercurial/evolve/hgext3rd/evolve/evolvecmd.py", line 183, in _solveunstable keepbranch, b'orphan') File "/builds/mercurial/evolve/hgext3rd/evolve/evolvecmd.py", line 952, in relocate fullnode = unfi.changelog.index.partialmatch(sha1) AttributeError: 'InlinedIndexObject' object has no attribute 'partialmatch'
Tue, 10 Dec 2019 00:05:23 +0100 heptapod-ci: test python 4.5 with the pure version of Mercurial mercurial-4.5
Pierre-Yves David <pierre-yves.david@octobus.net> [Tue, 10 Dec 2019 00:05:23 +0100] rev 5036
heptapod-ci: test python 4.5 with the pure version of Mercurial the evolve extension is currently broken on 4.5-pure. So we get it in its own commit.
Thu, 26 Dec 2019 21:23:30 +0100 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 26 Dec 2019 21:23:30 +0100] rev 5035
branching: merge with stable
Thu, 26 Dec 2019 12:22:49 +0700 pullbundle: kwarg to changegroup.makestream() is called matcher stable
Anton Shestakov <av6@dwimlabs.net> [Thu, 26 Dec 2019 12:22:49 +0700] rev 5034
pullbundle: kwarg to changegroup.makestream() is called matcher Caught by pytype.
Sun, 01 Dec 2019 12:41:20 +0530 evolve: extract pre merging content-div csets logic to its own function
Sushil khanchi <sushilkhanchi97@gmail.com> [Sun, 01 Dec 2019 12:41:20 +0530] rev 5033
evolve: extract pre merging content-div csets logic to its own function
Thu, 26 Dec 2019 20:28:21 +0100 evolve: further simplify a conditional
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 26 Dec 2019 20:28:21 +0100] rev 5032
evolve: further simplify a conditional The case is simple enough to be handled on its own.
Thu, 26 Dec 2019 20:23:27 +0100 evolve: simplify some conditional
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 26 Dec 2019 20:23:27 +0100] rev 5031
evolve: simplify some conditional extracted from a changeset of Sushil khanchi <sushilkhanchi97@gmail.com>
Thu, 26 Dec 2019 20:17:01 +0100 evolve: rename some variable ahead of time
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 26 Dec 2019 20:17:01 +0100] rev 5030
evolve: rename some variable ahead of time A refactoring of the content divergence resolution in on its way. use a distinctive name for some variable early to make the change easier to read later.
Thu, 28 Nov 2019 19:01:28 +0530 evolve: add logic to cover --stop when "divergent" relocation in play
Sushil khanchi <sushilkhanchi97@gmail.com> [Thu, 28 Nov 2019 19:01:28 +0530] rev 5029
evolve: add logic to cover --stop when "divergent" relocation in play Changes in test file reflect the added behaviour. The intermediate changeset has been properly cleaned up by the `hg evolve --stop` call.
Thu, 28 Nov 2019 17:58:45 +0530 evolve: test to show that --stop is not working when "divergent" relocated
Sushil khanchi <sushilkhanchi97@gmail.com> [Thu, 28 Nov 2019 17:58:45 +0530] rev 5028
evolve: test to show that --stop is not working when "divergent" relocated Right now, --stop leave the intermediate changeset (relocating the divergent changeset to its new location behind). This this is an incomplete step it should be removed by `hg --stop`.
Wed, 27 Nov 2019 22:52:08 +0530 evolve: add test to show that --abort is working fine
Sushil khanchi <sushilkhanchi97@gmail.com> [Wed, 27 Nov 2019 22:52:08 +0530] rev 5027
evolve: add test to show that --abort is working fine When resolving content-divergence where relocation of "divergent" changeset is also required, this test file make sure that --abort option is working fine.
Fri, 20 Dec 2019 17:39:44 +0530 evolve: fix a bug in logic to choose destination when no active topic stable
Sushil khanchi <sushilkhanchi97@gmail.com> [Fri, 20 Dec 2019 17:39:44 +0530] rev 5026
evolve: fix a bug in logic to choose destination when no active topic
Fri, 20 Dec 2019 17:32:07 +0530 evolve: add test to demonstrate a bug when no active topic stable
Sushil khanchi <sushilkhanchi97@gmail.com> [Fri, 20 Dec 2019 17:32:07 +0530] rev 5025
evolve: add test to demonstrate a bug when no active topic Added test shows that the logic to find the destination for `hg up` in the case when "working directory parent has a topic but wdir has no active topic" is buggy. This will be fixed in next patch.
Fri, 20 Dec 2019 17:31:57 +0530 evolve: fix a bug in logic of choosing destination for hg update stable
Sushil khanchi <sushilkhanchi97@gmail.com> [Fri, 20 Dec 2019 17:31:57 +0530] rev 5024
evolve: fix a bug in logic of choosing destination for hg update
Fri, 20 Dec 2019 17:17:30 +0530 evolve: add test to demonstrate a bug when active topic is empty stable
Sushil khanchi <sushilkhanchi97@gmail.com> [Fri, 20 Dec 2019 17:17:30 +0530] rev 5023
evolve: add test to demonstrate a bug when active topic is empty Added test shows that when current active topic is empty and we try to run `hg up`, it fails with an error. It's because this case is not correctly handled when we find a destination to update (when topics are in play) Next patch will fix this.
Thu, 19 Dec 2019 21:36:59 -0800 evolvecmd: fix a typo node->None
Martin von Zweigbergk <martinvonz@google.com> [Thu, 19 Dec 2019 21:36:59 -0800] rev 5022
evolvecmd: fix a typo node->None
Thu, 19 Dec 2019 21:15:31 -0800 evolvecmd: avoid a ctx->node->ctx conversion
Martin von Zweigbergk <martinvonz@google.com> [Thu, 19 Dec 2019 21:15:31 -0800] rev 5021
evolvecmd: avoid a ctx->node->ctx conversion
Thu, 19 Dec 2019 13:06:29 -0800 evolvecmd: mark relocate() private
Martin von Zweigbergk <martinvonz@google.com> [Thu, 19 Dec 2019 13:06:29 -0800] rev 5020
evolvecmd: mark relocate() private
Thu, 19 Dec 2019 22:31:13 -0800 cleanup: replace .parents()[0] by .p1()
Martin von Zweigbergk <martinvonz@google.com> [Thu, 19 Dec 2019 22:31:13 -0800] rev 5019
cleanup: replace .parents()[0] by .p1()
Wed, 27 Nov 2019 20:54:48 +0530 evolve: add more tests for --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com> [Wed, 27 Nov 2019 20:54:48 +0530] rev 5018
evolve: add more tests for --continue case when relocating "divergent"
Wed, 27 Nov 2019 19:50:33 +0530 evolve: use meaningful variable names for a return value
Sushil khanchi <sushilkhanchi97@gmail.com> [Wed, 27 Nov 2019 19:50:33 +0530] rev 5017
evolve: use meaningful variable names for a return value
Wed, 27 Nov 2019 12:34:19 +0530 evolve: add logic to cover --continue case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com> [Wed, 27 Nov 2019 12:34:19 +0530] rev 5016
evolve: add logic to cover --continue case when relocating "divergent" Changes in test file demonstrate the added behaviour.
Mon, 25 Nov 2019 21:28:52 +0530 evolve: add test for `--continue` case when relocating "divergent"
Sushil khanchi <sushilkhanchi97@gmail.com> [Mon, 25 Nov 2019 21:28:52 +0530] rev 5015
evolve: add test for `--continue` case when relocating "divergent" This test shows that for now we don't handle the continue case when relocating "divergent" cset hit merge conflict while resolving content-divergence. Next patch will be adding the support for --continue case.
Mon, 25 Nov 2019 19:12:51 +0530 evolve: use more specific key name to store in evolvestate
Sushil khanchi <sushilkhanchi97@gmail.com> [Mon, 25 Nov 2019 19:12:51 +0530] rev 5014
evolve: use more specific key name to store in evolvestate Now, as we also relocate divergent cset if required, so let's use more specific key to track the relocation of "divergent" and "other".
Fri, 13 Dec 2019 01:29:27 +0530 evolve: move a test where it makes more sense
Sushil khanchi <sushilkhanchi97@gmail.com> [Fri, 13 Dec 2019 01:29:27 +0530] rev 5013
evolve: move a test where it makes more sense
Thu, 12 Dec 2019 17:22:18 +0530 evolve: remove the unnecessary condition to check empty successors set
Sushil khanchi <sushilkhanchi97@gmail.com> [Thu, 12 Dec 2019 17:22:18 +0530] rev 5012
evolve: remove the unnecessary condition to check empty successors set I annotated the history of this "newer == [()]" condition and found that it was added in the initial stages of evolution project (more than 8 years ago) and there is no test where we get [()] as a successor set. So looks like "if not newer" is enough to check if it is empty. I also looked into obsutil.successorssets() implementation and I don't think it would give us [()] in any case.
Tue, 19 Nov 2019 14:54:13 -0800 evolve: delete redundant and incorrect code for updating dirstate
Martin von Zweigbergk <martinvonz@google.com> [Tue, 19 Nov 2019 14:54:13 -0800] rev 5011
evolve: delete redundant and incorrect code for updating dirstate In relocate() when we notice conflicts, we will try to fix up the dirstate by calling copies.duplicatecopies() and dirstatedance(). However, we had called _evolvemerge() just before that point and that has already fixed up the dirstate, so there's no need to do it again. Also, we did it incorrectly as the test case shows.
Tue, 19 Nov 2019 14:24:31 -0800 tests: demonstrate how evolve loses transitive copies when interrupted
Martin von Zweigbergk <martinvonz@google.com> [Tue, 19 Nov 2019 14:24:31 -0800] rev 5010
tests: demonstrate how evolve loses transitive copies when interrupted Let's say `b` has been renamed to `c` in commit A and then renamed to `d` in commit B. We now modify A in a way that will cause a conflict when we evolve B. `hg evolve` will now stop and let the user resolve the conflicts, but it will have lost the copy information in the working copy (should still be c->d).
Mon, 09 Dec 2019 10:36:11 -0800 evolve: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com> [Mon, 09 Dec 2019 10:36:11 -0800] rev 5009
evolve: use ui.configoverride() instead of ui.backupconfig() ui.configoverride() was added in hg 4.1. util.nullcontextmanager() was added in hg 4.4.
Mon, 09 Dec 2019 10:31:34 -0800 topic: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com> [Mon, 09 Dec 2019 10:31:34 -0800] rev 5008
topic: use ui.configoverride() instead of ui.backupconfig() ui.configoverride() was added in hg 4.1. util.nullcontextmanager() was added in hg 4.4.
Mon, 09 Dec 2019 10:28:58 -0800 topic: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com> [Mon, 09 Dec 2019 10:28:58 -0800] rev 5007
topic: use ui.configoverride() instead of ui.backupconfig() ui.configoverride() was added in hg 4.1. util.nullcontextmanager() was added in hg 4.4.
Mon, 09 Dec 2019 10:33:48 -0800 evolve: use ui.configoverride() instead of ui.backupconfig()
Martin von Zweigbergk <martinvonz@google.com> [Mon, 09 Dec 2019 10:33:48 -0800] rev 5006
evolve: use ui.configoverride() instead of ui.backupconfig() ui.configoverride() was added in hg 4.1.
Mon, 09 Dec 2019 10:43:04 -0800 evolve: remove obsolete backup of allowemptycommit config
Martin von Zweigbergk <martinvonz@google.com> [Mon, 09 Dec 2019 10:43:04 -0800] rev 5005
evolve: remove obsolete backup of allowemptycommit config We stopped setting the config in 88601e1cd5d8 (evolve: create new commit while resolving content-divergence, 2018-04-23), so there's no need to back it up.
Mon, 09 Dec 2019 10:44:42 -0800 evolve: remove dead initilization of "newnode" variable
Martin von Zweigbergk <martinvonz@google.com> [Mon, 09 Dec 2019 10:44:42 -0800] rev 5004
evolve: remove dead initilization of "newnode" variable It's been dead since f9dad99a90d5 (evolve: create a new commit instead of amending one of the divergents, 2018-06-13).
Thu, 12 Dec 2019 17:16:02 +0530 evolve: fix a typo
Sushil khanchi <sushilkhanchi97@gmail.com> [Thu, 12 Dec 2019 17:16:02 +0530] rev 5003
evolve: fix a typo
Tue, 10 Dec 2019 21:03:51 +0100 changelog: mention the python 3 fix stable
Pierre-Yves David <pierre-yves.david@octobus.net> [Tue, 10 Dec 2019 21:03:51 +0100] rev 5002
changelog: mention the python 3 fix
Tue, 10 Dec 2019 21:03:23 +0100 changelog: mention the date fix for content divergence stable
Pierre-Yves David <pierre-yves.david@octobus.net> [Tue, 10 Dec 2019 21:03:23 +0100] rev 5001
changelog: mention the date fix for content divergence
Tue, 10 Dec 2019 20:47:13 +0100 branching: merge with stable
Pierre-Yves David <pierre-yves.david@octobus.net> [Tue, 10 Dec 2019 20:47:13 +0100] rev 5000
branching: merge with stable
Tue, 10 Dec 2019 20:35:56 +0100 py3: fix several TypeError formatting bytes with an exception object stable
Denis Laxalde <denis.laxalde@logilab.fr> [Tue, 10 Dec 2019 20:35:56 +0100] rev 4999
py3: fix several TypeError formatting bytes with an exception object
Fri, 11 Oct 2019 21:32:27 +0200 evolve: preserve date when resolving content-divergence (issue6202) stable
Manuel Jacob <me@manueljacob.de> [Fri, 11 Oct 2019 21:32:27 +0200] rev 4998
evolve: preserve date when resolving content-divergence (issue6202) This patch changes the implementation to do a 3 way merge. In case of actual conflict, it take the newest date from both sides of the content-divergence.
Tue, 10 Dec 2019 19:58:51 +0100 test: add test for content divergence involving a date update stable
Pierre-Yves David <pierre-yves.david@octobus.net> [Tue, 10 Dec 2019 19:58:51 +0100] rev 4997
test: add test for content divergence involving a date update In this case, each side update the date.
Tue, 10 Dec 2019 19:55:37 +0100 test: add test for content divergence involving a date update stable
Pierre-Yves David <pierre-yves.david@octobus.net> [Tue, 10 Dec 2019 19:55:37 +0100] rev 4996
test: add test for content divergence involving a date update In this case, one side update to an earlier date.
Tue, 10 Dec 2019 19:27:55 +0100 test: add test for content divergence involving a date update stable
Pierre-Yves David <pierre-yves.david@octobus.net> [Tue, 10 Dec 2019 19:27:55 +0100] rev 4995
test: add test for content divergence involving a date update In this case, one side update to an older date.
Tue, 10 Dec 2019 19:13:06 +0100 test: highlight data handling when solving divergence stable
Pierre-Yves David <pierre-yves.david@octobus.net> [Tue, 10 Dec 2019 19:13:06 +0100] rev 4994
test: highlight data handling when solving divergence The current handling of date is lacking, we add test to highlight this.
Sat, 07 Dec 2019 03:27:50 +0530 evolve: add tests for the case when resolution parent is ambiguous stable
Sushil khanchi <sushilkhanchi97@gmail.com> [Sat, 07 Dec 2019 03:27:50 +0530] rev 4993
evolve: add tests for the case when resolution parent is ambiguous
Fri, 06 Dec 2019 23:43:00 +0530 evolve: abort if deciding resolution parent is ambiguous stable
Sushil khanchi <sushilkhanchi97@gmail.com> [Fri, 06 Dec 2019 23:43:00 +0530] rev 4992
evolve: abort if deciding resolution parent is ambiguous While solving content-divergence, it could be hard to decide which cset should be treated as a resolution parent if there are multiple successors of divergent cset. i.e split case. But we are planning to make some update in handling this split case: 1) consider highest one if all splitted csets are in a single topological branch 2) still need to decide if 1) doesn't apply
Sat, 23 Nov 2019 16:17:04 +0530 evolve: make sure divergence resolution doesn't undo changes (issue6203) stable
Sushil khanchi <sushilkhanchi97@gmail.com> [Sat, 23 Nov 2019 16:17:04 +0530] rev 4991
evolve: make sure divergence resolution doesn't undo changes (issue6203) Before this patch, in content-divergence resolution logic if resolution parent is not the parent of any of the two divergent changesets then it could undo some changes introduced by previous revs (while resolving stack of content-divergent changesets) as demonstrated by the test added in previous patch. To solve this, what this patch doing is: if divergent cset has obsolete parent with a successor then first resolve the "orphan" instability of divergent cset by relocating, then perform the content-divergence resolution. After this change in logic, I found that it's kind of more correct as reflected by the changes in tests/test-evolve-content-divergent-corner-cases.t where it prevented creating conflicts while merging. Changes in tests/test-evolve-content-divergent-stack.t demonstrate the fixed behaviour. Next patches will be covering the `evolve --continue` case for the relocation of "divergent" cset.
Sat, 23 Nov 2019 20:25:16 +0530 evolve: add test to demonstrate issue6203 stable
Sushil khanchi <sushilkhanchi97@gmail.com> [Sat, 23 Nov 2019 20:25:16 +0530] rev 4990
evolve: add test to demonstrate issue6203 Current logic of content-divergence resolution contains a bug that if resolution parent is not the parent of any of the two divergent changesets, it could undo some changes. I think a good solution for this is to first relocate the divergent cset to it's obsolete parent's successor if applicable and then perform the content-divergence resolution. Next patch will fix the issue.
Mon, 09 Dec 2019 16:01:56 +0700 state: there's no _unpack in struct stable
Anton Shestakov <av6@dwimlabs.net> [Mon, 09 Dec 2019 16:01:56 +0700] rev 4989
state: there's no _unpack in struct Caught by pytype.
Sun, 29 Sep 2019 11:47:18 +0530 amend: abort if both --patch and --extract are used stable
Sushil khanchi <sushilkhanchi97@gmail.com> [Sun, 29 Sep 2019 11:47:18 +0530] rev 4988
amend: abort if both --patch and --extract are used
Mon, 09 Dec 2019 23:54:50 +0100 test-compat: merge mercurial-4.6 into mercurial-4.5 mercurial-4.5
Pierre-Yves David <pierre-yves.david@octobus.net> [Mon, 09 Dec 2019 23:54:50 +0100] rev 4987
test-compat: merge mercurial-4.6 into mercurial-4.5
(0) -3000 -1000 -300 -100 -60 +60 +100 +300 tip