diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py --- a/mercurial/changegroup.py +++ b/mercurial/changegroup.py @@ -522,7 +522,7 @@ class cgpacker(object): def __init__(self, repo, filematcher, version, allowreorder, useprevdelta, builddeltaheader, manifestsend, - sendtreemanifests, bundlecaps=None): + sendtreemanifests, bundlecaps=None, shallow=False): """Given a source repo, construct a bundler. filematcher is a matcher that matches on files to include in the @@ -546,6 +546,9 @@ capabilities which can be used to build the bundle. While bundlecaps is unused in core Mercurial, extensions rely on this feature to communicate capabilities to customize the changegroup packer. + + shallow indicates whether shallow data might be sent. The packer may + need to pack file contents not introduced by the changes being packed. """ assert filematcher self._filematcher = filematcher @@ -560,6 +563,7 @@ if bundlecaps is None: bundlecaps = set() self._bundlecaps = bundlecaps + self._isshallow = shallow # experimental config: bundle.reorder reorder = repo.ui.config('bundle', 'reorder') @@ -736,7 +740,7 @@ mfrevlog.rev(n)) # We can't trust the changed files list in the changeset if the # client requested a shallow clone. - if self._is_shallow: + if self._isshallow: changedfiles.update(mfl[c[0]].read().keys()) else: changedfiles.update(c[3]) @@ -786,7 +790,7 @@ if ellipsesmode: mfdicts = None - if self._is_shallow: + if self._isshallow: mfdicts = [(self._repo.manifestlog[n].read(), lr) for (n, lr) in mfs.iteritems()] @@ -892,7 +896,7 @@ def generatefiles(self, changedfiles, linknodes, commonrevs, source): changedfiles = list(filter(self._filematcher, changedfiles)) - if getattr(self, '_is_shallow', False): + if self._isshallow: # See comment in generate() for why this sadness is a thing. mfdicts = self._mfdicts del self._mfdicts @@ -1171,7 +1175,7 @@ deltachunks=(diffheader, data), ) -def _makecg1packer(repo, filematcher, bundlecaps): +def _makecg1packer(repo, filematcher, bundlecaps, shallow=False): builddeltaheader = lambda d: _CHANGEGROUPV1_DELTA_HEADER.pack( d.node, d.p1node, d.p2node, d.linknode) @@ -1181,9 +1185,10 @@ builddeltaheader=builddeltaheader, manifestsend=b'', sendtreemanifests=False, - bundlecaps=bundlecaps) + bundlecaps=bundlecaps, + shallow=shallow) -def _makecg2packer(repo, filematcher, bundlecaps): +def _makecg2packer(repo, filematcher, bundlecaps, shallow=False): builddeltaheader = lambda d: _CHANGEGROUPV2_DELTA_HEADER.pack( d.node, d.p1node, d.p2node, d.basenode, d.linknode) @@ -1196,9 +1201,10 @@ builddeltaheader=builddeltaheader, manifestsend=b'', sendtreemanifests=False, - bundlecaps=bundlecaps) + bundlecaps=bundlecaps, + shallow=shallow) -def _makecg3packer(repo, filematcher, bundlecaps): +def _makecg3packer(repo, filematcher, bundlecaps, shallow=False): builddeltaheader = lambda d: _CHANGEGROUPV3_DELTA_HEADER.pack( d.node, d.p1node, d.p2node, d.basenode, d.linknode, d.flags) @@ -1208,7 +1214,8 @@ builddeltaheader=builddeltaheader, manifestsend=closechunk(), sendtreemanifests=True, - bundlecaps=bundlecaps) + bundlecaps=bundlecaps, + shallow=shallow) _packermap = {'01': (_makecg1packer, cg1unpacker), # cg2 adds support for exchanging generaldelta @@ -1268,7 +1275,8 @@ assert versions return min(versions) -def getbundler(version, repo, bundlecaps=None, filematcher=None): +def getbundler(version, repo, bundlecaps=None, filematcher=None, + shallow=False): assert version in supportedoutgoingversions(repo) if filematcher is None: @@ -1284,7 +1292,7 @@ filematcher) fn = _packermap[version][0] - return fn(repo, filematcher, bundlecaps) + return fn(repo, filematcher, bundlecaps, shallow=shallow) def getunbundler(version, fh, alg, extras=None): return _packermap[version][1](fh, alg, extras=extras) @@ -1379,7 +1387,8 @@ # set, we know we have an ellipsis node and we should defer # sending that node's data. We override close() to detect # pending ellipsis nodes and flush them. - packer = getbundler(version, repo, filematcher=match) + packer = getbundler(version, repo, filematcher=match, + shallow=depth is not None) # 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 @@ -1395,8 +1404,5 @@ # during changelog stage and then left unmodified. packer._clnode_to_rev = {} packer._changelog_done = False - # If true, informs the packer that it is serving shallow content and might - # need to pack file contents not introduced by the changes being packed. - packer._is_shallow = depth is not None return packer.generate(common, visitnodes, False, source)