Fixed python lzma handling.
This commit is contained in:
parent
20813f3520
commit
ba8d14c4b5
|
@ -235,6 +235,8 @@ ArchivePrograms = {
|
|||
},
|
||||
'xz': {
|
||||
None: ('xz',),
|
||||
'extract': py_lzma,
|
||||
'create': py_lzma,
|
||||
},
|
||||
'zoo': {
|
||||
None: ('zoo',),
|
||||
|
|
|
@ -19,14 +19,14 @@ import lzma
|
|||
|
||||
READ_SIZE_BYTES = 1024*1024
|
||||
|
||||
def extract_lzma(archive, compression, cmd, **kwargs):
|
||||
"""Extract a LZMA archive with the lzma Python module."""
|
||||
def _extract(archive, compression, cmd, format, **kwargs):
|
||||
"""Extract an LZMA or XZ archive with the lzma Python module."""
|
||||
verbose = kwargs['verbose']
|
||||
outdir = kwargs['outdir']
|
||||
if verbose:
|
||||
util.log_info('extracting %s...' % archive)
|
||||
targetname = util.get_single_outfile(outdir, archive)
|
||||
lzmafile = lzma.LZMAFile(archive)
|
||||
lzmafile = lzma.LZMAFile(archive, format=format)
|
||||
try:
|
||||
with open(targetname, 'wb') as targetfile:
|
||||
data = lzmafile.read(READ_SIZE_BYTES)
|
||||
|
@ -39,15 +39,23 @@ def extract_lzma(archive, compression, cmd, **kwargs):
|
|||
util.log_info('... extracted to %s' % targetname)
|
||||
return None
|
||||
|
||||
def extract_lzma(archive, compression, cmd, **kwargs):
|
||||
"""Extract an LZMA archive with the lzma Python module."""
|
||||
return _extract(archive, compression, cmd, lzma.FORMAT_ALONE, **kwargs)
|
||||
|
||||
def create_lzma(archive, compression, cmd, *args, **kwargs):
|
||||
"""Create a LZMA archive with the lzma Python module."""
|
||||
def extract_xz(archive, compression, cmd, **kwargs):
|
||||
"""Extract an XZ archive with the lzma Python module."""
|
||||
return _extract(archive, compression, cmd, lzma.FORMAT_XZ, **kwargs)
|
||||
|
||||
|
||||
def _create(archive, compression, cmd, format, *args, **kwargs):
|
||||
"""Create an LZMA or XZ archive with the lzma Python module."""
|
||||
verbose = kwargs['verbose']
|
||||
if verbose:
|
||||
util.log_info('creating %s...' % archive)
|
||||
if len(args) > 1:
|
||||
util.log_error('multi-file compression not supported in Python lzma')
|
||||
lzmafile = lzma.LZMAFile(archive, 'wb')
|
||||
lzmafile = lzma.LZMAFile(archive, 'wb', format)
|
||||
try:
|
||||
filename = args[0]
|
||||
with open(filename) as srcfile:
|
||||
|
@ -60,3 +68,11 @@ def create_lzma(archive, compression, cmd, *args, **kwargs):
|
|||
finally:
|
||||
lzmafile.close()
|
||||
return None
|
||||
|
||||
def create_lzma(archive, compression, cmd, *args, **kwargs):
|
||||
"""Create an LZMA archive with the lzma Python module."""
|
||||
return _create(archive, compression, cmd, lzma.FORMAT_ALONE, *args, **kwargs)
|
||||
|
||||
def create_xz(archive, compression, cmd, *args, **kwargs):
|
||||
"""Create an XZ archive with the lzma Python module."""
|
||||
return _create(archive, compression, cmd, lzma.FORMAT_XZ, *args, **kwargs)
|
||||
|
|
|
@ -163,6 +163,8 @@ class ArchiveTest (unittest.TestCase):
|
|||
program = 'gzip'
|
||||
elif self.program == 'py_bz2':
|
||||
program = 'bzip2'
|
||||
elif self.program == 'py_lzma':
|
||||
program = 'xz'
|
||||
elif self.program == 'zip':
|
||||
program = 'unzip'
|
||||
elif self.program in ('rzip', 'shorten'):
|
||||
|
|
|
@ -0,0 +1,37 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Copyright (C) 2013 Bastian Kleineidam
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify
|
||||
# it under the terms of the GNU General Public License as published by
|
||||
# the Free Software Foundation, either version 3 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful,
|
||||
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
from . import ArchiveTest, Content
|
||||
from .. import needs_program, needs_module
|
||||
|
||||
class TestPylzma (ArchiveTest):
|
||||
|
||||
program = 'py_lzma'
|
||||
|
||||
@needs_program('xz')
|
||||
@needs_module('lzma')
|
||||
def test_py_lzma (self):
|
||||
self.archive_extract('t.txt.lzma', check=Content.Singlefile)
|
||||
self.archive_extract('t.txt.xz', check=Content.Singlefile)
|
||||
# xz is used to test the created archive
|
||||
self.archive_create('t.txt.lzma', check=Content.Singlefile)
|
||||
self.archive_create('t.txt.xz', check=Content.Singlefile)
|
||||
|
||||
@needs_program('file')
|
||||
@needs_module('lzma')
|
||||
def test_py_lzma_file (self):
|
||||
self.archive_extract('t.txt.lzma.foo', check=Content.Singlefile)
|
||||
self.archive_extract('t.txt.xz.foo', check=Content.Singlefile)
|
||||
|
Loading…
Reference in New Issue