[PATCH 2 of 4] revbranchcache: add a bundle2 handler for a rbc part
Feld Boris
boris.feld at octobus.net
Tue Feb 20 11:02:36 UTC 2018
On 19/01/2018 15:54, Yuya Nishihara wrote:
> On Thu, 18 Jan 2018 16:38:45 +0100, Boris Feld wrote:
>> # HG changeset patch
>> # User Boris Feld <boris.feld at octobus.net>
>> # Date 1516282142 -3600
>> # Thu Jan 18 14:29:02 2018 +0100
>> # Node ID 9c1ad82226a2e1fc7ca69550a46a7f7329c6b579
>> # Parent 4ad1a1054450063cc9aa19ab2037722c64877eb7
>> # EXP-Topic wire-rbc
>> # Available At https://bitbucket.org/octobus/mercurial-devel/
>> # hg pull https://bitbucket.org/octobus/mercurial-devel/ -r 9c1ad82226a2
>> revbranchcache: add a bundle2 handler for a rbc part
>> diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
>> --- a/mercurial/bundle2.py
>> +++ b/mercurial/bundle2.py
>> @@ -2101,6 +2101,40 @@ def handlehgtagsfnodes(op, inpart):
>> cache.write()
>> op.ui.debug('applied %i hgtags fnodes cache entries\n' % count)
>>
>> +rbcstruct = struct.Struct('>III')
>> +
>> + at parthandler('cache:rev-branch-cache')
>> +def handlerbc(op, inpart):
>> + """receive a rev-branch-cache payload and update the local cache
>> +
>> + The payload is a series of data related to each branch
>> +
>> + 1) branch name length
>> + 2) number of open heads
>> + 3) number of closed heads
>> + 4) open heads nodes
>> + 5) closed heads nodes
>> + """
>> + total = 0
>> + rawheader = inpart.read(rbcstruct.size)
>> + cache = op.repo.revbranchcache()
>> + cl = op.repo.unfiltered().changelog
>> + while rawheader:
>> + header = rbcstruct.unpack(rawheader)
>> + total += header[1] + header[2]
>> + branch = inpart.read(header[0])
> We'll probably need to convert branch name between utf-8 and local encoding.
We are not sure to understand why. The rev branch cache uses an internal
encoding, so local encoding shouldn't matter in our analysis.
https://www.mercurial-scm.org/repo/hg/file/tip/mercurial/branchmap.py#l336
>
>> + for x in xrange(header[1]):
>> + node = inpart.read(20)
>> + rev = cl.rev(node)
>> + cache.setdata(branch, rev, node, False)
>> + for x in xrange(header[2]):
>> + node = inpart.read(20)
>> + rev = cl.rev(node)
>> + cache.setdata(branch, rev, node, True)
>> + rawheader = inpart.read(rbcstruct.size)
>> + if total and 'branchinfo' in vars(cache):
>> + del cache.branchinfo
> No idea why we have to undo 'self.branchinfo = self._branchinfo'. Can you
> add a comment?
If branchmap caught an error when trying to read the branchmap file and
it's read-only (the default), it set the branchinfo attribute (with
`self.branchinfo = self._branchinfo`) in order to bypass the caching
logic defined in the `branchinfo` method.
If we add some information in the cache, we need to undo this bypass by
removing the instance attribute, so branchinfo will point back to the
original branchinfo method and cache will be used.
We will add a comment in the V2 version of this series.
More information about the Mercurial-devel
mailing list