[PATCH 7 of 9 V4] manifest: add shallow option to treemanifestctx.readdelta and readfast

Durham Goode durham at fb.com
Tue Oct 25 20:17:23 UTC 2016



On 9/21/16 1:32 PM, Martin von Zweigbergk wrote:
> On Tue, Sep 20, 2016 at 4:47 PM, Durham Goode <durham at fb.com> wrote:
>> # HG changeset patch
>> # User Durham Goode <durham at fb.com>
>> # Date 1474399441 25200
>> #      Tue Sep 20 12:24:01 2016 -0700
>> # Node ID 561681e7a16fa33aa8a40e4c9a31ff395a115e4c
>> # Parent  69b91c12d904f329eff6618ac43f5cfef631e8dc
>> manifest: add shallow option to treemanifestctx.readdelta and readfast
>>
>> The old manifest had different functions for performing shallow reads, shallow
>> readdeltas, and shallow readfasts. Since a lot of the code is duplicate (and
>> since those functions don't make sense on a normal manifestctx), let's unify
>> them into flags on the existing readdelta and readfast functions.
>>
>> A future diff will change consumers of these functions to use the manifestctx
>> versions and will delete the old apis.
>>
>> diff --git a/mercurial/manifest.py b/mercurial/manifest.py
>> --- a/mercurial/manifest.py
>> +++ b/mercurial/manifest.py
>> @@ -1109,7 +1109,7 @@ class manifestctx(object):
>>                   self._data = manifestdict(text)
>>           return self._data
>>
>> -    def readfast(self):
>> +    def readfast(self, shallow=False):
>>           rl = self._revlog
>>           r = rl.rev(self._node)
>>           deltaparent = rl.deltaparent(r)
>> @@ -1117,7 +1117,7 @@ class manifestctx(object):
>>               return self.readdelta()
>>           return self.read()
>>
>> -    def readdelta(self):
>> +    def readdelta(self, shallow=False):
>>           revlog = self._revlog
>>           if revlog._usemanifestv2:
>>               # Need to perform a slow delta
>> @@ -1176,27 +1176,40 @@ class treemanifestctx(object):
>>       def node(self):
>>           return self._node
>>
>> -    def readdelta(self):
>> -        # Need to perform a slow delta
>> +    def readdelta(self, shallow=False):
>>           revlog = self._revlog
>> -        r0 = revlog.deltaparent(revlog.rev(self._node))
>> -        m0 = treemanifestctx(revlog, revlog.node(r0), dir=self._dir).read()
>> -        m1 = self.read()
>> -        md = treemanifest(dir=self._dir)
>> -        for f, ((n0, fl0), (n1, fl1)) in m0.diff(m1).iteritems():
>> -            if n1:
>> -                md[f] = n1
>> -                if fl1:
>> -                    md.setflag(f, fl1)
>> -        return md
>> +        if shallow and revlog._treeondisk and not revlog._usemanifestv2:
>> +            if revlog._usemanifestv2:
> Looks like this cannot happen because the condition above checks that
> it's false.
True. Will fix
>
>> +                raise error.Abort(
>> +                    _("shallow readdelta() not implemented for manifestv2"))
>> +            r = revlog.rev(self._node)
>> +            d = mdiff.patchtext(revlog.revdiff(revlog.deltaparent(r), r))
>> +            return manifestdict(d)
>> +        else:
>> +            # Need to perform a slow delta
>> +            r0 = revlog.deltaparent(revlog.rev(self._node))
>> +            m0 = treemanifestctx(revlog, revlog.node(r0), dir=self._dir).read()
>> +            m1 = self.read()
>> +            md = treemanifest(dir=self._dir)
>> +            for f, ((n0, fl0), (n1, fl1)) in m0.diff(m1).iteritems():
>> +                if n1:
>> +                    md[f] = n1
>> +                    if fl1:
>> +                        md.setflag(f, fl1)
>> +            return md
>>
>> -    def readfast(self):
>> +    def readfast(self, shallow=False):
>>           rl = self._revlog
>>           r = rl.rev(self._node)
>>           deltaparent = rl.deltaparent(r)
>> -        if deltaparent != revlog.nullrev and deltaparent in rl.parentrevs(r):
>> -            return self.readdelta()
>> -        return self.read()
>> +        if (deltaparent != revlog.nullrev and
>> +            deltaparent in rl.parentrevs(r)):
>> +            return self.readdelta(shallow=shallow)
>> +
>> +        if shallow:
>> +            return manifestdict(rl.revision(self._node))
>> +        else:
>> +            return self.read()
>>
>>   class manifest(manifestrevlog):
>>       def __init__(self, opener, dir='', dirlogcache=None):
>> _______________________________________________
>> Mercurial-devel mailing list
>> Mercurial-devel at mercurial-scm.org
>> https://urldefense.proofpoint.com/v2/url?u=https-3A__www.mercurial-2Dscm.org_mailman_listinfo_mercurial-2Ddevel&d=DQIBaQ&c=5VD0RTtNlTh3ycd41b3MUw&r=nuarHzhP1wi1T9iURRCj1A&m=0loc3QxbV83HAhNXcOapFTjP_X7sVB5naGs61y32iO0&s=1cqzH8WNI5JzlNBsQtDTvCxgzKza4y1Cn1sFmfZvsvo&e=



More information about the Mercurial-devel mailing list