# HG changeset patch # User Durham Goode # Date 2013-05-31 00:51:13 # Node ID 6ea1f858efd9e58a8518630b948c2810e5b844ce # Parent ec367f203cb5a0427b89f76c8da37e4d2062b614 bundle: refactor changegroup prune to be its own function Moving the prune function to be a non-nested function allows extensions to control which revisions are allowed in the changegroup. For example, in my shallow repo extension I want to prevent filelogs from being added to the bundle. This also allows an extension to use a filelog implementation that doesn't have revlog.linkrev implemented. diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py --- a/mercurial/changegroup.py +++ b/mercurial/changegroup.py @@ -296,6 +296,11 @@ class bundle10(object): yield self.close() + # filter any nodes that claim to be part of the known set + def prune(self, revlog, missing, commonrevs, source): + rr, rl = revlog.rev, revlog.linkrev + return [n for n in missing if rl(rr(n)) not in commonrevs] + def generate(self, commonrevs, clnodes, fastpathlinkrev, source): '''yield a sequence of changegroup chunks (strings)''' repo = self._repo @@ -311,11 +316,6 @@ class bundle10(object): fnodes = {} # needed file nodes changedfiles = set() - # filter any nodes that claim to be part of the known set - def prune(revlog, missing): - rr, rl = revlog.rev, revlog.linkrev - return [n for n in missing if rl(rr(n)) not in commonrevs] - # Callback for the changelog, used to collect changed files and manifest # nodes. # Returns the linkrev node (identity in the changelog case). @@ -347,7 +347,7 @@ class bundle10(object): for f in changedfiles: fnodes[f] = {} - mfnodes = prune(mf, mfs) + mfnodes = self.prune(mf, mfs, commonrevs, source) for chunk in self.group(mfnodes, mf, lookupmf, units=_('manifests'), reorder=reorder): yield chunk @@ -377,7 +377,7 @@ class bundle10(object): def lookupfilelog(x): return linkrevnodes[x] - filenodes = prune(filerevlog, linkrevnodes) + filenodes = self.prune(filerevlog, linkrevnodes, commonrevs, source) if filenodes: progress(msgbundling, i + 1, item=fname, unit=msgfiles, total=total)