Augie Fackler <raf@durin42.com> [Sun, 28 May 2017 21:29:58 -0400] rev 32536
manifest: use itertools.chain() instead of + for Python 3 compat
This is all pure-Python code, so I'm not too worried about perf here,
but we can come back and fix it should it be a problem.
With this change, the manifest code passes most unit tests on Python 3
(once the tests are corrected with many b prefixes. I've got a little
more to sort out there and then I'll mail that change too.
Augie Fackler <raf@durin42.com> [Sun, 28 May 2017 21:29:15 -0400] rev 32535
manifest: fix some pure-Python parser bits to work on Python 3
Augie Fackler <raf@durin42.com> [Sun, 28 May 2017 18:08:36 -0400] rev 32534
tests: make test-manifest finish importing in Python 3
The test is still broken, but now it executes.
Augie Fackler <raf@durin42.com> [Sun, 28 May 2017 18:08:14 -0400] rev 32533
tests: drop assertIn polyfill now that we're 2.7-only
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 28 May 2017 11:13:10 -0700] rev 32532
perf: benchmark command for revlog indexes
We didn't have explicit microbenchmark coverage for loading revlog
indexes. That seems like a useful thing to have, so let's add it.
We currently measure the low-level nodemap APIs. There is room to
hook in at the actual revlog layer. This could be done as a follow-up.
The hackiest thing about this patch is specifying revlog paths.
Other commands have arguments that allow resolution of changelog,
manifest, and filelog. I needed to hook in at a lower level of
the revlog API than what the existing helper functions to resolve
revlogs allowed. I was too lazy to write some new APIs. This could
be done as a follow-up easily enough.
Example output for `hg perfrevlogindex 00changelog.i` on my
Firefox repo (404418 revisions):
! revlog constructor
! wall 0.003106 comb 0.000000 user 0.000000 sys 0.000000 (best of 912)
! read
! wall 0.003077 comb 0.000000 user 0.000000 sys 0.000000 (best of 924)
! create index object
! wall 0.000000 comb 0.000000 user 0.000000 sys 0.000000 (best of 1803994)
! retrieve index entry for rev 0
! wall 0.000193 comb 0.000000 user 0.000000 sys 0.000000 (best of 14037)
! look up missing node
! wall 0.003313 comb 0.000000 user 0.000000 sys 0.000000 (best of 865)
! look up node at rev 0
! wall 0.003295 comb 0.010000 user 0.010000 sys 0.000000 (best of 858)
! look up node at 1/4 len
! wall 0.002598 comb 0.010000 user 0.010000 sys 0.000000 (best of 1103)
! look up node at 1/2 len
! wall 0.001909 comb 0.000000 user 0.000000 sys 0.000000 (best of 1507)
! look up node at 3/4 len
! wall 0.001213 comb 0.000000 user 0.000000 sys 0.000000 (best of 2275)
! look up node at tip
! wall 0.000453 comb 0.000000 user 0.000000 sys 0.000000 (best of 5697)
! look up all nodes (forward)
! wall 0.094615 comb 0.100000 user 0.100000 sys 0.000000 (best of 100)
! look up all nodes (reverse)
! wall 0.045889 comb 0.050000 user 0.050000 sys 0.000000 (best of 100)
! retrieve all index entries (forward)
! wall 0.078398 comb 0.080000 user 0.060000 sys 0.020000 (best of 100)
! retrieve all index entries (reverse)
! wall 0.079376 comb 0.080000 user 0.070000 sys 0.010000 (best of 100)
Gregory Szorc <gregory.szorc@gmail.com> [Sun, 28 May 2017 10:56:28 -0700] rev 32531
perf: rename perfrevlog to perfrevlogrevisions
We have a couple of commands beginning with "perfrevlog." The
actual "perfrevlog" command actually measures resolving the fulltext
of multiple revisions. So let's rename it to reflect what it actually
does.
Augie Fackler <raf@durin42.com> [Sun, 28 May 2017 15:43:26 -0400] rev 32530
server: use pycompat to get argv
Augie Fackler <raf@durin42.com> [Sun, 28 May 2017 13:27:29 -0400] rev 32529
encoding: make wide character class list a sysstr
That's what east_asian_width returns, so just match it.
Augie Fackler <raf@durin42.com> [Sun, 28 May 2017 14:02:14 -0400] rev 32528
cmdutil: use sorted(dict) instead of x = dict.keys(); x.sort()
The former both does less work and has the virtue of working on Python 3.
Augie Fackler <raf@durin42.com> [Sun, 28 May 2017 16:17:43 -0400] rev 32527
util: look for empty-sysstr instead of empty-bytesstr in textwrap code
Fixes behavior on Python 3.
Augie Fackler <raf@durin42.com> [Sun, 28 May 2017 15:47:43 -0400] rev 32526
minirst: look for column delimiters using slices instead of indicies
This works on both Python 2 and 3.
Augie Fackler <raf@durin42.com> [Sun, 28 May 2017 13:36:02 -0400] rev 32525
minirst: grab a byte, not an int, for the underline style
Augie Fackler <raf@durin42.com> [Sun, 28 May 2017 13:41:42 -0400] rev 32524
minirst: use bytes.strip instead of str.strip
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 29 May 2017 16:21:15 +0530] rev 32523
py3: use pycompat.bytestr so that we don't get ascii values
This fixes `hg files 'set:(**.py)'` which makes test-check-py3-compat.t able to
run on Python 3. So if you now do `python3 ./run-tests.py
test-check-py3-compat`, the test will actually run.
Pulkit Goyal <7895pulkit@gmail.com> [Mon, 29 May 2017 16:08:37 +0530] rev 32522
py3: update test-check-py3-compat.t
Augie Fackler <raf@durin42.com> [Sun, 28 May 2017 15:45:47 -0400] rev 32521
loader: pywatchman appears to already be py3 compatible
Our loader was doing some confusing things in pywatchman, but it looks
like we shouldn't be using it there anyway.
Augie Fackler <raf@durin42.com> [Sun, 28 May 2017 17:02:24 -0400] rev 32520
py3: update test expectations for py3-commands test
Jun Wu <quark@fb.com> [Thu, 25 May 2017 17:20:43 -0700] rev 32519
context: do not cache manifestctx
This will make sure when ctx.repo.manifestlog changes, a correct new
manifestctx is returned. repo.manifestlog takes care of caching so the
manifestctx won't be reconstructed every time.
Jun Wu <quark@fb.com> [Thu, 25 May 2017 17:06:32 -0700] rev 32518
test-context: add a case demonstrating manifest caching problem
This issue was discovered when testing absorb on Windows. What happens are:
1. ctx.p1().manifestctx gets cached.
let's call ctx.p1().manifestctx._revlog() "mrevlog1"
2. repo.manifestlog gets invalidated.
let's call repo.manifestlog._revlog "mrevlog2"
3. repo.commitctx(ctx)
commitctx uses ctx.p1().manifestctx and writes to "mrevlog1"
4. repo[n].manifest()
cannot find the manifest node in "mrevlog2"
This patch adds a test case to reproduce the issue.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 25 May 2017 16:50:46 +0200] rev 32517
debugbundle: display the content of obsmarkers parts
We parse and display the markers in the part when possible.
Pierre-Yves David <pierre-yves.david@octobus.net> [Sun, 28 May 2017 11:50:43 -0700] rev 32516
bundle: add an experimental knob to include obsmarkers in bundle
The "hg bundle" command is a good place to test if the inclusion of obsmarkers
within a bundle is working well (part exists, content is correct etc). So we
add a way to have them included.
Ideally, this would be controlled by a change around bundlespec (bundlespec
"v3" + arguments). However, my main goal is to have obsmarkers included in
bundle created by the 'hg strip' command, not the 'hg bundle' so for now I'm
avoiding the detour through bundlespec rework territory.
Better debug output for obsmarkers in 'debugbundle' will be added in later
changesets. The 'test-obsolete-bundle-strip.t' test will also get updated in a
later changeset to keep the current changeset smaller.
Pierre-Yves David <pierre-yves.david@octobus.net> [Sun, 28 May 2017 11:48:18 -0700] rev 32515
bundle2: move function building obsmarker-part in the bundle2 module
We move it next to similar part building functions. We will need it for the
"writenewbundle" logic. This will allow us to easily include obsmarkers in
on-disk bundle, a necessary step before having `hg strip` also operate on
markers.
(Yes, the bundle2 module was already too large, but there any many
interdependencies between its components so it is non-trivial to split, this is
a quest for another adventure.)
Yuya Nishihara <yuya@tcha.org> [Tue, 02 May 2017 21:45:48 +0900] rev 32514
policy: remove unused policynoc and policynocffi constants
Yuya Nishihara <yuya@tcha.org> [Tue, 02 May 2017 21:45:10 +0900] rev 32513
cffi: remove superfluous "if True" blocks
Yuya Nishihara <yuya@tcha.org> [Tue, 02 May 2017 21:15:31 +0900] rev 32512
cffi: split modules from pure
The copyright lines are updated per change history.
cffi/osutil.py isn't tested since I have no access to OS X machine right now,
sorry.
Yuya Nishihara <yuya@tcha.org> [Sun, 28 May 2017 15:45:52 +0900] rev 32511
policy: extend API version checks for cffi
This is just a stub for future extension. I could add a version constant to
CFFI modules by putting it to both ffi.set_source() and ffi.cdef(), but that
doesn't seem right. So for now, cffi modules will be explicitly unversioned
(i.e. version constant must be undefined or set to None.) We can revisit it
later when we need to consider CFFI support more seriously.
Yuya Nishihara <yuya@tcha.org> [Sun, 28 May 2017 17:36:01 +0900] rev 32510
filterpyflakes: allow reexporting pure symbols from cffi modules
cffi modules will do 'from ..pure.<module> import *'.
Yuya Nishihara <yuya@tcha.org> [Tue, 02 May 2017 22:28:18 +0900] rev 32509
import-checker: guess names of C extension modules
Since extension modules aren't included in the list of source files, they
need to be populated somehow. Otherwise the import from cext/cffi would be
treated as a global one.
Yuya Nishihara <yuya@tcha.org> [Sun, 28 May 2017 15:21:18 +0900] rev 32508
import-checker: convert localmods to a set of module names
This makes it easy to add a source-less module name to the set.
Yuya Nishihara <yuya@tcha.org> [Tue, 02 May 2017 22:24:57 +0900] rev 32507
import-checker: allow importing symbols from pure modules
This allows us to re-export pure functions from cffi modules:
# mercurial/cffi/base85.py
from ..pure.base85 import *
Yuya Nishihara <yuya@tcha.org> [Tue, 02 May 2017 21:08:38 +0900] rev 32506
cffi: put compiled modules into mercurial.cffi package
Don't pollute the top-level namespace.
Yuya Nishihara <yuya@tcha.org> [Tue, 02 May 2017 21:04:40 +0900] rev 32505
cffi: rename build scripts
This frees up cffi package for modules to be split from pure.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 19 May 2017 11:44:05 -0700] rev 32504
match: remove support for includes from patternmatcher
Includes (and excludes) are now delegated to the includematcher.
Martin von Zweigbergk <martinvonz@google.com> [Mon, 22 May 2017 23:31:15 -0700] rev 32503
match: simplify includematcher a bit
The "include" we have in symbols is redundant and the double negative
in visitdir() can be removed.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 19 May 2017 13:36:34 -0700] rev 32502
match: remove support for non-include patterns from includematcher
The includematcher will always get at least one include pattern and
will never get any non-include patterns, so we can remove most of the
code in it. This patch does mostly straight-forward deletions of
code. We will clean up further later.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 19 May 2017 22:36:14 -0700] rev 32501
match: split up main matcher into patternmatcher and includematcher
At this point the includematcher is an exact copy of the main matcher
class. We will specialize and simplify both classes in the following
patches. This initial unmodified copy is just to make the differences
clearer. We also rename the main matcher to "patternmatcher" for
consistency.
I may eventually merge this new includematcher back into the main
matcher, but I think doing it this way makes the intermediate steps
clearer regardless.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 18 May 2017 23:39:39 -0700] rev 32500
match: remove support for exact matching from main matcher class
Exact matching is now handled by the exactmatcher class.
We can safely remove _files from the __repr__() implementation,
because even though the field is set, the patternspat field is enough
for the representation to be unambiguous (which was not the case when
the matcher could handle exact matches).
Martin von Zweigbergk <martinvonz@google.com> [Wed, 17 May 2017 09:26:15 -0700] rev 32499
match: handle exact matching using new exactmatcher
Martin von Zweigbergk <martinvonz@google.com> [Fri, 12 May 2017 16:33:33 -0700] rev 32498
merge: use intersectmatchers() in "m2-vs-ma optimization"
It doesn't seem like this can actually happen, but seems like cleaner
anyway.
Martin von Zweigbergk <martinvonz@google.com> [Fri, 12 May 2017 23:12:05 -0700] rev 32497
match: handle includes using new intersectionmatcher
Martin von Zweigbergk <martinvonz@google.com> [Thu, 25 May 2017 14:32:56 -0700] rev 32496
match: move entire uipath() implementation to basematcher
Even though most matchers will always want to use the relative path in
uipath(), when we add support for intersecting matcher, we will want
to control which form to use for any kind of matcher without knowing
the type (see next patch), so we need the implementation on the base
class.
Also rename the attribute from "pathrestricted" to "relativeuipath"
since there actually are cases where we match everything but still use
relative paths (like when the user runs "hg files .." from inside
mercurial/).
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 25 May 2017 12:09:09 +0200] rev 32495
local-clone: also copy tags related caches
This caches provide a large speedup for some repositories. Keeping it around is
valuable.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 25 May 2017 12:05:33 +0200] rev 32494
local-clone: also copy revs-branch-cache files
This cache provides a large speedup for some repositories. Keeping it around is
valuable.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 25 May 2017 11:59:07 +0200] rev 32493
local-clone: extract the listing of caches to copy
Right now, the clone only copies the branchmap caches. There are multiple
other valuable caches that we should copy and extensions might add their own.
So we add a function to list the cache files to copy from the repository. The
repository argument is unused but extensions will want it.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 25 May 2017 11:55:00 +0200] rev 32492
local-clone: extract the closure copying caches
Closures often get on the way. They are not much value in having that as a
closure so I'm extracting it at the module level.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 25 May 2017 19:38:00 +0200] rev 32491
test: add isolated prune case (to test-obsolete-bundle-strip.t)
This adds a test where the prune marker is not related to any other obsmarkers.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 25 May 2017 19:37:47 +0200] rev 32490
test-obsolete-bundle-strip: add a complex split and fold case
This is a more complex case that checks the logic used when split and fold gets
into play.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 25 May 2017 19:37:29 +0200] rev 32489
test-obsolete-bundle-strip: add cases with prune on missing revs
Same as the previously added case, but the prune is no longer known locally.
This will mostly matter for the strip testing. Introducing the test early will
help clarify patches related to strip.
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 25 May 2017 19:37:29 +0200] rev 32488
obsolete: fix relevant-obsmarkers computation on pruned changeset
The markers pruning a node was not directly considered relevant for the pruned
node, only to its parents.
This went unnoticed during obsmarkers exchange because all
ancestors of the pruned node would be included in the computation.
This still affects obsmarkers exchange a bit since "inline" prune markers would
be ignored (see second test case). This went unnoticed, because in such case,
we always push another obsolescence markers for that node.
We add explicit tests covering this case.
(The set of relevant changeset is use in the obsmarkers discovery protocol used
in the evolve experimental extension, the impact will be handled on the
extension side).
Pierre-Yves David <pierre-yves.david@octobus.net> [Thu, 25 May 2017 19:37:07 +0200] rev 32487
test: add a test file for relevant obsmarkers and its usage
The logic around obsmarkers "relevant" to a set of revs have a couple of test
around in other places but no systematic testing. In addition, all the current
testing focus on the exchange case (we looks at relevant markers for
'::heads').
For bundles, we'll need something a bit different. We'll no longer have set of
revision going down to the repository roots. So we'll have to test these cases
too. In addition, stripping obsmarkers will introduce new logic around
obsmarkers that will need testing too. So a new test file make sense here.
We start with a simple tests, more advanced cases are coming in the next
changesets. The extra testing catch a minor bug (later in the series).
Siddharth Agarwal <sid0@fb.com> [Wed, 24 May 2017 19:39:33 -0700] rev 32486
annotate: add a new experimental --skip option to skip revs
This option is most useful for mechanical code modifications, especially ones
that retain the same number of lines.
Siddharth Agarwal <sid0@fb.com> [Wed, 24 May 2017 19:07:14 -0700] rev 32485
annotate: add core algorithm to skip a rev
The core algorithm is inspired by git hyper-blame, implemented at
https://chromium.googlesource.com/chromium/tools/depot_tools.git/+/master/git_hyper_blame.py.
The heuristic is as documented in the comments.
Siddharth Agarwal <sid0@fb.com> [Wed, 24 May 2017 17:40:08 -0700] rev 32484
annotate: make pair take all parents to pair against
In upcoming patches we'll need to be aware of all parents at the same time.
This also exposes a potential bug: if a line can be annotated with both parents
of a merge commit, it'll always be annotated with p2, not p1. I'm not sure if
that's what we want, but at least the code makes it clear now.
Siddharth Agarwal <sid0@fb.com> [Wed, 24 May 2017 17:38:28 -0700] rev 32483
annotate: move pair function to top level
We'll want to make this more complicated and have unit tests for it in upcoming
patches.
Yuya Nishihara <yuya@tcha.org> [Thu, 25 May 2017 23:20:00 +0900] rev 32482
bookmarks: fix check of hash-like name to not abort by ambiguous identifier
'mark in repo' may raise LookupError. I set it to not be warned since bookmark
names shorter than 4 chars aren't checked and short names are likely to be
ambiguous.
Yuya Nishihara <yuya@tcha.org> [Thu, 25 May 2017 23:18:02 +0900] rev 32481
localrepo: document that __contains__() may raise LookupError
Pierre-Yves David <pierre-yves.david@octobus.net> [Sun, 21 May 2017 15:56:02 +0200] rev 32480
hidden: drop outdated comment about "dynamic" performance
This comment is now irrelevant since we have a faster algorithm and no cache.
Pierre-Yves David <pierre-yves.david@octobus.net> [Sun, 21 May 2017 15:47:06 +0200] rev 32479
hidden: unify the static and dynamic blocker logic
We no longer have cache and they both work the same way. Unifying the logic
simplify the code and reduce the amount of set copies.
Pierre-Yves David <pierre-yves.david@octobus.net> [Sun, 21 May 2017 15:53:08 +0200] rev 32478
hidden: drop the hidden cache logic
The improvement in time complexitty and the speed-up in computation is large
enough that the has little use now. Its update time can even gets in the way. So
we drop it.
This will allow us to unify the static/dynamic blockers logic in the next
changeset.
Pierre-Yves David <pierre-yves.david@octobus.net> [Sun, 21 May 2017 16:01:20 +0200] rev 32477
hidden: simplify the computation of consistency blocker
For a couple of years, we now have precomputed set for all mutable phases. We
can use this set restrict our search and quickly detect non-hideable children of
hideable changesets. This speeds up the hidden computation. See docstring of
the new function for details.
This new version reuses the '_domainancestors' function to keep the computation
of revealed changeset in O(len(visible))
Below are perfvolatilesets timing from two Mozilla repositories with different
contents. hidden cache is disabled while obtaining them.
1) Mozilla repository with:
* 400667 changesets
* 35 hidden changesets (first rev-268334)
* 288 visible drafts
* 1 unstable changeset
Before:
! visible
! wall 0.001744 comb 0.000000 user 0.000000 sys 0.000000 (best of 1563)
After:
! visible
! wall 0.000742 comb 0.000000 user 0.000000 sys 0.000000 (best of 3755)
The timing above include the computation of obsolete changeset:
! obsolete
! wall 0.000396 comb 0.000000 user 0.000000 sys 0.000000 (best of 6816)
So adjusted time give 1.3ms before versus 0.3ms after. A 4x speedup.
2) Mozilla repository with:
* 405645 changesets
* 4312 hidden changesets (first rev-326004)
* 264 visible drafts
* 1 unstable changeset
Before:
! visible
! wall 0.025476 comb 0.030000 user 0.030000 sys 0.000000 (best of 111)
After
! visible
! wall 0.007703 comb 0.010000 user 0.010000 sys 0.000000 (best of 358)
The timing above include the computation of obsolete changeset:
! obsolete
! wall 0.006408 comb 0.010000 user 0.010000 sys 0.000000 (best of 404)
So adjusted time give 19ms before versus 1.3ms after. A 17x speedup.