<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>