On Tue, 20 Feb 2018 12:02:36 +0100, Feld Boris wrote:
> 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.f...@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')
> >> +
> >> +@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

The storage is in utf-8, but the function interface isn't.

https://www.mercurial-scm.org/repo/hg/file/tip/mercurial/branchmap.py#l358
https://www.mercurial-scm.org/repo/hg/file/tip/mercurial/branchmap.py#l365

> 
> >
> >> +        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.

Thanks. Perhaps that should be handled in revbranchcache.setdata() if readonly
hack has to be dropped when cache data is updated.
_______________________________________________
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel

Reply via email to