changeset 21065:f9a9a6d63e89

bundle2: prepare readbundle to return more that one type of bundle We first read 4 bytes to get the `HG10` bytes then we read the compression scheme if this is `HG10`. This prepares the code for the arrival of `HG20` handling.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Tue, 15 Apr 2014 13:42:45 -0400
parents 4d9d490d7bbe
children 5ecfe76d0d96
files mercurial/exchange.py
diffstat 1 files changed, 10 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/exchange.py	Mon Apr 14 15:45:30 2014 -0400
+++ b/mercurial/exchange.py	Tue Apr 15 13:42:45 2014 -0400
@@ -12,23 +12,28 @@
 import discovery, phases, obsolete, bookmarks, bundle2
 
 def readbundle(ui, fh, fname, vfs=None):
-    header = changegroup.readexactly(fh, 6)
+    header = changegroup.readexactly(fh, 4)
 
+    alg = None
     if not fname:
         fname = "stream"
         if not header.startswith('HG') and header.startswith('\0'):
             fh = changegroup.headerlessfixup(fh, header)
-            header = "HG10UN"
+            header = "HG10"
+            alg = 'UN'
     elif vfs:
         fname = vfs.join(fname)
 
-    magic, version, alg = header[0:2], header[2:4], header[4:6]
+    magic, version = header[0:2], header[2:4]
 
     if magic != 'HG':
         raise util.Abort(_('%s: not a Mercurial bundle') % fname)
-    if version != '10':
+    if version == '10':
+        if alg is None:
+            alg = changegroup.readexactly(fh, 2)
+        return changegroup.unbundle10(fh, alg)
+    else:
         raise util.Abort(_('%s: unknown bundle version %s') % (fname, version))
-    return changegroup.unbundle10(fh, alg)
 
 
 class pushoperation(object):