Tue, 11 Feb 2014 16:52:36 -0800 import: move tryone closure in cmdutil
Pierre-Yves David <pierre-yves.david@logilab.fr> [Tue, 11 Feb 2014 16:52:36 -0800] rev 20500
import: move tryone closure in cmdutil We extract the `tryone` function into the `cmdutil` module. A lot of the command context have to be passed to the utility function, but having and explicit declaration will allow extension to wrap it. This will allows use to make changeset evolution related experiment in dedicated extension. Improving the API of this function is noble goal but outside of the scope of this patches.
Thu, 13 Feb 2014 14:04:47 -0800 revset: optimize missing ancestor expressions
Siddharth Agarwal <sid0@fb.com> [Thu, 13 Feb 2014 14:04:47 -0800] rev 20499
revset: optimize missing ancestor expressions A missing ancestor expression is any expression of the form (::x - ::y) or equivalent. Such expressions are remarkably common, and so far have involved multiple walks down the DAG, followed by a set difference operation. With this patch, such expressions will be transformed into uses of the fast algorithm at ancestor.missingancestor. For a repository with over 600,000 revisions, perfrevset for '::tip - ::-10000' returns: Before: ! wall 3.999575 comb 4.000000 user 3.910000 sys 0.090000 (best of 3) After: ! wall 0.132423 comb 0.130000 user 0.130000 sys 0.000000 (best of 75)
Thu, 13 Feb 2014 13:54:45 -0800 revset: add an undocumented _missingancestors function
Siddharth Agarwal <sid0@fb.com> [Thu, 13 Feb 2014 13:54:45 -0800] rev 20498
revset: add an undocumented _missingancestors function This will be used in an upcoming patch to optimize expressions of the form (::x - ::y).
Thu, 13 Feb 2014 13:52:45 -0800 commands.debugrevspec: add an option to print the optimized expression tree
Siddharth Agarwal <sid0@fb.com> [Thu, 13 Feb 2014 13:52:45 -0800] rev 20497
commands.debugrevspec: add an option to print the optimized expression tree This will be used in an upcoming patch to test that the optimizer works.
Wed, 12 Feb 2014 16:09:18 +0100 tests: killdaemons.py for windows distinguishes access violation and terminated
Simon Heimberg <simohe@besonet.ch> [Wed, 12 Feb 2014 16:09:18 +0100] rev 20496
tests: killdaemons.py for windows distinguishes access violation and terminated To distinguish between access violaition (process belonging to another user) and a terminated process, PROCESS_QUERY_INFORMATION must be enabled. But TerminateProcess still raises error 5 in both cases. Therefore check before if the process has already terminated.
Wed, 12 Feb 2014 15:38:59 +0100 tests: killdaemons.py for checks reason when getting no process handle
Simon Heimberg <simohe@besonet.ch> [Wed, 12 Feb 2014 15:38:59 +0100] rev 20495
tests: killdaemons.py for checks reason when getting no process handle
Fri, 17 Jan 2014 21:13:20 +0100 tests: killdaemons.py for windows waits for killed process to terminate
Simon Heimberg <simohe@besonet.ch> [Fri, 17 Jan 2014 21:13:20 +0100] rev 20494
tests: killdaemons.py for windows waits for killed process to terminate After kill, wait for the process to terminate. When it does not in time, write a debug message similar as in other os. But no 2nd forceful attempt is done.
Fri, 17 Jan 2014 21:13:08 +0100 tests: kill for windows in killdaemons.py checks return values
Simon Heimberg <simohe@besonet.ch> [Fri, 17 Jan 2014 21:13:08 +0100] rev 20493
tests: kill for windows in killdaemons.py checks return values The return values of the windll calls are checked and when an error is indicated, it is raised. The handle is still closed properly.
Thu, 13 Feb 2014 15:33:24 -0600 merge with crew
Matt Mackall <mpm@selenic.com> [Thu, 13 Feb 2014 15:33:24 -0600] rev 20492
merge with crew
Thu, 13 Feb 2014 13:08:50 +0100 merge with stable
Thomas Arendsen Hein <thomas@intevation.de> [Thu, 13 Feb 2014 13:08:50 +0100] rev 20491
merge with stable
Thu, 13 Feb 2014 13:05:09 +0100 help: new SHA-1 fingerprint of hg.intevation.org in hostfingerprints example stable
Thomas Arendsen Hein <thomas@intevation.de> [Thu, 13 Feb 2014 13:05:09 +0100] rev 20490
help: new SHA-1 fingerprint of hg.intevation.org in hostfingerprints example The certificate was updated in February 2014. You can verify the certificate by using the Root CA certificate downloadable from https://ssl.intevation.de/ The intermediate CA is sent by https://hg.intevation.org/
Fri, 31 Jan 2014 01:39:59 -0800 pull: move changeset pulling in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr> [Fri, 31 Jan 2014 01:39:59 -0800] rev 20489
pull: move changeset pulling in its own function pull: move changeset pulling in its own function Now that every necessary information is held in the `pulloperation` object, we can finally extract the changeset pulling to it's own function. This changeset is pure code movement only.
Tue, 11 Feb 2014 14:51:38 -0800 pull: move `fetch` subset into the object
Pierre-Yves David <pierre-yves.david@logilab.fr> [Tue, 11 Feb 2014 14:51:38 -0800] rev 20488
pull: move `fetch` subset into the object Tree discovey use a `fetch` variable to know what is being pulled. We move this information in the `pulloperation` object. This make it possible to extract the changeset pulling logic into its own function.
Fri, 31 Jan 2014 01:34:00 -0800 pull: make pulled subset a propertycache of the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr> [Fri, 31 Jan 2014 01:34:00 -0800] rev 20487
pull: make pulled subset a propertycache of the pull object The computation of the subset is simple operation using two useful pull information (1) the set of common changeset before the pull (2) the set of pulled changeset. We move this data into the `pulloperation` object since some phase will need them. And we turn the pulled subset computation behind a property case as multiple pull phase will need it.
Fri, 31 Jan 2014 01:25:56 -0800 pull: move phases synchronisation in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr> [Fri, 31 Jan 2014 01:25:56 -0800] rev 20486
pull: move phases synchronisation in its own function Now that every necessary information is held in the `pulloperation` object, we can finally extract the phase synchronisation phase to it's own function. This changeset is pure code movement only.
Fri, 31 Jan 2014 01:21:42 -0800 pull: move pulled subset into the object
Pierre-Yves David <pierre-yves.david@logilab.fr> [Fri, 31 Jan 2014 01:21:42 -0800] rev 20485
pull: move pulled subset into the object We compute the set of local changeset that were target of the pull. This is then used by phases logic to decide which part of the history should have it phase updated. We move this information into the object to allow extraction of phase synchronisation in its own function. I expect obsolete marker exchange to use it too in the future.
Thu, 06 Feb 2014 15:56:25 -0800 revset: added operations to spanset to duck type baseset
Lucas Moscovicz <lmoscovicz@fb.com> [Thu, 06 Feb 2014 15:56:25 -0800] rev 20484
revset: added operations to spanset to duck type baseset Added more operations which are not lazy but only used so far to duck type baseset.
Wed, 12 Feb 2014 10:22:43 -0800 revset: added basic operations to spanset
Lucas Moscovicz <lmoscovicz@fb.com> [Wed, 12 Feb 2014 10:22:43 -0800] rev 20483
revset: added basic operations to spanset Added methods __add__, __sub__ and __and__ to duck type more methods in baseset
Wed, 12 Feb 2014 10:16:21 -0800 revset: added spanset class to represent revision ranges
Lucas Moscovicz <lmoscovicz@fb.com> [Wed, 12 Feb 2014 10:16:21 -0800] rev 20482
revset: added spanset class to represent revision ranges
Thu, 06 Feb 2014 08:36:11 -0800 revset: added lazyset implementation to extra revset
Lucas Moscovicz <lmoscovicz@fb.com> [Thu, 06 Feb 2014 08:36:11 -0800] rev 20481
revset: added lazyset implementation to extra revset
Thu, 06 Feb 2014 08:32:40 -0800 revset: added lazyset implementation to converted revset
Lucas Moscovicz <lmoscovicz@fb.com> [Thu, 06 Feb 2014 08:32:40 -0800] rev 20480
revset: added lazyset implementation to converted revset
Thu, 06 Feb 2014 08:31:55 -0800 revset: added lazyset implementation to closed revset
Lucas Moscovicz <lmoscovicz@fb.com> [Thu, 06 Feb 2014 08:31:55 -0800] rev 20479
revset: added lazyset implementation to closed revset
Fri, 31 Jan 2014 01:12:35 -0800 push: feed pulloperation object to _pullobsolete function
Pierre-Yves David <pierre-yves.david@logilab.fr> [Fri, 31 Jan 2014 01:12:35 -0800] rev 20478
push: feed pulloperation object to _pullobsolete function We now have all necessary information in the `pulloperation` object itself.
Fri, 31 Jan 2014 01:04:05 -0800 pull: move transaction logic into the pull object
Pierre-Yves David <pierre-yves.david@logilab.fr> [Fri, 31 Jan 2014 01:04:05 -0800] rev 20477
pull: move transaction logic into the pull object Most local change that occurs during a pull are doing within a `transaction`. Currently this mean (1) adding new changeset (2) adding obsolescence markers. We want the two operations to be done in the same transaction. However we do not want to create a transaction if nothing is added to the repo. Creating an empty transaction would drop the previous transaction data and confuse tool and people who are still using rollback. So the current pull code has some logic to create and handle this transaction on demand. We are moving this logic in to the `pulloperation` object itself to simplify this lazy creation logic through all different par of the push. Note that, in the future, other part of pull (phases, bookmark) will probably want to be part of the transaction too.
Thu, 30 Jan 2014 17:38:41 -0800 pull: move obsolescence marker exchange in the exchange module
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 30 Jan 2014 17:38:41 -0800] rev 20476
pull: move obsolescence marker exchange in the exchange module The obsolescence marker exchange code was already extracted during a previous cycle. We are moving the extracted functio in this module. This function will read and write data in the `pulloperation` object and I prefer to have all core function collaborating through this object in the same place. This changeset is pure code movement only. Code change for direct consumption of the `pulloperation` object will come later.
Sat, 01 Feb 2014 03:49:29 -0800 pull: move `force` argument into pull object
Pierre-Yves David <pierre-yves.david@logilab.fr> [Sat, 01 Feb 2014 03:49:29 -0800] rev 20475
pull: move `force` argument into pull object One more step toward a more modular pulh function.
Thu, 30 Jan 2014 17:35:55 -0800 pull: move `heads` argument into pull object
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 30 Jan 2014 17:35:55 -0800] rev 20474
pull: move `heads` argument into pull object One more step toward a more modular pull function.
Thu, 30 Jan 2014 17:32:04 -0800 pull: move `remote` argument into pull object
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 30 Jan 2014 17:32:04 -0800] rev 20473
pull: move `remote` argument into pull object One more step toward a more modular pull function.
Thu, 30 Jan 2014 17:24:49 -0800 pull: introduce a pulloperation object
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 30 Jan 2014 17:24:49 -0800] rev 20472
pull: introduce a pulloperation object This object will hold all data and state gathered through the pull. This will allow us to split the long function into multiple small one. Smaller function will be easier to maintains and wrap. The idea is to blindly store all information related to the pull in this object so that each step and extension can use them if necessary. We start by putting the `repo` variable in the object. More migration in other function.
Mon, 27 Jan 2014 21:39:25 +0100 tests: lines with largefile .* file://$TESTTMP also match on windows
Simon Heimberg <simohe@besonet.ch> [Mon, 27 Jan 2014 21:39:25 +0100] rev 20471
tests: lines with largefile .* file://$TESTTMP also match on windows on windows, largefile paths are written as "file:///C:/temp/...", corresponding to "file:///$TESTTMP/..." (all three slashes shown). But on posix systems they are written as "file:///tmp/..." corresponding to "file://$TESTTMP/..." (only two slashes shown). Write the glob "file:/*/" to match both versions.
Tue, 11 Feb 2014 16:30:23 -0800 debugobsolete: extract marker display in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org> [Tue, 11 Feb 2014 16:30:23 -0800] rev 20470
debugobsolete: extract marker display in a dedicated function We want to be able to reuse and extend it from other function or extension while working on markers exchange. This changeset is pure core movement.
Thu, 30 Jan 2014 16:12:49 -0800 exchange: extract pull function from localrepo
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 30 Jan 2014 16:12:49 -0800] rev 20469
exchange: extract pull function from localrepo The localrepo class if far too big. Push and pull logic are extracted and reworked to better fit with the fact we exchange more than bundle now. This changeset extract the pulh code. later changeset will slowly slice it into smaller brick. The localrepo.pull method is kept for now to limit impact on user code. But it will be ultimately removed, now that the public API is hold by peer.
Thu, 30 Jan 2014 23:12:03 -0800 push: extract new common set computation from phase synchronisation
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 30 Jan 2014 23:12:03 -0800] rev 20468
push: extract new common set computation from phase synchronisation Now that every necessary information is held in the `pushoperation` object, we can extract the new common set computation to it's own function. This changeset is pure code movement only.
Thu, 30 Jan 2014 23:16:43 -0800 push: move `commonheads` into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 30 Jan 2014 23:16:43 -0800] rev 20467
push: move `commonheads` into the push object The phase synchronisation start by computing the new set of common head between local and remote and then do the phase synchronisation on this set. This new common set logic will eventually be used by the obsolescence markers exchange. So we are going to split the long phase synchronisation in two.
Thu, 30 Jan 2014 21:05:29 -0800 push: move discovery in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 30 Jan 2014 21:05:29 -0800] rev 20466
push: move discovery in its own function Now that every necessary information is held in the `pushoperation` object, we can extract the discovery logic to it's own function. This changeset is pure code movement only.
Thu, 30 Jan 2014 21:01:21 -0800 push: move outgoing check logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 30 Jan 2014 21:01:21 -0800] rev 20465
push: move outgoing check logic in its own function Now that every necessary information is held in the `pushoperation` object, we can extract the part responsible of aborting the push to it's own function. This changeset is mostly pure code movement. the exception is the fact this function returns a value to decide if changeset bundle should be pushed.
Thu, 30 Jan 2014 21:01:13 -0800 push: move `incoming` into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 30 Jan 2014 21:01:13 -0800] rev 20464
push: move `incoming` into the push object The fact that there is some unknown changes on remote one of the result of discovery. It is then used by some push validation logic. We move it in the object to be able to extract the said logic.
Thu, 30 Jan 2014 20:44:55 -0800 push: move changeset push logic in its own function
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 30 Jan 2014 20:44:55 -0800] rev 20463
push: move changeset push logic in its own function Now that every necessary information is held in the `pushoperation` object, we can extract the logic pushing changeset to it's own function. This changeset is pure code movement only.
Thu, 30 Jan 2014 20:34:35 -0800 push: move `remoteheads` into the push object
Pierre-Yves David <pierre-yves.david@logilab.fr> [Thu, 30 Jan 2014 20:34:35 -0800] rev 20462
push: move `remoteheads` into the push object The heads of the remote repository are used to detect race when pushing changeset. We now store this information in `pushoperation` object to allow extraction of the changeset pushing part.
Tue, 04 Feb 2014 15:07:03 -0800 revset: added lazyset implementation to contains revset
Lucas Moscovicz <lmoscovicz@fb.com> [Tue, 04 Feb 2014 15:07:03 -0800] rev 20461
revset: added lazyset implementation to contains revset
Tue, 04 Feb 2014 09:29:19 -0800 revset: added lazyset implementation to secret revset
Lucas Moscovicz <lmoscovicz@fb.com> [Tue, 04 Feb 2014 09:29:19 -0800] rev 20460
revset: added lazyset implementation to secret revset
Tue, 04 Feb 2014 09:14:45 -0800 revset: added lazyset implementation to matching revset
Lucas Moscovicz <lmoscovicz@fb.com> [Tue, 04 Feb 2014 09:14:45 -0800] rev 20459
revset: added lazyset implementation to matching revset Performance Benchmarking: $ time hg log -qr "first(matching(0))" 0:9117c6561b0b real 0m2.213s user 0m2.149s sys 0m0.055s $ time ./hg log -qr "first(matching(0))" 0:9117c6561b0b real 0m0.177s user 0m0.137s sys 0m0.038s
Tue, 04 Feb 2014 08:51:07 -0800 revset: added lazyset implementation to _matchfiles
Lucas Moscovicz <lmoscovicz@fb.com> [Tue, 04 Feb 2014 08:51:07 -0800] rev 20458
revset: added lazyset implementation to _matchfiles Performance Benchmarking: $ time hg log -qr "first(file(README))" 0:9117c6561b0b real 0m2.234s user 0m2.180s sys 0m0.044s $ time ./hg log -qr "first(file(README))" 0:9117c6561b0b real 0m0.172s user 0m0.129s sys 0m0.042s
Fri, 31 Jan 2014 10:47:51 -0800 revset: added lazyset implementation to checkstatus
Lucas Moscovicz <lmoscovicz@fb.com> [Fri, 31 Jan 2014 10:47:51 -0800] rev 20457
revset: added lazyset implementation to checkstatus This improves the performance of the revsets 'adds' 'modifies' and 'removes' Performance benchmarking: $ time hg log -qr "first(adds(README))" 0:9117c6561b0b real 0m2.279s user 0m2.222s sys 0m0.053s $ time ./hg log -qr "first(adds(README))" 0:9117c6561b0b real 0m0.172s user 0m0.131s sys 0m0.041s $ time hg log -qr "first(modifies(README))" 1:273ce12ad8f1 real 0m2.292s user 0m2.227s sys 0m0.061s $ time ./hg log -qr "first(modifies(README))" 1:273ce12ad8f1 real 0m0.178s user 0m0.130s sys 0m0.038s $ time hg log -qr "first(removes(README))" 2379:e90cff87f871 real 0m2.297s user 0m2.235s sys 0m0.058s $ time ./hg log -qr "first(removes(README))" 2379:e90cff87f871 real 0m0.975s user 0m0.797s sys 0m0.056s
Thu, 30 Jan 2014 17:46:08 -0800 revset: added lazyset implementation to public revset
Lucas Moscovicz <lmoscovicz@fb.com> [Thu, 30 Jan 2014 17:46:08 -0800] rev 20456
revset: added lazyset implementation to public revset Performance Benchmarking: $ time hg log -qr "first(public())" ... real 0m1.184s user 0m1.051s sys 0m0.130s $ time ./hg log -qr "first(public())" ... real 0m0.548s user 0m0.427s sys 0m0.118s
Wed, 12 Feb 2014 01:00:51 +0100 color: add debugcolor command (issue4094)
Olle Lundberg <geek@nerd.sh> [Wed, 12 Feb 2014 01:00:51 +0100] rev 20455
color: add debugcolor command (issue4094) This patch adds a debugcolor command that prints all colors that the extension knows about.
Thu, 30 Jan 2014 16:47:29 -0800 revset: added lazyset implementation to merge revset
Lucas Moscovicz <lmoscovicz@fb.com> [Thu, 30 Jan 2014 16:47:29 -0800] rev 20454
revset: added lazyset implementation to merge revset Performance benchmarking: $ time hg log -qr "first(merge())" 102:58039eddbdda real 0m0.276s user 0m0.208s sys 0m0.047s $ time ./hg log -qr "first(merge())" 102:58039eddbdda real 0m0.192s user 0m0.154s sys 0m0.027s
Thu, 30 Jan 2014 16:03:18 -0800 revset: added lazyset implementation to grep revset
Lucas Moscovicz <lmoscovicz@fb.com> [Thu, 30 Jan 2014 16:03:18 -0800] rev 20453
revset: added lazyset implementation to grep revset Performance benchmarking: $ time hg log -qr "first(grep(hg))" 0:9117c6561b0b real 0m2.214s user 0m2.163s sys 0m0.045s $ time ./hg log -qr "first(grep(hg))" 0:9117c6561b0b real 0m0.211s user 0m0.146s sys 0m0.035s
Thu, 30 Jan 2014 15:39:56 -0800 revset: added lazyset implementation to desc revset
Lucas Moscovicz <lmoscovicz@fb.com> [Thu, 30 Jan 2014 15:39:56 -0800] rev 20452
revset: added lazyset implementation to desc revset Performance benchmarking: $ time hg log -qr "first(desc(hg))" changeset: 0:9117c6561b0b real 0m2.210s user 0m2.158s sys 0m0.049s $ time ./hg log -qr "first(desc(hg))" changeset: 0:9117c6561b0b real 0m0.171s user 0m0.131s sys 0m0.035s
Mon, 03 Feb 2014 16:15:25 -0800 revset: added lazyset implementation to draft revset
Lucas Moscovicz <lmoscovicz@fb.com> [Mon, 03 Feb 2014 16:15:25 -0800] rev 20451
revset: added lazyset implementation to draft revset
Wed, 29 Jan 2014 15:23:16 -0800 revset: added lazyset implementation bookmark revset
Lucas Moscovicz <lmoscovicz@fb.com> [Wed, 29 Jan 2014 15:23:16 -0800] rev 20450
revset: added lazyset implementation bookmark revset
Mon, 03 Feb 2014 16:02:48 -0800 revset: added lazyset implementation to date revset
Lucas Moscovicz <lmoscovicz@fb.com> [Mon, 03 Feb 2014 16:02:48 -0800] rev 20449
revset: added lazyset implementation to date revset Performance Benchmarking: $ time hg log -qr "first(date(05/03/2005))" 0:9117c6561b0b real 0m3.157s user 0m2.994s sys 0m0.087s $ time ./hg log -qr "first(date(05/03/2005))" 0:9117c6561b0b real 0m0.509s user 0m0.289s sys 0m0.070s
Wed, 29 Jan 2014 09:22:31 -0800 revset: added lazyset implementation to author revset
Lucas Moscovicz <lmoscovicz@fb.com> [Wed, 29 Jan 2014 09:22:31 -0800] rev 20448
revset: added lazyset implementation to author revset Performance benchmarking: $ time hg log -qr "first(author(mpm))" 0:9117c6561b0b real 0m3.486s user 0m3.317s sys 0m0.077s $ time ./hg log -qr "first(author(mpm))" 0:9117c6561b0b real 0m0.551s user 0m0.295s sys 0m0.072s
Wed, 29 Jan 2014 09:04:03 -0800 revset: added lazyset implementation to keyword revset
Lucas Moscovicz <lmoscovicz@fb.com> [Wed, 29 Jan 2014 09:04:03 -0800] rev 20447
revset: added lazyset implementation to keyword revset Performance benchmarking: $ time hg log -qr "first(keyword(changeset))" 0:9117c6561b0b real 0m3.466s user 0m3.345s sys 0m0.072s $ time ./hg log -qr "first(keyword(changeset))" 0:9117c6561b0b real 0m0.365s user 0m0.199s sys 0m0.083s
Tue, 28 Jan 2014 16:19:30 -0800 revset: changed limit revset implementation to work with lazy revsets
Lucas Moscovicz <lmoscovicz@fb.com> [Tue, 28 Jan 2014 16:19:30 -0800] rev 20446
revset: changed limit revset implementation to work with lazy revsets Performance benchmarking: $ time hg log -qr "first(branch(default))" 0:9117c6561b0b real 0m3.130s user 0m3.025s sys 0m0.074s $ time ./hg log -qr "first(branch(default))" 0:9117c6561b0b real 0m0.300s user 0m0.198s sys 0m0.069s
Wed, 05 Feb 2014 16:12:03 -0800 revset: added lazyset implementation to branch revset
Lucas Moscovicz <lmoscovicz@fb.com> [Wed, 05 Feb 2014 16:12:03 -0800] rev 20445
revset: added lazyset implementation to branch revset Performance Benchmarking: $ time hg log -l1 -qr "branch(default)" 0:9117c6561b0b real 0m3.366s user 0m3.217s sys 0m0.095s $ time ./hg log -l1 -qr "branch(default)" 0:9117c6561b0b real 0m0.389s user 0m0.199s sys 0m0.061s
(0) -10000 -3000 -1000 -300 -100 -56 +56 +100 +300 +1000 +3000 +10000 +30000 tip