changeset 19334:95a49112e7ab

bundle: move file chunk generation to it's own function Moves the file chunk generation part of bundle creation to it's own function. This allows extensions to customize the filelog part of bundle generation.
author Durham Goode <durham@fb.com>
date Tue, 25 Jun 2013 13:23:12 -0700
parents 0cfb62e043e8
children 77440de177f7
files mercurial/changegroup.py
diffstat 1 files changed, 27 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/changegroup.py	Tue Jun 18 13:05:16 2013 -0700
+++ b/mercurial/changegroup.py	Tue Jun 25 13:23:12 2013 -0700
@@ -354,14 +354,8 @@
         progress(msgbundling, None)
 
         mfs.clear()
-        total = len(changedfiles)
-        # for progress output
-        msgfiles = _('files')
-        for i, fname in enumerate(sorted(changedfiles)):
-            filerevlog = repo.file(fname)
-            if not filerevlog:
-                raise util.Abort(_("empty or missing revlog for %s") % fname)
 
+        def linknodes(filerevlog, fname):
             if fastpathlinkrev:
                 ln, llr = filerevlog.node, filerevlog.linkrev
                 needed = set(cl.rev(x) for x in clnodes)
@@ -371,8 +365,33 @@
                         if linkrev in needed:
                             yield filerevlog.node(r), cl.node(linkrev)
                 fnodes[fname] = dict(genfilenodes())
+            return fnodes.get(fname, {})
 
-            linkrevnodes = fnodes.pop(fname, {})
+        for chunk in self.generatefiles(changedfiles, linknodes, commonrevs,
+                                        source):
+            yield chunk
+
+        yield self.close()
+        progress(msgbundling, None)
+
+        if clnodes:
+            repo.hook('outgoing', node=hex(clnodes[0]), source=source)
+
+    def generatefiles(self, changedfiles, linknodes, commonrevs, source):
+        repo = self._repo
+        progress = self._progress
+        reorder = self._reorder
+        msgbundling = _('bundling')
+
+        total = len(changedfiles)
+        # for progress output
+        msgfiles = _('files')
+        for i, fname in enumerate(sorted(changedfiles)):
+            filerevlog = repo.file(fname)
+            if not filerevlog:
+                raise util.Abort(_("empty or missing revlog for %s") % fname)
+
+            linkrevnodes = linknodes(filerevlog, fname)
             # Lookup for filenodes, we collected the linkrev nodes above in the
             # fastpath case and with lookupmf in the slowpath case.
             def lookupfilelog(x):
@@ -386,11 +405,6 @@
                 for chunk in self.group(filenodes, filerevlog, lookupfilelog,
                                         reorder=reorder):
                     yield chunk
-        yield self.close()
-        progress(msgbundling, None)
-
-        if clnodes:
-            repo.hook('outgoing', node=hex(clnodes[0]), source=source)
 
     def revchunk(self, revlog, rev, prev, linknode):
         node = revlog.node(rev)