changeset 24648:5cac3accdaa1

unbundle20: allow generic dispatch between unbundlers We now take full advantage of the 'getunbundler' function by using a '{version -> unbundler-class}' mapping. This map currently contains a single entry but will make it easy to support more versions from an extension/the future. At some point, this map will probably contain bundler-class information too, in the same fashion the packer map does. However, this is not critically required right now so it will happen by itself when needed. The main target is to allow HG2Y support in an extension to ease transition of companies using the experimental protocol in production (yeah...) But I've no doubt this will be useful when playing with a future HG21.
author Pierre-Yves David <pierre-yves.david@fb.com>
date Mon, 06 Apr 2015 17:23:11 -0700
parents fb446c57f8f9
children 2d15c59a001b
files mercurial/bundle2.py
diffstat 1 files changed, 9 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/bundle2.py	Tue Apr 07 15:18:52 2015 -0700
+++ b/mercurial/bundle2.py	Mon Apr 06 17:23:11 2015 -0700
@@ -525,12 +525,13 @@
     """return a valid unbundler object for a given header"""
     if header is None:
         header = changegroup.readexactly(fp, 4)
-        magic, version = header[0:2], header[2:4]
-        if magic != 'HG':
-            raise util.Abort(_('not a Mercurial bundle'))
-        if version != '2Y':
-            raise util.Abort(_('unknown bundle version %s') % version)
-    unbundler = unbundle20(ui, fp)
+    magic, version = header[0:2], header[2:4]
+    if magic != 'HG':
+        raise util.Abort(_('not a Mercurial bundle'))
+    unbundlerclass = formatmap.get(version)
+    if unbundlerclass is None:
+        raise util.Abort(_('unknown bundle version %s') % version)
+    unbundler = unbundlerclass(ui, fp)
     ui.debug('start processing of %s stream\n' % header)
     return unbundler
 
@@ -615,6 +616,8 @@
     def compressed(self):
         return False
 
+formatmap = {'2Y': unbundle20}
+
 class bundlepart(object):
     """A bundle2 part contains application level payload