diff --git a/mercurial/exchange.py b/mercurial/exchange.py --- a/mercurial/exchange.py +++ b/mercurial/exchange.py @@ -44,6 +44,9 @@ urlreq = util.urlreq 'bundle2': '02', #legacy } +# Compression engines allowed in version 1. THIS SHOULD NEVER CHANGE. +_bundlespecv1compengines = set(['gzip', 'bzip2', 'none']) + def parsebundlespec(repo, spec, strict=True, externalnames=False): """Parse a bundle string specification into parts. @@ -127,8 +130,12 @@ def parsebundlespec(repo, spec, strict=T if spec in util.compengines.supportedbundlenames: compression = spec version = 'v1' + # Generaldelta repos require v2. if 'generaldelta' in repo.requirements: version = 'v2' + # Modern compression engines require v2. + if compression not in _bundlespecv1compengines: + version = 'v2' elif spec in _bundlespeccgversions: if spec == 'packed1': compression = 'none' @@ -139,6 +146,12 @@ def parsebundlespec(repo, spec, strict=T raise error.UnsupportedBundleSpecification( _('%s is not a recognized bundle specification') % spec) + # Bundle version 1 only supports a known set of compression engines. + if version == 'v1' and compression not in _bundlespecv1compengines: + raise error.UnsupportedBundleSpecification( + _('compression engine %s is not supported on v1 bundles') % + compression) + # The specification for packed1 can optionally declare the data formats # required to apply it. If we see this metadata, compare against what the # repo supports and error if the bundle isn't compatible. 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 @@ -33,6 +33,23 @@ bundle w/o type option summary: a $ cd .. +Unknown compression type is rejected + + $ hg init t3 + $ cd t3 + $ hg -q pull ../b1 + $ hg bundle -a -t unknown out.hg + abort: unknown is not a recognized bundle specification + (see 'hg help bundle' for supported values for --type) + [255] + + $ hg bundle -a -t unknown-v2 out.hg + abort: unknown compression is not supported + (see 'hg help bundle' for supported values for --type) + [255] + + $ cd .. + test bundle types $ testbundle() { @@ -164,6 +181,21 @@ Compression level can be adjusted for bu c35a0f9217e65d1fdb90c936ffa7dbe679f83ddf zstd-v2 + +Explicit request for zstd on non-generaldelta repos + + $ hg --config format.usegeneraldelta=false init nogd + $ hg -q -R nogd pull t1 + $ hg -R nogd bundle -a -t zstd nogd-zstd + 1 changesets found + +zstd-v1 always fails + + $ hg -R tzstd bundle -a -t zstd-v1 zstd-v1 + abort: compression engine zstd is not supported on v1 bundles + (see 'hg help bundle' for supported values for --type) + [255] + #else zstd is a valid engine but isn't available