archival: abort if compression method is unavailable stable
authorManuel Jacob <me@manueljacob.de>
Wed, 08 Jul 2020 08:57:21 +0200
branchstable
changeset 45048 2c0043977b6d
parent 45047 40120de810ba
child 45083 3a6ec080b521
child 45092 e699cebc3ae9
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.
mercurial/archival.py
tests/hghave.py
tests/test-archive.t
--- 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]