--- a/mercurial/changegroup.py Thu Aug 09 15:40:14 2018 -0700
+++ b/mercurial/changegroup.py Thu Aug 09 16:02:14 2018 -0700
@@ -31,7 +31,6 @@
phases,
pycompat,
repository,
- revlog,
util,
)
@@ -512,19 +511,6 @@
basenode = attr.ib()
ellipsis = attr.ib(default=False)
-@interfaceutil.implementer(repository.irevisiondelta)
-@attr.s(slots=True, frozen=True)
-class revisiondelta(object):
- node = attr.ib()
- p1node = attr.ib()
- p2node = attr.ib()
- basenode = attr.ib()
- linknode = attr.ib()
- flags = attr.ib()
- baserevisionsize = attr.ib()
- revision = attr.ib()
- delta = attr.ib()
-
def _revisiondeltatochunks(delta, headerfn):
"""Serialize a revisiondelta to changegroup chunks."""
@@ -583,77 +569,6 @@
key = lambda n: cl.rev(lookup(n))
return [store.rev(n) for n in sorted(nodes, key=key)]
-def _handlerevisiondeltarequest(store, request, prevnode):
- """Obtain a revisiondelta from a revisiondeltarequest"""
-
- node = request.node
- rev = store.rev(node)
-
- # Requesting a full revision.
- if request.basenode == nullid:
- baserev = nullrev
- # Requesting an explicit revision.
- elif request.basenode is not None:
- baserev = store.rev(request.basenode)
- # Allowing us to choose.
- else:
- p1, p2 = store.parentrevs(rev)
- dp = store.deltaparent(rev)
-
- if dp == nullrev and store.storedeltachains:
- # Avoid sending full revisions when delta parent is null. Pick prev
- # in that case. It's tempting to pick p1 in this case, as p1 will
- # be smaller in the common case. However, computing a delta against
- # p1 may require resolving the raw text of p1, which could be
- # expensive. The revlog caches should have prev cached, meaning
- # less CPU for changegroup generation. There is likely room to add
- # a flag and/or config option to control this behavior.
- baserev = store.rev(prevnode)
- elif dp == nullrev:
- # revlog is configured to use full snapshot for a reason,
- # stick to full snapshot.
- baserev = nullrev
- elif dp not in (p1, p2, store.rev(prevnode)):
- # Pick prev when we can't be sure remote has the base revision.
- baserev = store.rev(prevnode)
- else:
- baserev = dp
-
- if baserev != nullrev and not store.candelta(baserev, rev):
- baserev = nullrev
-
- revision = None
- delta = None
- baserevisionsize = None
-
- if store.iscensored(baserev) or store.iscensored(rev):
- try:
- revision = store.revision(node, raw=True)
- except error.CensoredNodeError as e:
- revision = e.tombstone
-
- if baserev != nullrev:
- baserevisionsize = store.rawsize(baserev)
-
- elif baserev == nullrev:
- revision = store.revision(node, raw=True)
- else:
- delta = store.revdiff(baserev, rev)
-
- extraflags = revlog.REVIDX_ELLIPSIS if request.ellipsis else 0
-
- return revisiondelta(
- node=node,
- p1node=request.p1node,
- p2node=request.p2node,
- linknode=request.linknode,
- basenode=store.node(baserev),
- flags=store.flags(rev) | extraflags,
- baserevisionsize=baserevisionsize,
- revision=revision,
- delta=delta,
- )
-
def _makenarrowdeltarequest(cl, store, ischangelog, rev, node, linkrev,
linknode, clrevtolocalrev, fullclnodes,
precomputedellipsis):
@@ -832,17 +747,12 @@
progress = repo.ui.makeprogress(_('bundling'), unit=units,
total=len(requests))
- prevnode = store.node(revs[0])
- for i, request in enumerate(requests):
+ for i, delta in enumerate(store.emitrevisiondeltas(requests)):
if progress:
progress.update(i + 1)
- delta = _handlerevisiondeltarequest(store, request, prevnode)
-
yield delta
- prevnode = request.node
-
if progress:
progress.complete()