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