diff mercurial/exchange.py @ 26639:92d67e5729b9

exchange: move bundle specification parsing from cmdutil Clone bundles require a well-defined string to specify the type of bundle that is listed so clients can filter compatible file types. The `hg bundle` command and cmdutil.parsebundletype() already establish the beginnings of a bundle specification format. As part of formalizing this format specification so it can be used by clone bundles, we move the specification parsing bits verbatim to exchange.py, which is a more suitable place than cmdutil.py. A subsequent patch will refactor this code to make it more appropriate as a general API.
author Gregory Szorc <gregory.szorc@gmail.com>
date Tue, 13 Oct 2015 11:43:21 -0700
parents 5a95fe44121d
children b13fdcc4e700
line wrap: on
line diff
--- a/mercurial/exchange.py	Tue Mar 24 00:28:28 2015 +0900
+++ b/mercurial/exchange.py	Tue Oct 13 11:43:21 2015 -0700
@@ -15,6 +15,59 @@
 import tags
 import url as urlmod
 
+_bundlecompspecs = {'none': None,
+                    'bzip2': 'BZ',
+                    'gzip': 'GZ',
+                   }
+
+_bundleversionspecs = {'v1': '01',
+                       'v2': '02',
+                       'bundle2': '02', #legacy
+                      }
+
+def parsebundlespec(repo, spec):
+    """return the internal bundle type to use from a user input
+
+    This is parsing user specified bundle type as accepted in:
+
+        'hg bundle --type TYPE'.
+
+    It accept format in the form [compression][-version]|[version]
+
+    Consensus about extensions of the format for various bundle2 feature
+    is to prefix any feature with "+". eg "+treemanifest" or "gzip+phases"
+    """
+    comp, version = None, None
+
+    if '-' in spec:
+        comp, version = spec.split('-', 1)
+    elif spec in _bundlecompspecs:
+        comp = spec
+    elif spec in _bundleversionspecs:
+        version = spec
+    else:
+        raise error.Abort(_('unknown bundle type specified with --type'))
+
+    if comp is None:
+        comp = 'BZ'
+    else:
+        try:
+            comp = _bundlecompspecs[comp]
+        except KeyError:
+            raise error.Abort(_('unknown bundle type specified with --type'))
+
+    if version is None:
+        version = '01'
+        if 'generaldelta' in repo.requirements:
+            version = '02'
+    else:
+        try:
+            version = _bundleversionspecs[version]
+        except KeyError:
+            raise error.Abort(_('unknown bundle type specified with --type'))
+
+    return version, comp
+
 def readbundle(ui, fh, fname, vfs=None):
     header = changegroup.readexactly(fh, 4)