# HG changeset patch # User Pierre-Yves David # Date 2015-10-02 02:16:00 # Node ID 15ce78517d4be9db88914209ea98e62d22ad32f3 # Parent 52642e12e7b3cf1e82f0f8dea4c092e9b7bdb2e4 bundle: extend the format of --type to support version and compression We had some basic undocumented support for uncompressed bundle2 support. We now have an official extensible syntax to specify both format type and compression (eg: bzip2-v2). In practice, this changeset introduce the 'v1' and 'v2' identifier to make it possible to combine format and compression. The default format is still 'v1'. We'll care about picking 'v1' or 'v2' in regard with general delta in the next changesets. 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