archival: abort if compression method is unavailable
`tarfile.CompressionError` is documented to be the "exception for unavailable
compression methods".
Also, make tests conditional on whether the lzma module is available or not.
--- a/mercurial/archival.py Wed Jul 08 08:25:30 2020 +0200
+++ b/mercurial/archival.py Wed Jul 08 08:57:21 2020 +0200
@@ -189,7 +189,12 @@
name, pycompat.sysstr(mode), gzfileobj
)
else:
- return tarfile.open(name, pycompat.sysstr(mode + kind), fileobj)
+ try:
+ return tarfile.open(
+ name, pycompat.sysstr(mode + kind), fileobj
+ )
+ except tarfile.CompressionError as e:
+ raise error.Abort(pycompat.bytestr(e))
if isinstance(dest, bytes):
self.z = taropen(b'w:', name=dest)
--- a/tests/hghave.py Wed Jul 08 08:25:30 2020 +0200
+++ b/tests/hghave.py Wed Jul 08 08:57:21 2020 +0200
@@ -1074,3 +1074,14 @@
return matchoutput(
'`rustup which --toolchain nightly rustfmt` --version', b'rustfmt'
)
+
+
+@check("lzma", "python lzma module")
+def has_lzma():
+ try:
+ import _lzma
+
+ _lzma.FORMAT_XZ
+ return True
+ except ImportError:
+ return False
--- a/tests/test-archive.t Wed Jul 08 08:25:30 2020 +0200
+++ b/tests/test-archive.t Wed Jul 08 08:57:21 2020 +0200
@@ -576,12 +576,18 @@
test xz support only available in Python 3.4
-#if py3
+#if lzma
$ hg archive ../archive.txz
$ which xz >/dev/null && xz -l ../archive.txz | head -n1 || true
Strms Blocks Compressed Uncompressed Ratio Check Filename (xz !)
$ rm -f ../archive.txz
-#else
+#endif
+#if py3 no-lzma
+ $ hg archive ../archive.txz
+ abort: lzma module is not available
+ [255]
+#endif
+#if no-py3
$ hg archive ../archive.txz
abort: xz compression is only available in Python 3
[255]