[PATCH 05 of 11 V2] revlogdeltas: extra fulltext building in its own function
Boris Feld
boris.feld at octobus.net
Mon Aug 27 06:06:32 EDT 2018
# HG changeset patch
# User Boris Feld <boris.feld at octobus.net>
# Date 1534385554 -7200
# Thu Aug 16 04:12:34 2018 +0200
# Node ID c92f0df36ad5efafde442870039279f068a64c30
# Parent 7e67a3db18113ec4ae6efca9359bcb69ed0d6ee9
# EXP-Topic sparse-snapshot
# Available At https://bitbucket.org/octobus/mercurial-devel/
# hg pull https://bitbucket.org/octobus/mercurial-devel/ -r c92f0df36ad5
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.
diff --git a/mercurial/revlogutils/deltas.py b/mercurial/revlogutils/deltas.py
--- a/mercurial/revlogutils/deltas.py
+++ b/mercurial/revlogutils/deltas.py
@@ -438,6 +438,34 @@ def segmentspan(revlog, revs, deltainfo=
end = revlog.end(revs[-1])
return end - revlog.start(revs[0])
+def _textfromdelta(fh, revlog, baserev, delta, p1, p2, flags, expectednode):
+ """build full text from a (base, delta) pair and other metadata"""
+ # special case deltas which replace entire base; no need to decode
+ # base revision. this neatly avoids censored bases, which throw when
+ # they're decoded.
+ hlen = struct.calcsize(">lll")
+ if delta[:hlen] == mdiff.replacediffheader(revlog.rawsize(baserev),
+ len(delta) - hlen):
+ fulltext = delta[hlen:]
+ else:
+ # deltabase is rawtext before changed by flag processors, which is
+ # equivalent to non-raw text
+ basetext = revlog.revision(baserev, _df=fh, raw=False)
+ fulltext = mdiff.patch(basetext, delta)
+
+ try:
+ res = revlog._processflags(fulltext, flags, 'read', raw=True)
+ fulltext, validatehash = res
+ if validatehash:
+ revlog.checkhash(fulltext, expectednode, p1=p1, p2=p2)
+ if flags & REVIDX_ISCENSORED:
+ raise RevlogError(_('node %s is not censored') % expectednode)
+ except CensoredNodeError:
+ # must pass the censored index flag to add censored revisions
+ if not flags & REVIDX_ISCENSORED:
+ raise
+ return fulltext
+
@attr.s(slots=True, frozen=True)
class _deltainfo(object):
distance = attr.ib()
@@ -605,35 +633,13 @@ class deltacomputer(object):
revlog = self.revlog
cachedelta = revinfo.cachedelta
- flags = revinfo.flags
- node = revinfo.node
-
baserev = cachedelta[0]
delta = cachedelta[1]
- # special case deltas which replace entire base; no need to decode
- # base revision. this neatly avoids censored bases, which throw when
- # they're decoded.
- hlen = struct.calcsize(">lll")
- if delta[:hlen] == mdiff.replacediffheader(revlog.rawsize(baserev),
- len(delta) - hlen):
- btext[0] = delta[hlen:]
- else:
- # deltabase is rawtext before changed by flag processors, which is
- # equivalent to non-raw text
- basetext = revlog.revision(baserev, _df=fh, raw=False)
- btext[0] = mdiff.patch(basetext, delta)
- try:
- res = revlog._processflags(btext[0], flags, 'read', raw=True)
- btext[0], validatehash = res
- if validatehash:
- revlog.checkhash(btext[0], node, p1=revinfo.p1, p2=revinfo.p2)
- if flags & REVIDX_ISCENSORED:
- raise RevlogError(_('node %s is not censored') % node)
- except CensoredNodeError:
- # must pass the censored index flag to add censored revisions
- if not flags & REVIDX_ISCENSORED:
- raise
+ fulltext = btext[0] = _textfromdelta(fh, revlog, baserev, delta,
+ revinfo.p1, revinfo.p2,
+ revinfo.flags, revinfo.node)
+ return fulltext
return btext[0]
def _builddeltadiff(self, base, revinfo, fh):
More information about the Mercurial-devel
mailing list