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.
--- a/mercurial/cmdutil.py Tue Mar 24 00:28:28 2015 +0900
+++ b/mercurial/cmdutil.py Tue Oct 13 11:43:21 2015 -0700
@@ -3366,56 +3366,3 @@
% self._suffix)
raise error.Abort(msg)
self._abort()
-
-_bundlecompspecs = {'none': None,
- 'bzip2': 'BZ',
- 'gzip': 'GZ',
- }
-
-_bundleversionspecs = {'v1': '01',
- 'v2': '02',
- 'bundle2': '02', #legacy
- }
-
-def parsebundletype(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
--- a/mercurial/commands.py Tue Mar 24 00:28:28 2015 +0900
+++ b/mercurial/commands.py Tue Oct 13 11:43:21 2015 -0700
@@ -1242,7 +1242,7 @@
revs = scmutil.revrange(repo, opts['rev'])
bundletype = opts.get('type', 'bzip2').lower()
- cgversion, bcompression = cmdutil.parsebundletype(repo, bundletype)
+ cgversion, bcompression = exchange.parsebundlespec(repo, bundletype)
if opts.get('all'):
base = ['null']
--- 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)