diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- a/mercurial/cmdutil.py +++ b/mercurial/cmdutil.py @@ -10,7 +10,7 @@ from i18n import _ import os, sys, errno, re, tempfile, cStringIO, shutil import util, scmutil, templater, patch, error, templatekw, revlog, copies import match as matchmod -import repair, graphmod, revset, phases, obsolete, pathutil, changegroup +import repair, graphmod, revset, phases, obsolete, pathutil import changelog import bookmarks import encoding @@ -3331,19 +3331,50 @@ class dirstateguard(object): raise util.Abort(msg) self._abort() -def parsebundletype(bundletype): +_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] """ - btypes = {'none': 'HG10UN', - 'bzip2': 'HG10BZ', - 'gzip': 'HG10GZ', - 'bundle2': 'HG20'} - bundletype = btypes.get(bundletype) - if bundletype not in changegroup.bundletypes: + 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 util.Abort(_('unknown bundle type specified with --type')) - return bundletype - + + if comp is None: + comp = 'BZ' + else: + try: + comp = _bundlecompspecs[comp] + except KeyError: + raise util.Abort(_('unknown bundle type specified with --type')) + + if version is None: + version = '01' + else: + try: + version = _bundleversionspecs[version] + except KeyError: + raise util.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 @@ -1219,9 +1219,11 @@ def bundle(ui, repo, fname, dest=None, * parameters. To create a bundle containing all changesets, use -a/--all (or --base null). - You can change compression method with the -t/--type option. - The available compression methods are: none, bzip2, and - gzip (by default, bundles are compressed using bzip2). + You can change bundle format with the -t/--type option. You can + specify a compression, a bundle version or both using a dash + (comp-version). The available compression methods are: none, bzip2, + and gzip (by default, bundles are compressed using bzip2). The + available format are: v1, v2 (default to v1). The bundle file can then be transferred using conventional means and applied to another repository with the unbundle or pull @@ -1238,7 +1240,7 @@ def bundle(ui, repo, fname, dest=None, * revs = scmutil.revrange(repo, opts['rev']) bundletype = opts.get('type', 'bzip2').lower() - bundletype = cmdutil.parsebundletype(bundletype) + cgversion, bcompression = cmdutil.parsebundletype(repo, bundletype) if opts.get('all'): base = ['null'] @@ -1253,7 +1255,8 @@ def bundle(ui, repo, fname, dest=None, * common = [repo.lookup(rev) for rev in base] heads = revs and map(repo.lookup, revs) or revs cg = changegroup.getchangegroup(repo, 'bundle', heads=heads, - common=common, bundlecaps=bundlecaps) + common=common, bundlecaps=bundlecaps, + version=cgversion) outgoing = None else: dest = ui.expandpath(dest or 'default-push', dest or 'default') @@ -1266,12 +1269,22 @@ def bundle(ui, repo, fname, dest=None, * force=opts.get('force'), portable=True) cg = changegroup.getlocalchangegroup(repo, 'bundle', outgoing, - bundlecaps) + bundlecaps, version=cgversion) if not cg: scmutil.nochangesfound(ui, repo, outgoing and outgoing.excluded) return 1 - changegroup.writebundle(ui, cg, fname, bundletype) + if cgversion == '01': #bundle1 + if bcompression is None: + bcompression = 'UN' + bversion = 'HG10' + bcompression + bcompression = None + else: + assert cgversion == '02' + bversion = 'HG20' + + + changegroup.writebundle(ui, cg, fname, bversion, compression=bcompression) @command('cat', [('o', 'output', '', diff --git a/tests/test-bundle-type.t b/tests/test-bundle-type.t --- a/tests/test-bundle-type.t +++ b/tests/test-bundle-type.t @@ -29,7 +29,7 @@ bundle w/o type option test bundle types - $ for t in "None" "bzip2" "gzip"; do + $ for t in "None" "bzip2" "gzip" "none-v2" "v2" "v1" "gzip-v1"; do > echo % test bundle type $t > hg init t$t > cd t1 @@ -58,6 +58,34 @@ test bundle types HG10GZ c35a0f9217e65d1fdb90c936ffa7dbe679f83ddf + % test bundle type none-v2 + searching for changes + 1 changesets found + HG20\x00\x00 (esc) + Stream params: {} + changegroup -- "{'version': '01'}" + c35a0f9217e65d1fdb90c936ffa7dbe679f83ddf + + % test bundle type v2 + searching for changes + 1 changesets found + HG20\x00\x00 (esc) + Stream params: {'Compression': 'BZ'} + changegroup -- "{'version': '01'}" + c35a0f9217e65d1fdb90c936ffa7dbe679f83ddf + + % test bundle type v1 + searching for changes + 1 changesets found + HG10BZ + c35a0f9217e65d1fdb90c936ffa7dbe679f83ddf + + % test bundle type gzip-v1 + searching for changes + 1 changesets found + HG10GZ + c35a0f9217e65d1fdb90c936ffa7dbe679f83ddf + test garbage file