Boris Feld <boris.feld@octobus.net> [Sat, 18 Aug 2018 07:32:05 +0200] rev 39335
revlogdeltas: pass revision number to _candidatesgroups
The `_candidates_groups` logic works on revisions, so the nodes are currently
just converted to revs at the top of the function. It seems cleaner to instead
pass revision numbers to the function.
Having this conversion out of the way will help for further cleanups.
Boris Feld <boris.feld@octobus.net> [Sat, 18 Aug 2018 07:27:34 +0200] rev 39334
revlogdeltas: extract _getcandidaterevs in a function
The logic barely uses the object it is attached to. This is an important
function that we will clean up in the coming changesets. Moving it at the top
level helps us with that cleanup.
Boris Feld <boris.feld@octobus.net> [Thu, 16 Aug 2018 04:38:57 +0200] rev 39333
revlogdeltas: always return a delta info object in finddeltainfo
Previously, the method returned `None` when a full snapshot was needed. The
caller had to determine how to produce one itself.
In practice, building a `_deltainfo` object for a full snapshot is simple. So
we build it at the `finddeltainfo` level and always return a `_deltainfo`
object.
The caller can now simply process the `_deltainfo` return in all cases.
Boris Feld <boris.feld@octobus.net> [Thu, 16 Aug 2018 04:20:34 +0200] rev 39332
revlogdeltas: move special cases around raw revisions in finddeltainfo
The method already contains logic for no-diff cases. Having everything in the
same place is more consistent and unlocks other code improvements.
Boris Feld <boris.feld@octobus.net> [Wed, 29 Aug 2018 09:41:04 -0700] rev 39331
revlogdeltas: extra fulltext building in its own function
The process of building a full text from a delta is complex enough to deserve
isolation. The previous function mixed cache management and computation, we
now have clearer boundaries and simpler functions/methods.
Boris Feld <boris.feld@octobus.net> [Thu, 16 Aug 2018 02:53:42 +0200] rev 39330
revlog: split functionality related to deltas computation in a new module
The revlog module is getting big and this logic is getting more and more
advanced. Moving it to `mercurial.revlogutils.deltas` split a lot off
revlog.py and will help this logic to become less interleaved with revlog.
The code is simply moved without modification (but for namespace changes).
Refactoring and improvement will be made in later changesets.
Boris Feld <boris.feld@octobus.net> [Thu, 16 Aug 2018 02:08:13 +0200] rev 39329
revlog: split constants into a new `revlogutils.constants` module
We want to split some logic out of the main revlog file (the delta computing
logic). However, this logic needs access to multiple constants related to the
revlog. So we move all revlog related constants into a new module that could
be imported from multiple places.
We don't copy the file (preserving blame history) because there are only a few
moving lines. Also, copying the file would result in annoying merge conflicts
with ongoing work from others contributors.
Martin von Zweigbergk <martinvonz@google.com> [Thu, 12 Jul 2018 12:11:20 -0700] rev 39328
rebase: skip extinct revisions even if it has no successor in rebase set
Differential Revision: https://phab.mercurial-scm.org/D4408
Martin von Zweigbergk <martinvonz@google.com> [Wed, 11 Jul 2018 12:26:44 -0700] rev 39327
tests: add test showing that rebase of extinct commit with successor fails
As the test case shows, attempting to rebase a commit that has a
successor that is not in the rebase set and not in the destination
currently fails because it "will cause divergences". However, it
doesn't seem like there's any harm in skipping the extinct commit. I
suspect this case missed simply because extinct revisions are usually
hidden.
Differential Revision: https://phab.mercurial-scm.org/D4407
Martin von Zweigbergk <martinvonz@google.com> [Mon, 27 Aug 2018 10:44:43 -0700] rev 39326
tests: add log output after stripping for context for next test
It's not obvious what the repo state will be after stripping some
nodes and obsmarkers, so let's include the log output to make it
easier to follow the test case that comes after.
Differential Revision: https://phab.mercurial-scm.org/D4406
Martin von Zweigbergk <martinvonz@google.com> [Tue, 28 Aug 2018 15:09:18 -0700] rev 39325
obsutil: make sure "addedmarkers" is not None in getobsoleted()
Similar reasoning as in
52e6171ec822 (obsutil: make sure "addedrevs"
is not None in getobsoleted(), 2018-08-25).
Differential Revision: https://phab.mercurial-scm.org/D4411
Martin von Zweigbergk <martinvonz@google.com> [Tue, 28 Aug 2018 13:29:47 -0700] rev 39324
revsetlang: fix position of '-' in spaceless 'a-b' expressions
I don't know if there is an observable difference, but it seems like
an obvious fix.
Differential Revision: https://phab.mercurial-scm.org/D4410
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 15 Aug 2018 23:05:23 +0000] rev 39323
tests: mark manifestfulltextcache as conditional on revlog store
This file is currently specific to the revlog store. Other stores
may not implement it. Mark it as such in test output.
Differential Revision: https://phab.mercurial-scm.org/D4395
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 15 Aug 2018 20:23:45 +0000] rev 39322
manifest: use fulltextcache instead of _fulltextcache
fulltextcache is part of the documented interface and is aliased
to _fulltextcache.
Differential Revision: https://phab.mercurial-scm.org/D4394
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 15 Aug 2018 19:58:06 +0000] rev 39321
manifest: rename manifestlog._revlog to _rootstore
Because it may not be a revlog.
Differential Revision: https://phab.mercurial-scm.org/D4393
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 15 Aug 2018 19:53:02 +0000] rev 39320
manifest: use public API for obtaining storage object
We should not be accessing private attributes on the manifestlog,
since its behavior is governed by an interface.
Differential Revision: https://phab.mercurial-scm.org/D4392
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 27 Aug 2018 08:58:25 -0700] rev 39319
perf: add function for obtaining manifest revision
This will use the modern API if available or fall back to the
legacy direct revlog access case. Without this, the perf command
won't work on all code bases.
Differential Revision: https://phab.mercurial-scm.org/D4391
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 15 Aug 2018 19:45:39 +0000] rev 39318
perf: use storage API for resolving manifest node
lookup() isn't part of the storage API. And this code shouldn't
be accessing manifestlog._revlog directly for the modern code base.
So let's port it to the modern API.
Note that the previous code was busted for cases where we needed
to call lookup() because lookup() isn't exposed by manifestrevlog
any more.
This change is strictly BC breaking because we no longer support
resolving partial nodes. But it is a perf* command and I don't
think we should flag the change as such.
Differential Revision: https://phab.mercurial-scm.org/D4390
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 27 Aug 2018 08:52:33 -0700] rev 39317
manifest: change terminology for storage in context classes
Storage may not be backed by revlogs. So it is wrong to refer
to storage as "revlog" or use abbreviations like "rl."
This commit replaces revlog terminology in manifest context classes
and starts referring to things as "store" or "storage."
Differential Revision: https://phab.mercurial-scm.org/D4389
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 27 Aug 2018 08:55:24 -0700] rev 39316
manifest: don't go through revlog to access node symbols
The revlog module re-exports some node.* symbols courtesy of
importing them. Let's access the node.* symbols via our local
import.
Differential Revision: https://phab.mercurial-scm.org/D4388
Gregory Szorc <gregory.szorc@gmail.com> [Wed, 15 Aug 2018 16:50:44 +0000] rev 39315
manifest: make tree a public attribute
changegroup generation accesses this attribute. We should make it
public and expose it on the interface.
Differential Revision: https://phab.mercurial-scm.org/D4387
Gregory Szorc <gregory.szorc@gmail.com> [Mon, 27 Aug 2018 10:15:15 -0700] rev 39314
manifest: proxy to revlog instance instead of inheriting
Previously, manifestrevlog inherited revlog.revlog and therefore
exposed all its APIs. This inevitably resulted in consumers calling
low-level revlog APIs.
As part of abstracting storage, we want to formalize the interface
for manifest storage. The revlog API is much too large to define as
the interface.
Like we did for filelog, this commit divorces the manifest class
from revlog so that we can standardize on a smaller API surface.
The way I went about this commit was I broke the inheritance, ran
tests, and added proxies until all tests passed. Like filelog, there
are a handful of attributes that don't belong on the interface.
And like filelog, we'll tease these out in the future.
As part of this, we formalize an interface for manifest storage and
add checks that manifestrevlog conforms to the interface.
Adding proxies will introduce some overhead due to extra attribute
lookups and function calls. On the mozilla-unified repository:
$ hg verify
before: real 627.220 secs (user 525.870+0.000 sys 18.800+0.000)
after: real 628.930 secs (user 532.050+0.000 sys 18.320+0.000)
$ hg serve (for a clone)
before: user 223.580+0.000 sys 14.270+0.000
after: user 227.720+0.000 sys 13.920+0.000
$ hg clone
before: user 506.390+0.000 sys 29.720+0.000
after: user 513.080+0.000 sys 28.280+0.000
There appears to be some overhead here. But it appears to be 1-2%.
I think that is an appropriate price to pay for storage abstraction,
which will eventually let us have much nicer things. If the overhead
is noticed in other operations (whose CPU time isn't likely dwarfed by
fulltext resolution) or if we want to cut down on the overhead, we
could dynamically build up a type whose methods are effectively
aliased to a revlog instance's. I'm inclined to punt on that problem
for now. We may have to do it for the changelog. At which point it
could be implemented in a generic way and ported to filelog and
manifestrevlog easily enough I would think.
.. api:: manifest.manifestrevlog no longer inherits from revlog
The manifestrevlog class now wraps a revlog instance instead of
inheriting from revlog. Various attributes and methods on instances
are no longer available.
Differential Revision: https://phab.mercurial-scm.org/D4386
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com> [Sun, 26 Aug 2018 13:09:35 -0400] rev 39313
pager: do not enable when TERM=dumb
Before this, running hg in emacs' M-x shell started `less`, which
would complain about the terminal not being fully functional.
Differential Revision: https://phab.mercurial-scm.org/D4376
Yuya Nishihara <yuya@tcha.org> [Wed, 22 Aug 2018 20:52:36 +0900] rev 39312
localrepo: do not cache auditor/nofsauditor which would make reference cycle
Before, self.auditor and self.nofsauditor held self through self._checknested,
and the following code couldn't free a repo by ref-counting.
def main():
repo = localrepo.localrepository(uimod.ui(), '../testrepos/hello')
main()
With this change, the cache of the nofsauditor is limited to a single match
session. I think that's okay as the nofsauditor doesn't do any filesystem
access. Alternatively, maybe we can remove the callback from nofsauditor
since it isn't used unless realfs=True, but I have no idea whether it is
a bug or not.
Yuya Nishihara <yuya@tcha.org> [Sun, 05 Aug 2018 13:13:06 +0900] rev 39311
minirst: remove unused function decorateblocks()
It was added at
ee6988aea74e "minirst: add decorateblocks search helper",
but it's been unused since then.
Yuya Nishihara <yuya@tcha.org> [Sun, 05 Aug 2018 12:11:19 +0900] rev 39310
minirst: make format() simply return a formatted text
It's a source of bugs to change the type of the return value conditionally.
Yuya Nishihara <yuya@tcha.org> [Sun, 05 Aug 2018 12:20:43 +0900] rev 39309
help: reorder section filtering flow to not format help text twice
Yuya Nishihara <yuya@tcha.org> [Sun, 05 Aug 2018 12:06:07 +0900] rev 39308
help: inline minirst.format()
I'm going to make minirst.format() always returns a formatted text, not
text | (text, pruned).
Yuya Nishihara <yuya@tcha.org> [Sun, 05 Aug 2018 11:43:05 +0900] rev 39307
minirst: extract function that formats parsed blocks as plain text
Yuya Nishihara <yuya@tcha.org> [Sun, 05 Aug 2018 11:39:52 +0900] rev 39306
minirst: unindent "if True" block in filtersections()