bundle: move chunk parsing into unbundle class
authorMatt Mackall <mpm@selenic.com>
Sun, 19 Sep 2010 13:12:45 -0500
changeset 12336 9d234f7d8a77
parent 12335 e21fe9c5fb25
child 12337 6a6149487817
bundle: move chunk parsing into unbundle class
mercurial/changegroup.py
mercurial/revlog.py
--- a/mercurial/changegroup.py	Sun Sep 19 12:51:54 2010 -0500
+++ b/mercurial/changegroup.py	Sun Sep 19 13:12:45 2010 -0500
@@ -163,6 +163,15 @@
                              % (len(d), l))
         return d
 
+    def parsechunk(self):
+        l = self.chunklength()
+        if not l:
+            return {}
+        h = self.read(80)
+        node, p1, p2, cs = struct.unpack("20s20s20s20s", h)
+        data = self.read(l - 80)
+        return dict(node=node, p1=p1, p2=p2, cs=cs, data=data)
+
 class headerlessfixup(object):
     def __init__(self, fh, h):
         self._h = h
--- a/mercurial/revlog.py	Sun Sep 19 12:51:54 2010 -0500
+++ b/mercurial/revlog.py	Sun Sep 19 13:12:45 2010 -0500
@@ -1302,18 +1302,21 @@
             # loop through our set of deltas
             chain = None
             while 1:
-                chunk = bundle.chunk()
-                if not chunk:
+                chunkdata = bundle.parsechunk()
+                if not chunkdata:
                     break
-                node, p1, p2, cs = struct.unpack("20s20s20s20s", chunk[:80])
+                node = chunkdata['node']
+                p1 = chunkdata['p1']
+                p2 = chunkdata['p2']
+                cs = chunkdata['cs']
+                delta = chunkdata['data']
+
                 link = linkmapper(cs)
                 if (node in self.nodemap and
                     (not self.flags(self.rev(node)) & REVIDX_PUNCHED_FLAG)):
                     # this can happen if two branches make the same change
                     chain = node
                     continue
-                delta = buffer(chunk, 80)
-                del chunk
 
                 for p in (p1, p2):
                     if not p in self.nodemap: