Support lzma module in Python 3.3

This commit is contained in:
Bastian Kleineidam 2013-02-20 21:16:32 +01:00
parent d0df15254e
commit 39c23ddf37
3 changed files with 73 additions and 2 deletions

View File

@ -1,5 +1,7 @@
0.19 "" (released xx.xx.2013)
* Support the lzma module in Python >= 3.3
0.18 "Skyfall" (released 15.12.2012)

View File

@ -79,6 +79,13 @@ ArchiveMimetypes = {
'audio/flac': 'flac',
}
try:
# use Python 3 lzma module if available
import lzma
py_lzma = ('py_lzma',)
except ImportError:
py_lzma = ()
# List of programs supporting the given archive format and command.
# If command is None, the program supports all commands (list, extract, ...)
# Programs starting with "py_" are Python modules.
@ -208,10 +215,10 @@ ArchivePrograms = {
},
# XXX Python 3.3 has native lzma module - use that after porting to 3.3
'lzma': {
'extract': ('lzma',),
'extract': ('lzma',) + py_lzma,
'list': ('py_echo',),
'test': ('lzma',),
'create': ('lzma',),
'create': ('lzma',) + py_lzma,
},
'rzip': {
'extract': ('rzip',),

View File

@ -0,0 +1,62 @@
# -*- coding: utf-8 -*-
# Copyright (C) 2012 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/>.
"""Archive commands for the lzma Python module."""
from .. import util
import lzma
READ_SIZE_BYTES = 1024*1024
def extract_lzma(archive, compression, cmd, **kwargs):
"""Extract a LZMA 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)
try:
with open(targetname, 'wb') as targetfile
data = lzmafile.read(READ_SIZE_BYTES)
while data:
targetfile.write(data)
data = lzmafile.read(READ_SIZE_BYTES)
finally:
lzmafile.close()
if verbose:
util.log_info('... extracted to %s' % targetname)
return None
def create_lzma(archive, compression, cmd, *args, **kwargs):
"""Create a LZMA 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')
try:
filename = args[0]
with open(filename) as srcfile:
data = srcfile.read(READ_SIZE_BYTES)
while data:
lzmafile.write(data)
data = srcfile.read(READ_SIZE_BYTES)
if verbose:
util.log_info('... added %s' % filename)
finally:
lzmafile.close()
return None