# HG changeset patch # User Gregory Szorc # Date 2015-10-13 18:43:21 # Node ID 92d67e5729b99d721ba7e00d291afe18075f4965 # Parent 7afaf2566e25eaa5dfcac7ebf9fedf2fe6b393ae 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. diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- a/mercurial/cmdutil.py +++ b/mercurial/cmdutil.py @@ -3366,56 +3366,3 @@ class dirstateguard(object): % 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 diff --git a/mercurial/commands.py b/mercurial/commands.py --- a/mercurial/commands.py +++ b/mercurial/commands.py @@ -1242,7 +1242,7 @@ def bundle(ui, repo, fname, dest=None, * 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'] diff --git a/mercurial/exchange.py b/mercurial/exchange.py --- a/mercurial/exchange.py +++ b/mercurial/exchange.py @@ -15,6 +15,59 @@ import streamclone 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)