diff --git a/hgdemandimport/__init__.py b/hgdemandimport/__init__.py --- a/hgdemandimport/__init__.py +++ b/hgdemandimport/__init__.py @@ -56,6 +56,7 @@ IGNORES = { '__builtin__', 'builtins', 'urwid.command_map', # for pudb + 'lzma', } _pypy = '__pypy__' in sys.builtin_module_names diff --git a/mercurial/archival.py b/mercurial/archival.py --- a/mercurial/archival.py +++ b/mercurial/archival.py @@ -189,7 +189,12 @@ class tarit(object): 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) diff --git a/tests/hghave.py b/tests/hghave.py --- a/tests/hghave.py +++ b/tests/hghave.py @@ -1061,3 +1061,14 @@ def has_rustfmt(): 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 diff --git a/tests/test-archive.t b/tests/test-archive.t --- a/tests/test-archive.t +++ b/tests/test-archive.t @@ -576,12 +576,18 @@ old file -- date clamped to 1980 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]