[PATCH 1 of 8] bundle2: extract stream//unpack logic in an unpackermixin

pierre-yves.david at ens-lyon.org pierre-yves.david at ens-lyon.org
Sat Apr 12 17:08:40 CDT 2014


# HG changeset patch
# User Pierre-Yves David <pierre-yves.david at fb.com>
# Date 1397243994 14400
#      Fri Apr 11 15:19:54 2014 -0400
# Node ID 24f7528f409dff53d1372df5015e59d331983311
# Parent  3d38ebb586fe5a3bb74c68c2464f948ede39e63d
bundle2: extract stream//unpack logic in an unpackermixin

The coming `unbundlepart` will need the same kind of method than `unbundle20`
for unpacking data from the stream. We extract them into a mixin class before
the creation of `unbundlepart`.

diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
--- a/mercurial/bundle2.py
+++ b/mercurial/bundle2.py
@@ -371,35 +371,42 @@ class bundle20(object):
                 value = urllib.quote(value)
                 par = '%s=%s' % (par, value)
             blocks.append(par)
         return ' '.join(blocks)
 
-class unbundle20(object):
-    """interpret a bundle2 stream
+class unpackermixing(object):
+    """A mixing to extract bytes and struct data from a stream"""
 
-    (this will eventually yield parts)"""
-
-    def __init__(self, ui, fp):
-        self.ui = ui
+    def __init__(self, fp):
         self._fp = fp
-        header = self._readexact(4)
-        magic, version = header[0:2], header[2:4]
-        if magic != 'HG':
-            raise util.Abort(_('not a Mercurial bundle'))
-        if version != '20':
-            raise util.Abort(_('unknown bundle version %s') % version)
-        self.ui.debug('start processing of %s stream\n' % header)
 
     def _unpack(self, format):
         """unpack this struct format from the stream"""
         data = self._readexact(struct.calcsize(format))
         return _unpack(format, data)
 
     def _readexact(self, size):
         """read exactly <size> bytes from the stream"""
         return changegroup.readexactly(self._fp, size)
 
+
+class unbundle20(unpackermixing):
+    """interpret a bundle2 stream
+
+    (this will eventually yield parts)"""
+
+    def __init__(self, ui, fp):
+        self.ui = ui
+        super(unbundle20, self).__init__(fp)
+        header = self._readexact(4)
+        magic, version = header[0:2], header[2:4]
+        if magic != 'HG':
+            raise util.Abort(_('not a Mercurial bundle'))
+        if version != '20':
+            raise util.Abort(_('unknown bundle version %s') % version)
+        self.ui.debug('start processing of %s stream\n' % header)
+
     @util.propertycache
     def params(self):
         """dictionnary of stream level parameters"""
         self.ui.debug('reading bundle2 stream parameters\n')
         params = {}


More information about the Mercurial-devel mailing list