[Piglit] [PATCH v4 5/6] framework: add support for lzma via shell calls
Dylan Baker
baker.dylan.c at gmail.com
Wed Jul 1 16:26:23 PDT 2015
On Wed, Jul 01, 2015 at 04:04:57PM -0700, Dylan Baker wrote:
> This requires that there is an xz binary installed, and accessible,
> obviously.
>
> v4: - add this patch
>
> Signed-off-by: Dylan Baker <dylanx.c.baker at intel.com>
> ---
> framework/backends/compression.py | 82 ++++++++++++++++++++++++++++-
> framework/tests/compressed_backend_tests.py | 17 ++++++
> 2 files changed, 98 insertions(+), 1 deletion(-)
>
> diff --git a/framework/backends/compression.py b/framework/backends/compression.py
> index 153dc94..ef97c95 100644
> --- a/framework/backends/compression.py
> +++ b/framework/backends/compression.py
> @@ -43,15 +43,17 @@ they're passing unicode and not bytes.
>
> from __future__ import print_function, absolute_import, division
> import bz2
> +import errno
> import functools
> import gzip
> import os
> +import subprocess
>
> from framework import exceptions
> from framework.core import PIGLIT_CONFIG
>
> -# TODO: in python3 the bz2 module has an open function
>
> +# TODO: in python3 the bz2 module has an open function
> COMPRESSION_SUFFIXES = ['.gz', '.bz2']
>
> DEFAULT = 'bz2'
> @@ -68,6 +70,84 @@ DECOMPRESSORS = {
> 'none': functools.partial(open, mode='r'),
> }
>
> +# TODO: in python3 there is builtin xz support, and doesn't need this madness
> +# If there is an xz binary then try calling out to that
> +try:
> + with open(os.devnull, 'w') as d:
> + subprocess.check_call(['xz'], stderr=d)
> +except subprocess.CalledProcessError as e:
> + if e.returncode == 1:
> + import contextlib
> + try:
> + import cStringIO as StringIO
> + except ImportError:
> + import StringIO
> +
> + @contextlib.contextmanager
> + def _compress_xz(filename):
> + """Emulates an open function in write mode for xz.
> +
> + Python 2.x doesn't support xz, but it's dang useful. This function calls
> + out to the shell and tries to use xz from the environment to get xz
> + compression.
> +
> + This obviously won't work without a working xz binary.
> +
> + This function tries to emulate the default values of the lzma module in
> + python3 as much as possible
> +
> + """
> + if filename.endswith('.xz'):
> + filename = filename[:-2]
> +
> + with open(filename, 'w') as f:
> + yield f
> +
> + try:
> + subprocess.check_call(['xz', '--compress', '-9', filename])
> + except OSError as e:
> + if e.errno == errno.ENOENT:
> + raise exceptions.PiglitFatalError('No xz binary available')
> + raise
> +
> + @contextlib.contextmanager
> + def _decompress_xz(filename):
> + """Eumlates an option function in read mode for xz.
> +
> + See the comment in _compress_xz for more information.
> +
> + This module tries to emulate the lzma module as much as possible
> +
> + """
> + if not filename.endswith('.xz'):
> + filename = '{}.xz'.format(filename)
> +
> + print('decompress: ' + filename)
Oops: debugging print left in there. I've removed this from the branch
> +
> + try:
> + string = subprocess.check_output(
> + ['xz', '--decompress', '--stdout', filename])
> + except OSError as e:
> + if e.errno == errno.ENOENT:
> + raise exceptions.PiglitFatalError('No xz binary available')
> + raise
> +
> + # We need a file-like object, so the contents must be placed in a StringIO
> + # object.
> + io = StringIO.StringIO()
> + io.write(string)
> + io.seek(0)
> +
> + yield io
> +
> + io.close()
> +
> + COMPRESSORS['xz'] = _compress_xz
> + DECOMPRESSORS['xz'] = _decompress_xz
> + COMPRESSION_SUFFIXES += ['.xz']
> +except OSError:
> + pass
> +
>
> def _set_mode():
> """Set the compression mode.
> diff --git a/framework/tests/compressed_backend_tests.py b/framework/tests/compressed_backend_tests.py
> index 7af633d..2353c7b 100644
> --- a/framework/tests/compressed_backend_tests.py
> +++ b/framework/tests/compressed_backend_tests.py
> @@ -218,3 +218,20 @@ def test_decompress_bz2():
> def test_bz2_output():
> """framework.backends: when using bz2 compression a bz2 file is created"""
> nt.eq_(_test_extension(), '.bz2')
> +
> +
> + at utils.no_error
> +def test_compress_xz():
> + """framework.backends.compression: can compress to 'xz'"""
> + _test_compressor('xz')
> +
> +
> +def test_decompress_xz():
> + """framework.backends.compression: can decompress from 'xz'"""
> + _test_decompressor('xz')
> +
> +
> + at _set_compression_mode('xz')
> +def test_xz_output():
> + """framework.backends: when using xz compression a xz file is created"""
> + nt.eq_(_test_extension(), '.xz')
> --
> 2.4.5
>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 473 bytes
Desc: Digital signature
URL: <http://lists.freedesktop.org/archives/piglit/attachments/20150701/000c1e7f/attachment.sig>
More information about the Piglit
mailing list