changeset 12041:270fb4d39153

bundle: factor out decompressor
author Matt Mackall <mpm@selenic.com>
date Wed, 25 Aug 2010 15:33:05 -0500
parents 529e712cb1ba
children 210049a8d16e
files mercurial/changegroup.py
diffstat 1 files changed, 19 insertions(+), 11 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/changegroup.py	Wed Aug 25 15:20:25 2010 -0500
+++ b/mercurial/changegroup.py	Wed Aug 25 15:33:05 2010 -0500
@@ -120,27 +120,35 @@
         if cleanup is not None:
             os.unlink(cleanup)
 
-def unbundle(header, fh):
-    if header == 'HG10UN':
+def decompressor(fh, alg):
+    if alg == 'UN':
         return fh
-    elif not header.startswith('HG'):
-        # old client with uncompressed bundle
-        def generator(f):
-            yield header
-            for chunk in f:
-                yield chunk
-    elif header == 'HG10GZ':
+    elif alg == 'GZ':
         def generator(f):
             zd = zlib.decompressobj()
             for chunk in f:
                 yield zd.decompress(chunk)
-    elif header == 'HG10BZ':
+    elif alg == 'BZ':
         def generator(f):
             zd = bz2.BZ2Decompressor()
             zd.decompress("BZ")
             for chunk in util.filechunkiter(f, 4096):
                 yield zd.decompress(chunk)
-    return util.chunkbuffer(generator(fh))
+    else:
+        raise util.Abort("unknown bundle compression '%s'" % alg)
+    return generator(fh)
+
+def unbundle(header, fh):
+    if not header.startswith('HG'):
+        def fixup(f, h):
+            yield h
+            for x in f:
+                yield x
+        fh = fixup(f, h)
+        header = "HG10UN"
+
+    alg = header[4:6]
+    return util.chunkbuffer(decompressor(fh, alg))
 
 def readbundle(fh, fname):
     header = fh.read(6)