<div dir="ltr">Hi Durham, are any details on your shallow repo extension available somewhere?<div><br></div><div>Thanks,</div><div>--peter</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, May 31, 2013 at 7:19 PM, Durham Goode <span dir="ltr"><<a href="mailto:durham@fb.com" target="_blank">durham@fb.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"># HG changeset patch<br>
# User Durham Goode <<a href="mailto:durham@fb.com">durham@fb.com</a>><br>
# Date 1369961473 25200<br>
#      Thu May 30 17:51:13 2013 -0700<br>
# Node ID 036972b09c16295c000847ba359193858e7b3a4d<br>
# Parent  66c552d6910908070552d1a1c41d729932b8b111<br>
bundle: refactor changegroup prune to be its own function<br>
<br>
Moving the prune function to be a non-nested function allows extensions to<br>
control which revisions are allowed in the changegroup. For example, in my<br>
shallow repo extension I want to prevent filelogs from being added to the<br>
bundle.<br>
<br>
This also allows an extension to use a filelog implementation that doesn't<br>
have revlog.linkrev implemented.<br>
<br>
diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py<br>
--- a/mercurial/changegroup.py<br>
+++ b/mercurial/changegroup.py<br>
@@ -296,6 +296,11 @@<br>
<br>
         yield self.close()<br>
<br>
+    # filter any nodes that claim to be part of the known set<br>
+    def prune(self, revlog, missing, commonrevs, source):<br>
+        rr, rl = revlog.rev, revlog.linkrev<br>
+        return [n for n in missing if rl(rr(n)) not in commonrevs]<br>
+<br>
     def generate(self, commonrevs, clnodes, fastpathlinkrev, source):<br>
         '''yield a sequence of changegroup chunks (strings)'''<br>
         repo = self._repo<br>
@@ -311,11 +316,6 @@<br>
         fnodes = {} # needed file nodes<br>
         changedfiles = set()<br>
<br>
-        # filter any nodes that claim to be part of the known set<br>
-        def prune(revlog, missing):<br>
-            rr, rl = revlog.rev, revlog.linkrev<br>
-            return [n for n in missing if rl(rr(n)) not in commonrevs]<br>
-<br>
         # Callback for the changelog, used to collect changed files and manifest<br>
         # nodes.<br>
         # Returns the linkrev node (identity in the changelog case).<br>
@@ -347,7 +347,7 @@<br>
<br>
         for f in changedfiles:<br>
             fnodes[f] = {}<br>
-        mfnodes = prune(mf, mfs)<br>
+        mfnodes = self.prune(mf, mfs, commonrevs, source)<br>
         for chunk in self.group(mfnodes, mf, lookupmf, units=_('manifests'),<br>
                                 reorder=reorder):<br>
             yield chunk<br>
@@ -377,7 +377,7 @@<br>
             def lookupfilelog(x):<br>
                 return linkrevnodes[x]<br>
<br>
-            filenodes = prune(filerevlog, linkrevnodes)<br>
+            filenodes = self.prune(filerevlog, linkrevnodes, commonrevs, source)<br>
             if filenodes:<br>
                 progress(msgbundling, i + 1, item=fname, unit=msgfiles,<br>
                          total=total)<br>
_______________________________________________<br>
Mercurial-devel mailing list<br>
<a href="mailto:Mercurial-devel@selenic.com">Mercurial-devel@selenic.com</a><br>
<a href="http://selenic.com/mailman/listinfo/mercurial-devel" target="_blank">http://selenic.com/mailman/listinfo/mercurial-devel</a><br>
</blockquote></div><br></div>