Yuya Nishihara <yuya@tcha.org> [Thu, 24 Jan 2019 21:35:55 +0900] rev 41306
ui: inline _writenobuf() into write() due to performance issue
I'll remove redundant conditions later in this series.
Yuya Nishihara <yuya@tcha.org> [Thu, 24 Jan 2019 21:34:48 +0900] rev 41305
ui: inline _write() into write() due to performance issue
I'll remove redundant conditions later in this series.
Yuya Nishihara <yuya@tcha.org> [Wed, 28 Nov 2018 22:36:24 +0900] rev 41304
ui: optimize buffered write with no label
This was spotted while making fastannotate faster again after ditching its
own formatter. Since I'm going to inline _write() into ui.write(), I decided
to include this patch in this series.
Here, the cost of '(self.label(a, label) for a in args)' was significant
in hot loops.
Boris Feld <boris.feld@octobus.net> [Wed, 23 Jan 2019 18:07:42 -0500] rev 41303
partialdiscovery: avoid `undecided` related computation sooner than necessary
Changeset 1d30be90c move the update of the `undecided` set within the
`partialdiscovery` object in order to clarify the API.
The update to the `undecided` set was unconditional in 1d30be90c and the first
access to the `self.undecided` property triggered the initial computation of
the set of undecided revisions. As a result, the set was computed much
earlier, at a time where less information is available, immediately followed
by an update of this set to remove common revisions.
To fix this regression, we ignore the `undecided` related logic in
`addcommons` when that `undecided` set has not been computed yet. Code that
actually needs to know the `undecided` set will trigger its computation later.
The change has no effects on semantic because the initial computation
`undecided` set takes all knowns `common` into account.
Example performance running `hg debugdiscovery` from a pypy repo missing 10
changesets:
870a89c6909d: 52.3ms (regression parent)
1d30be90c9dc: 72.0ms (regression)
5a5f504a7175: 64.8ms (this fix parent)
this fix: 52.6ms
Yuya Nishihara <yuya@tcha.org> [Mon, 21 Jan 2019 22:14:29 +0900] rev 41302
revlog: fix resolution of revlog version 0
This partially backs out cecf3f8bccd3, "revlog: always process opener options."
My understanding is that if there's no "revlog1" nor "revlog2" in .hg/requires,
the repository should stick to the v0 format. The reasoning is briefly
described in 31a5973fcf96, "revlog: get rid of defversion."
Maybe we can drop support for missing opener options, but I didn't do that
in this patch.
Yuya Nishihara <yuya@tcha.org> [Sun, 20 Jan 2019 11:57:36 +0900] rev 41301
rust: add comment about lack of wdirrev handling
If hg is compiled with rust support, 'only(wdir())' crashed as
"rustext.GraphError: ('ParentOutOfRange', 2147483647)", which should instead
say "abort: working directory revision cannot be specified."
Yuya Nishihara <yuya@tcha.org> [Sun, 20 Jan 2019 11:51:21 +0900] rev 41300
templatekw: fix crash on multiple latesttags resolution at wdir (issue6055)
It appears not easy to fix only() to support wdir(), so this patch works
around the issue by getlatesttags(). The "+1" after len(changes) doesn't
matter since ctx never changes while sorting. It's just for clarity.
Yuya Nishihara <yuya@tcha.org> [Sun, 20 Jan 2019 11:39:16 +0900] rev 41299
test-template-keywords: add test for {latesttag} of wdir() revision
It's probably broken since fb672eac2702, "templatekw: choose {latesttag}
by len(changes), not date (issue5659)". only() doesn't support wdir.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 18 Jan 2019 23:32:26 -0800] rev 41298
narrow: fix crash when restoring backup in legacy repo
Using --addremove when committing in an old repo (before we started
keeping .hg/narrowspec.dirstate) results in a crash. The test
case modified in this patch would crash like this:
abort: $ENOENT$
The issue is that when the dirstateguard is aborted, it tries to
restore the backup of .hg/narrowspec.dirstate. However, since we were
in an old repo, that file did not get created when the dirstateguard
was created. Note that the dirstateguard is not used unless
--addremove is passed.
This patch fixes the bug by making restorewcbackup() not fail if the
backup doesn't exist. I also made clearwcbackup() safe, just in case.
Differential Revision: https://phab.mercurial-scm.org/D5634
Boris Feld <boris.feld@octobus.net> [Fri, 18 Jan 2019 14:21:47 +0100] rev 41297
revset: introduce an internal `_rev` predicate for '%d' usage
In 24a1f67bb75a, we aligned "%d" behavior on "%ld" one, invalid revisions got
silently ignored. However, soon after in 8aca89a694d4 and 26b0a7514f01, a side
effect changed the behavior of "%ld" to no longer silently filter invalid
revisions.
After discussion on the mailing list, it was decided to align on the new %ld
behavior:
https://www.mercurial-scm.org/pipermail/mercurial-devel/2019-January/127291.html
This changeset introduce a '_rev()' predicated that keep the benefit from
24a1f67bb75a while enforcing a more strict checking on the inputs.
Boris Feld <boris.feld@octobus.net> [Fri, 18 Jan 2019 16:03:37 +0100] rev 41296
mmap: backed out changeset 875d2af8cb4e
There have been concrete and theoretical issues raised, this will need more
work during the next cycle.
Boris Feld <boris.feld@octobus.net> [Fri, 18 Jan 2019 16:02:26 +0100] rev 41295
mmap: backed out changeset 74a9f428227e
There have been concrete and theoretical issues raised, this will need more
work during the next cycle.
Matt Harbison <matt_harbison@yahoo.com> [Fri, 18 Jan 2019 23:22:56 -0500] rev 41294
help: document the minimumhgversion variable for extensions
Matt Harbison <matt_harbison@yahoo.com> [Fri, 18 Jan 2019 23:13:04 -0500] rev 41293
help: modernize the example for command registration
Augie Fackler <raf@durin42.com> [Fri, 18 Jan 2019 13:32:02 -0500] rev 41292
Added signature for changeset 593718ff5844
Augie Fackler <raf@durin42.com> [Fri, 18 Jan 2019 13:32:00 -0500] rev 41291
Added tag 4.9rc0 for changeset 593718ff5844
Augie Fackler <augie@google.com> [Fri, 18 Jan 2019 13:28:22 -0500] rev 41290
merge default into stable for 4.9 release
Boris Feld <boris.feld@octobus.net> [Thu, 10 Jan 2019 14:57:01 +0100] rev 41289
update: fix edge-case with update.atomic-file and read-only files
We used to create the tempfile with the original file mode. That means
creating a read-only tempfile when the original file is read-only, which crash
if we need to write on the tempfile.
The file in the working directory ends up being writable with and without the
atomic update config, so the behavior is the same.
Martin von Zweigbergk <martinvonz@google.com> [Wed, 16 Jan 2019 16:49:15 -0800] rev 41288
scmutil: drop unreachable except clause
socket.error is a subclass of IOError, which we catch higher up. It
seems to have been this way since 020a896a5292 (dispatch: sort
exception handlers, 2009-01-12), so let's celebrate the 10 year
anniversary (a few days late) of it being wrong by deleting it.
Differential Revision: https://phab.mercurial-scm.org/D5626
Martin von Zweigbergk <martinvonz@google.com> [Wed, 16 Jan 2019 21:32:15 -0800] rev 41287
tests: suppress "Checked out 1 paths of <hash>" from modern git
test-convert-git.t is failiing since git commit 0f086e6dca (checkout:
print something when checking out paths, 2018-11-13). Suppress the new
output by disambiguating the arguments with a "--" separator.
Differential Revision: https://phab.mercurial-scm.org/D5625
Yuya Nishihara <yuya@tcha.org> [Sun, 13 Jan 2019 14:56:26 +0900] rev 41286
revlog: document that mmap resources are released implicitly by GC
It's okay-ish, but currently the open fd and the mapping itself are leaked
until the indexdata is deallocated. If revlog had close(), the underlying
resources should be closed there as well, but AFAIK there's no such hook
point.
Yuya Nishihara <yuya@tcha.org> [Wed, 26 Sep 2018 21:41:52 +0900] rev 41285
ui: proxy protect/restorestdio() calls to update internal flag
It should be better to manage the redirection flag solely by the ui class.
Yuya Nishihara <yuya@tcha.org> [Wed, 26 Sep 2018 21:29:13 +0900] rev 41284
ui: move protectedstdio() context manager from procutil
This is a follow-up series for 23a00bc90a3c, "chgserver: do not send system()
back to client if stdio redirected." The function is renamed using ui terms.
Yuya Nishihara <yuya@tcha.org> [Thu, 10 Jan 2019 21:29:24 +0900] rev 41283
cext: clang-format new code coming from stable branch
Valentin Gatien-Baron <vgatien-baron@janestreet.com> [Thu, 03 Jan 2019 19:02:46 -0500] rev 41282
match: support rooted globs in hgignore
In a .hgignore, "glob:foo" always means "**/foo". This cannot be
avoided because there is no syntax like "^" in regexes to say you
don't want the implied "**/" (of course one can use regexes, but glob
syntax is nice).
When you have a long list of fairly specific globs like
path/to/some/thing, this has two consequences:
1. unintended files may be ignored (not too common though)
2. matching performance can suffer significantly
Here is vanilla hg status timing on a private repository:
Using syntax:glob everywhere
real 0m2.199s
user 0m1.545s
sys 0m0.619s
When rooting the appropriate globs
real 0m1.434s
user 0m0.847s
sys 0m0.565s
(tangentially, none of this shows up in --profile's output. It
seems that C code doesn't play well with profiling)
The code already supports this but there is no syntax to make use of
it, so it seems reasonable to create such syntax. I create a new
hgignore syntax "rootglob".
Differential Revision: https://phab.mercurial-scm.org/D5493
Kyle Lippincott <spectral@google.com> [Wed, 07 Nov 2018 15:45:09 -0800] rev 41281
resolve: fix mark-check when a file was deleted on one side (issue6020)
wvfs.open raises an error if one of the files does not exist. Ignoring the error
if it's ENOENT is done in several other places in this code, so I'm in good
company :)
Differential Revision: https://phab.mercurial-scm.org/D5243
Boris Feld <boris.feld@octobus.net> [Fri, 04 Jan 2019 16:04:48 +0100] rev 41280
discovery: compute newly discovered missing in a more efficient way
Calling "descendants" is expensive, instead, we bound the walk inside the know set
of undecided revision.
This help with discovery performance:
# without the revset '%ld' improvement
$ hg perfdiscovery -R pypy-left pypy-right
before: wall 0.675631 comb 0.680000 user 0.670000 sys 0.010000 (median of 15)
after: wall 0.520145 comb 0.530000 user 0.510000 sys 0.020000 (median of 19)
There is another series in flight that greatly improves performances of "%ld"
substitution in `repo.revs` call. If this changeset is applied above it, we
see a similar performance boost.
# with the revset '%ld' improvement
$ hg perfdiscovery -R pypy-left pypy-right
before: wall 0.477848 comb 0.480000 user 0.480000 sys 0.000000 (median of 22)
after: wall 0.404163 comb 0.400000 user 0.400000 sys 0.000000 (median of 24)
Matt Harbison <matt_harbison@yahoo.com> [Thu, 17 Jan 2019 00:16:00 -0500] rev 41279
exthelper: drop the addattr() decorator
Yuya pointed out that this goes against the typical advice to not add attributes
to classes[1]. The evolve extension still uses this a handful of times, so
maybe it should be brought back in the future if a general use is found. But it
isn't nice to have a new helper API that can lead to easy problems.
[1] https://www.mercurial-scm.org/pipermail/mercurial-devel/2018-December/126330.html
Boris Feld <boris.feld@octobus.net> [Mon, 14 Jan 2019 18:19:22 +0100] rev 41278
revsetbenchmark: add more example for roots usages
We test the `roots` revset in setting similar to our test for `heads`.
Note that the algorithm used for roots can give result without consuming the
full input set. This provides a significant speedup when testing or accessing
a single value. We can't just replace it with simple, full algorithm like we
did for `heads`. See performance number below:
0) roots((tip~100::) - (tip~100::tip))
1) roots((0::) - (0::tip))
2) roots(tip~100:)
3) roots(:42)
4) roots(not public())
5) roots((0:tip)::)
6) roots(0::tip)
7) 42:68 and roots(42:tip)
8) roots(0:tip)
9) roots((:42) + (tip~42:))
10) roots(all())
11) roots(-10000:-1)
12) (-5000:-1000) and roots(-10000:-1)
13) roots(matching(tip, "author"))
14) roots(matching(tip, "author")) and -10000:-1
15) (-10000:-1) and roots(matching(tip, "author"))
plain min max first last reverse rev..rst rev..ast sort sor..rst sor..ast
00) 0.000789 0.000801 0.000801 0.000819 0.000784 0.000774 0.000793 0.000816 0.000815 0.000831 0.000799
01) 0.097610 0.002717 0.096706 0.002615 0.059189 0.089033 0.059862 0.002644 0.098058 0.002640 0.058992
02) 0.000709 0.000117 0.000382 0.000136 0.000384 0.000724 0.000412 0.000133 0.000733 0.000159 0.000416
03) 0.000075 0.000064 0.000093 0.000080 0.000097 0.000089 0.000123 0.000079 0.000105 0.000102 0.000126
04) 0.000055 0.000071 0.000070 0.000087 0.000075 0.000066 0.000100 0.000085 0.000082 0.000110 0.000102
05) 0.088043 0.001084 0.087816 0.001097 0.048049 0.072454 0.047673 0.001089 0.088491 0.001163 0.047824
06) 0.058761 0.001727 0.059324 0.001850 0.058562 0.059198 0.058998 0.001743 0.058556 0.001874 0.059420
07) 0.000131 0.000121 0.000145 0.000138 0.000150 0.000142 0.000178 0.000135 0.000160 0.000163 0.000179
08) 0.058003 0.000077 0.032327 0.000093 0.031966 0.056812 0.031753 0.000092 0.057113 0.000116 0.031933
09) 0.000503 0.000145 0.000469 0.000161 0.000476 0.000564 0.000502 0.000160 0.000537 0.000187 0.000500
10) 0.056654 0.000058 0.033104 0.000073 0.032157 0.056598 0.031877 0.000071 0.056433 0.000094 0.031819
11) 0.005842 0.000081 0.001907 0.000101 0.001883 0.005868 0.001915 0.000099 0.005836 0.000122 0.001896
12) 0.003237 0.000634 0.001784 0.000655 0.001803 0.003245 0.001837 0.000649 0.003231 0.000680 0.001858
Boris Feld <boris.feld@octobus.net> [Mon, 14 Jan 2019 17:15:21 +0100] rev 41277
dagop: minor python optimization to `headrevs`
Less lookup and less function call never hurt. This provides a small speedup
on various run of the 'heads()' revset. This also buys back some of the slow
down we observed in the previous changesets for single value lookup.
Performance number:
0) before dagop.headrevs usage
1) after dagop.headrevs usage
2) after this change
revset: heads(all())
plain min max first last reverse rev..rst rev..ast sort sor..rst sor..ast
0) 0.036503 0.032564 0.030024 0.032378 0.030887 0.036367 0.031713 0.032205 0.036467 0.032286 0.030300
1) 0.036668 0.035347 108% 0.035611 118% 0.035358 109% 0.035726 115% 0.036411 0.035261 111% 0.036096 112% 0.036052 0.035095 108% 0.035792 118%
2) 0.034254 93% 0.034482 0.035003 0.034353 0.033754 94% 0.034689 0.034361 0.035059 0.034636 0.034662 0.035465
revset: heads(-10000:-1)
plain min max first last reverse rev..rst rev..ast sort sor..rst sor..ast
0) 0.003936 0.003218 0.003227 0.003302 0.003328 0.003848 0.003305 0.003252 0.003839 0.003306 0.003279
1) 0.003870 0.003785 117% 0.003821 118% 0.003780 114% 0.003769 113% 0.003776 0.003792 114% 0.003805 117% 0.003810 0.003798 114% 0.003840 117%
2) 0.003666 94% 0.003577 94% 0.003632 0.003644 0.003614 0.003638 0.003652 0.003632 0.003661 0.003660 0.003658
revset: (-5000:-1000) and heads(-10000:-1)
plain min max first last reverse rev..rst rev..ast sort sor..rst sor..ast
0) 0.004244 0.003368 0.003313 0.003367 0.003327 0.004325 0.003401 0.003379 0.004310 0.003359 0.003396
1) 0.003969 93% 0.003862 114% 0.003834 115% 0.003810 113% 0.003822 114% 0.003940 91% 0.003908 114% 0.003814 112% 0.003986 92% 0.003954 117% 0.003816 112%
2) 0.003728 93% 0.003638 94% 0.003659 0.003685 0.003628 94% 0.003716 94% 0.003653 93% 0.003655 0.003748 94% 0.003740 94% 0.003686
revset: heads(matching(tip, "author"))
plain min max first last reverse rev..rst rev..ast sort sor..rst sor..ast
0) 7.574666 7.545950 7.570743 7.578697 7.525725 7.509929 7.443854 7.488442 7.452880 7.445411 7.689107
1) 7.549390 7.389162 7.529790 7.536297 7.450467 7.555347 7.404586 7.514948 7.542794 7.524787 7.536918
2) 7.568294 7.479326 7.578624 7.380375 7.440102 7.454218 7.515189 7.556511 7.524585 7.537566 7.507418
revset: heads(matching(tip, "author")) and -10000:-1
plain min max first last reverse rev..rst rev..ast sort sor..rst sor..ast
0) 7.512533 7.605877 7.382894 7.462109 7.420086 7.575034 7.448452 7.549374 7.457880 7.450308 7.515019
1) 7.548677 7.551832 7.629598 7.494857 7.550554 7.521838 7.451794 error 7.321781 7.546885 7.557523
2) 7.451985 7.541044 7.506563 7.470928 7.512618 7.474988 7.498887 7.547930 7.560276 7.618599 7.465442
revset: (-10000:-1) and heads(matching(tip, "author"))
plain min max first last reverse rev..rst rev..ast sort sor..rst sor..ast
0) 7.465419 7.570089 7.439594 7.521221 7.498716 7.492922 7.479108 7.552397 7.407888 error 7.468264
1) 7.539866 7.548045 7.491761 7.517170 7.469824 7.501990 7.579102 7.502568 7.578102 7.555754 7.567622
2) 7.370463 7.514712 7.497024 7.679428 7.638138 7.490775 7.472273 7.652587 7.584139 7.511893 7.466384