--- a/mercurial/exchange.py Sun Mar 05 22:22:32 2017 -0500
+++ b/mercurial/exchange.py Sat Mar 18 12:27:52 2017 -0400
@@ -44,6 +44,9 @@
'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 @@
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 @@
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.
--- a/tests/test-bundle-type.t Sun Mar 05 22:22:32 2017 -0500
+++ b/tests/test-bundle-type.t Sat Mar 18 12:27:52 2017 -0400
@@ -33,6 +33,23 @@
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 @@
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