Mercurial > public > mercurial-scm > hg-stable
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)