diff -r 1469584ad5fe -r 1af339c22aeb mercurial/changegroup.py --- a/mercurial/changegroup.py Fri Aug 03 14:00:18 2018 -0700 +++ b/mercurial/changegroup.py Fri Aug 03 13:43:55 2018 -0700 @@ -523,7 +523,7 @@ def __init__(self, repo, filematcher, version, allowreorder, useprevdelta, builddeltaheader, manifestsend, sendtreemanifests, bundlecaps=None, ellipses=False, - shallow=False, ellipsisroots=None): + shallow=False, ellipsisroots=None, fullnodes=None): """Given a source repo, construct a bundler. filematcher is a matcher that matches on files to include in the @@ -552,6 +552,10 @@ shallow indicates whether shallow data might be sent. The packer may need to pack file contents not introduced by the changes being packed. + + fullnodes is the list of nodes which should not be ellipsis nodes. We + store this rather than the set of nodes that should be ellipsis because + for very large histories we expect this to be significantly smaller. """ assert filematcher self._filematcher = filematcher @@ -568,6 +572,7 @@ bundlecaps = set() self._bundlecaps = bundlecaps self._isshallow = shallow + self._fullnodes = fullnodes # Maps ellipsis revs to their roots at the changelog level. self._precomputedellipsis = ellipsisroots @@ -744,7 +749,7 @@ # end up with bogus linkrevs specified for manifests and # we skip some manifest nodes that we should otherwise # have sent. - if (x in self._full_nodes + if (x in self._fullnodes or cl.rev(x) in self._precomputedellipsis): n = c[0] # Record the first changeset introducing this manifest @@ -1086,7 +1091,7 @@ # This is a node to send in full, because the changeset it # corresponds to was a full changeset. - if linknode in self._full_nodes: + if linknode in self._fullnodes: return self._revisiondeltanormal(store, rev, prev, linknode) # At this point, a node can either be one we should skip or an @@ -1135,7 +1140,7 @@ walk = walk[1:] if p in self._clrevtolocalrev: return self._clrevtolocalrev[p] - elif p in self._full_nodes: + elif p in self._fullnodes: walk.extend([pp for pp in self._repo.changelog.parentrevs(p) if pp != nullrev]) elif p in self._precomputedellipsis: @@ -1194,7 +1199,7 @@ ) def _makecg1packer(repo, filematcher, bundlecaps, ellipses=False, - shallow=False, ellipsisroots=None): + shallow=False, ellipsisroots=None, fullnodes=None): builddeltaheader = lambda d: _CHANGEGROUPV1_DELTA_HEADER.pack( d.node, d.p1node, d.p2node, d.linknode) @@ -1207,10 +1212,11 @@ bundlecaps=bundlecaps, ellipses=ellipses, shallow=shallow, - ellipsisroots=ellipsisroots) + ellipsisroots=ellipsisroots, + fullnodes=fullnodes) def _makecg2packer(repo, filematcher, bundlecaps, ellipses=False, - shallow=False, ellipsisroots=None): + shallow=False, ellipsisroots=None, fullnodes=None): builddeltaheader = lambda d: _CHANGEGROUPV2_DELTA_HEADER.pack( d.node, d.p1node, d.p2node, d.basenode, d.linknode) @@ -1226,10 +1232,11 @@ bundlecaps=bundlecaps, ellipses=ellipses, shallow=shallow, - ellipsisroots=ellipsisroots) + ellipsisroots=ellipsisroots, + fullnodes=fullnodes) def _makecg3packer(repo, filematcher, bundlecaps, ellipses=False, - shallow=False, ellipsisroots=None): + shallow=False, ellipsisroots=None, fullnodes=None): builddeltaheader = lambda d: _CHANGEGROUPV3_DELTA_HEADER.pack( d.node, d.p1node, d.p2node, d.basenode, d.linknode, d.flags) @@ -1242,7 +1249,8 @@ bundlecaps=bundlecaps, ellipses=ellipses, shallow=shallow, - ellipsisroots=ellipsisroots) + ellipsisroots=ellipsisroots, + fullnodes=fullnodes) _packermap = {'01': (_makecg1packer, cg1unpacker), # cg2 adds support for exchanging generaldelta @@ -1303,7 +1311,8 @@ return min(versions) def getbundler(version, repo, bundlecaps=None, filematcher=None, - ellipses=False, shallow=False, ellipsisroots=None): + ellipses=False, shallow=False, ellipsisroots=None, + fullnodes=None): assert version in supportedoutgoingversions(repo) if filematcher is None: @@ -1325,7 +1334,8 @@ fn = _packermap[version][0] return fn(repo, filematcher, bundlecaps, ellipses=ellipses, - shallow=shallow, ellipsisroots=ellipsisroots) + shallow=shallow, ellipsisroots=ellipsisroots, + fullnodes=fullnodes) def getunbundler(version, fh, alg, extras=None): return _packermap[version][1](fh, alg, extras=extras) @@ -1419,11 +1429,7 @@ packer = getbundler(version, repo, filematcher=match, ellipses=True, shallow=depth is not None, - ellipsisroots=ellipsisroots) - # Give the packer the list of nodes which should not be - # ellipsis nodes. We store this rather than the set of nodes - # that should be an ellipsis because for very large histories - # we expect this to be significantly smaller. - packer._full_nodes = relevant_nodes + ellipsisroots=ellipsisroots, + fullnodes=relevant_nodes) return packer.generate(common, visitnodes, False, source)