Added support for LZIP archives.
This commit is contained in:
parent
70a7fc2ae2
commit
cab43b1238
|
@ -1,6 +1,7 @@
|
||||||
0.5 "" (released xx.xx.2010)
|
0.5 "" (released xx.xx.2010)
|
||||||
|
|
||||||
* Ported to Python 2.4.
|
* Ported to Python 2.4.
|
||||||
|
* Added support for LZIP (.lz) archives.
|
||||||
|
|
||||||
0.4 "Nikita" (released 3.3.2010)
|
0.4 "Nikita" (released 3.3.2010)
|
||||||
|
|
||||||
|
|
|
@ -1,2 +1 @@
|
||||||
- Support lzip archives
|
|
||||||
- Support zoo archives
|
- Support zoo archives
|
||||||
|
|
|
@ -22,11 +22,11 @@ ArchiveCommands = ('list', 'extract', 'test', 'create')
|
||||||
|
|
||||||
# Supported archive formats
|
# Supported archive formats
|
||||||
ArchiveFormats = ('gzip', 'bzip2', 'tar', 'zip', 'compress', '7z', 'rar',
|
ArchiveFormats = ('gzip', 'bzip2', 'tar', 'zip', 'compress', '7z', 'rar',
|
||||||
'cab', 'arj', 'cpio', 'rpm', 'deb', 'lzop', 'lzma', 'xz')
|
'cab', 'arj', 'cpio', 'rpm', 'deb', 'lzop', 'lzma', 'xz', 'lzip')
|
||||||
|
|
||||||
# Supported encodings (used with tar for example)
|
# Supported encodings (used with tar for example)
|
||||||
# Note that all encodings must also be archive formats
|
# Note that all encodings must also be archive formats
|
||||||
ArchiveEncodings = ('gzip', 'bzip2', 'compress', 'lzma', 'xz')
|
ArchiveEncodings = ('gzip', 'bzip2', 'compress', 'lzma', 'xz', 'lzip')
|
||||||
|
|
||||||
# Map MIME types to archive format
|
# Map MIME types to archive format
|
||||||
ArchiveMimetypes = {
|
ArchiveMimetypes = {
|
||||||
|
@ -49,6 +49,7 @@ ArchiveMimetypes = {
|
||||||
'application/x-lzop': 'lzop',
|
'application/x-lzop': 'lzop',
|
||||||
'application/x-lzma': 'lzma',
|
'application/x-lzma': 'lzma',
|
||||||
'application/x-xz': 'xz',
|
'application/x-xz': 'xz',
|
||||||
|
'application/x-lzip': 'lzip',
|
||||||
}
|
}
|
||||||
|
|
||||||
# List of programs supporting the given encoding
|
# List of programs supporting the given encoding
|
||||||
|
@ -59,6 +60,7 @@ EncodingPrograms = {
|
||||||
'compress': ('compress',),
|
'compress': ('compress',),
|
||||||
'lzma': ('lzma',),
|
'lzma': ('lzma',),
|
||||||
'xz': ('xz',),
|
'xz': ('xz',),
|
||||||
|
'lzip': ('lzip',),
|
||||||
}
|
}
|
||||||
|
|
||||||
# List of programs supporting the given archive format and command.
|
# List of programs supporting the given archive format and command.
|
||||||
|
@ -82,6 +84,12 @@ ArchivePrograms = {
|
||||||
'gzip': {
|
'gzip': {
|
||||||
None: ('gzip', '7z'),
|
None: ('gzip', '7z'),
|
||||||
},
|
},
|
||||||
|
'lzip': {
|
||||||
|
'extract': ('lzip',),
|
||||||
|
'list': ('echo',),
|
||||||
|
'test': ('lzip',),
|
||||||
|
'create': ('lzip',),
|
||||||
|
},
|
||||||
'compress': {
|
'compress': {
|
||||||
'extract': ('gzip', '7z', 'uncompress.real'),
|
'extract': ('gzip', '7z', 'uncompress.real'),
|
||||||
'list': ('7z', 'echo',),
|
'list': ('7z', 'echo',),
|
||||||
|
|
|
@ -34,6 +34,10 @@ def list_xz (archive, encoding, cmd, **kwargs):
|
||||||
"""List a XZ archive."""
|
"""List a XZ archive."""
|
||||||
return stripext(cmd, archive)
|
return stripext(cmd, archive)
|
||||||
|
|
||||||
|
def list_lzip (archive, encoding, cmd, **kwargs):
|
||||||
|
"""List a LZIP archive."""
|
||||||
|
return stripext(cmd, archive)
|
||||||
|
|
||||||
def stripext (cmd, archive):
|
def stripext (cmd, archive):
|
||||||
"""Echo the name without suffix."""
|
"""Echo the name without suffix."""
|
||||||
return [cmd, util.stripext(archive)]
|
return [cmd, util.stripext(archive)]
|
||||||
|
|
|
@ -0,0 +1,56 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Copyright (C) 2010 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 lzip program."""
|
||||||
|
from patoolib import util
|
||||||
|
|
||||||
|
|
||||||
|
def extract_lzip (archive, encoding, cmd, **kwargs):
|
||||||
|
"""Extract a LZIP archive."""
|
||||||
|
cmdlist = [cmd]
|
||||||
|
if kwargs['verbose']:
|
||||||
|
cmdlist.append('-v')
|
||||||
|
cmdlist.extend(['-c', '-d'])
|
||||||
|
cmdlist.append('--')
|
||||||
|
outfile = util.get_single_outfile(kwargs['outdir'], archive)
|
||||||
|
cmdlist.extend([archive, '>', outfile])
|
||||||
|
# note that for shell calls the command must be a string
|
||||||
|
cmd = " ".join([util.shell_quote(x) for x in cmdlist])
|
||||||
|
return (cmd, {'shell': True})
|
||||||
|
|
||||||
|
|
||||||
|
def test_lzip (archive, encoding, cmd, **kwargs):
|
||||||
|
"""Test a LZIP archive."""
|
||||||
|
cmdlist = [cmd]
|
||||||
|
if kwargs['verbose']:
|
||||||
|
cmdlist.append('-v')
|
||||||
|
cmdlist.append('-t')
|
||||||
|
cmdlist.append('--')
|
||||||
|
cmdlist.append(archive)
|
||||||
|
return cmdlist
|
||||||
|
|
||||||
|
|
||||||
|
def create_lzip (archive, encoding, cmd, *args, **kwargs):
|
||||||
|
"""Create a LZIP archive."""
|
||||||
|
cmdlist = [cmd]
|
||||||
|
if kwargs['verbose']:
|
||||||
|
cmdlist.append('-v')
|
||||||
|
cmdlist.append('-c')
|
||||||
|
cmdlist.append('--')
|
||||||
|
cmdlist.extend(args)
|
||||||
|
cmdlist.extend(['>', archive])
|
||||||
|
# note that for shell calls the command must be a string
|
||||||
|
cmd = " ".join([util.shell_quote(x) for x in cmdlist])
|
||||||
|
return (cmd, {'shell': True})
|
|
@ -41,14 +41,14 @@ def create_tar (archive, encoding, cmd, *args, **kwargs):
|
||||||
|
|
||||||
def add_star_opts (cmdlist, encoding, verbose):
|
def add_star_opts (cmdlist, encoding, verbose):
|
||||||
# Note that star autodetects encoding compression, but displays a warning
|
# Note that star autodetects encoding compression, but displays a warning
|
||||||
# which we want to avoie.
|
# which we want to avoid.
|
||||||
if encoding == 'gzip':
|
if encoding == 'gzip':
|
||||||
cmdlist.append('-z')
|
cmdlist.append('-z')
|
||||||
elif encoding == 'compress':
|
elif encoding == 'compress':
|
||||||
cmdlist.append('-Z')
|
cmdlist.append('-Z')
|
||||||
elif encoding == 'bzip2':
|
elif encoding == 'bzip2':
|
||||||
cmdlist.append('-bz')
|
cmdlist.append('-bz')
|
||||||
elif encoding in ('lzma', 'xz'):
|
elif encoding in ('lzma', 'xz', 'lzip'):
|
||||||
# use compress-program option
|
# use compress-program option
|
||||||
cmdlist.append('compress-program=%s' % encoding)
|
cmdlist.append('compress-program=%s' % encoding)
|
||||||
if verbose:
|
if verbose:
|
||||||
|
|
|
@ -18,20 +18,14 @@
|
||||||
def extract_tar (archive, encoding, cmd, **kwargs):
|
def extract_tar (archive, encoding, cmd, **kwargs):
|
||||||
"""Extract a TAR archive."""
|
"""Extract a TAR archive."""
|
||||||
cmdlist = [cmd, '--extract']
|
cmdlist = [cmd, '--extract']
|
||||||
if encoding:
|
add_tar_opts(cmdlist, encoding, kwargs['verbose'])
|
||||||
cmdlist.append('--%s' % encoding)
|
|
||||||
if kwargs['verbose']:
|
|
||||||
cmdlist.append('--verbose')
|
|
||||||
cmdlist.extend(["--file", archive, '--directory', kwargs['outdir']])
|
cmdlist.extend(["--file", archive, '--directory', kwargs['outdir']])
|
||||||
return cmdlist
|
return cmdlist
|
||||||
|
|
||||||
def list_tar (archive, encoding, cmd, **kwargs):
|
def list_tar (archive, encoding, cmd, **kwargs):
|
||||||
"""List a TAR archive."""
|
"""List a TAR archive."""
|
||||||
cmdlist = [cmd, '--list']
|
cmdlist = [cmd, '--list']
|
||||||
if encoding:
|
add_tar_opts(cmdlist, encoding, kwargs['verbose'])
|
||||||
cmdlist.append('--%s' % encoding)
|
|
||||||
if kwargs['verbose']:
|
|
||||||
cmdlist.append('--verbose')
|
|
||||||
cmdlist.extend(["--file", archive])
|
cmdlist.extend(["--file", archive])
|
||||||
return cmdlist
|
return cmdlist
|
||||||
|
|
||||||
|
@ -40,8 +34,17 @@ test_tar = list_tar
|
||||||
def create_tar (archive, encoding, cmd, *args, **kwargs):
|
def create_tar (archive, encoding, cmd, *args, **kwargs):
|
||||||
"""Create a TAR archive."""
|
"""Create a TAR archive."""
|
||||||
cmdlist = [cmd, '--create']
|
cmdlist = [cmd, '--create']
|
||||||
if encoding:
|
add_tar_opts(cmdlist, encoding, kwargs['verbose'])
|
||||||
cmdlist.append('--%s' % encoding)
|
|
||||||
cmdlist.extend(["--file", archive, '--'])
|
cmdlist.extend(["--file", archive, '--'])
|
||||||
cmdlist.extend(args)
|
cmdlist.extend(args)
|
||||||
return cmdlist
|
return cmdlist
|
||||||
|
|
||||||
|
|
||||||
|
def add_tar_opts (cmdlist, encoding, verbose):
|
||||||
|
if encoding == 'lzip':
|
||||||
|
# use compress-program option
|
||||||
|
cmdlist.extend(['--use-compress-program', encoding])
|
||||||
|
elif encoding:
|
||||||
|
cmdlist.append('--%s' % encoding)
|
||||||
|
if verbose:
|
||||||
|
cmdlist.append('--verbose')
|
||||||
|
|
|
@ -27,6 +27,7 @@ mimedb = mimetypes.MimeTypes(strict=False)
|
||||||
mimedb.encodings_map['.bz2'] = 'bzip2'
|
mimedb.encodings_map['.bz2'] = 'bzip2'
|
||||||
mimedb.encodings_map['.lzma'] = 'lzma'
|
mimedb.encodings_map['.lzma'] = 'lzma'
|
||||||
mimedb.encodings_map['.xz'] = 'xz'
|
mimedb.encodings_map['.xz'] = 'xz'
|
||||||
|
mimedb.encodings_map['.lz'] = 'lzip'
|
||||||
mimedb.suffix_map['.tbz2'] = '.tar.bz2'
|
mimedb.suffix_map['.tbz2'] = '.tar.bz2'
|
||||||
mimedb.add_type('application/x-lzop', '.lzo', strict=False)
|
mimedb.add_type('application/x-lzop', '.lzo', strict=False)
|
||||||
mimedb.add_type('application/x-arj', '.arj', strict=False)
|
mimedb.add_type('application/x-arj', '.arj', strict=False)
|
||||||
|
@ -115,6 +116,7 @@ Encoding2Mime = {
|
||||||
'bzip2': "application/x-bzip2",
|
'bzip2': "application/x-bzip2",
|
||||||
'compress': "application/x-compress",
|
'compress': "application/x-compress",
|
||||||
'lzma': "application/x-lzma",
|
'lzma': "application/x-lzma",
|
||||||
|
'lzip': "application/x-lzip",
|
||||||
'xz': "application/x-xz",
|
'xz': "application/x-xz",
|
||||||
}
|
}
|
||||||
Mime2Encoding = dict([(value, key) for key, value in Encoding2Mime.items()])
|
Mime2Encoding = dict([(value, key) for key, value in Encoding2Mime.items()])
|
||||||
|
@ -185,6 +187,7 @@ FileText2Mime = {
|
||||||
"xz compressed data": "application/x-xz",
|
"xz compressed data": "application/x-xz",
|
||||||
"Zip archive data": "application/zip",
|
"Zip archive data": "application/zip",
|
||||||
"compress'd data": "application/x-compress",
|
"compress'd data": "application/x-compress",
|
||||||
|
"lzip compressed data": "application/x-lzip",
|
||||||
}
|
}
|
||||||
|
|
||||||
def guess_mime_file (file_prog, filename):
|
def guess_mime_file (file_prog, filename):
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -45,6 +45,11 @@ class TestArchives (ArchiveTest):
|
||||||
self.program = 'tar'
|
self.program = 'tar'
|
||||||
self.archive_commands('t.tar.lzma')
|
self.archive_commands('t.tar.lzma')
|
||||||
|
|
||||||
|
@needs_codec('tar', 'lzip')
|
||||||
|
def test_tar_lzip (self):
|
||||||
|
self.program = 'tar'
|
||||||
|
self.archive_commands('t.tar.lz')
|
||||||
|
|
||||||
@needs_codec('tar', 'xz')
|
@needs_codec('tar', 'xz')
|
||||||
def test_tar_xz (self):
|
def test_tar_xz (self):
|
||||||
self.program = 'tar'
|
self.program = 'tar'
|
||||||
|
@ -78,6 +83,11 @@ class TestArchives (ArchiveTest):
|
||||||
self.program = 'star'
|
self.program = 'star'
|
||||||
self.archive_commands('t.tar.lzma')
|
self.archive_commands('t.tar.lzma')
|
||||||
|
|
||||||
|
@needs_codec('tar', 'lzip')
|
||||||
|
def test_star_lzip (self):
|
||||||
|
self.program = 'star'
|
||||||
|
self.archive_commands('t.tar.lz')
|
||||||
|
|
||||||
@needs_codec('tar', 'xz')
|
@needs_codec('tar', 'xz')
|
||||||
def test_star_xz (self):
|
def test_star_xz (self):
|
||||||
self.program = 'star'
|
self.program = 'star'
|
||||||
|
@ -103,6 +113,7 @@ class TestArchives (ArchiveTest):
|
||||||
self.archive_list('t.bz2')
|
self.archive_list('t.bz2')
|
||||||
self.archive_list('t.Z')
|
self.archive_list('t.Z')
|
||||||
self.archive_list('t.lzma')
|
self.archive_list('t.lzma')
|
||||||
|
self.archive_list('t.txt.lz')
|
||||||
|
|
||||||
@needs_program('unzip')
|
@needs_program('unzip')
|
||||||
def test_unzip (self):
|
def test_unzip (self):
|
||||||
|
@ -242,10 +253,16 @@ class TestArchives (ArchiveTest):
|
||||||
self.archive_extract('t.lzma')
|
self.archive_extract('t.lzma')
|
||||||
self.archive_create('t.lzma', singlefile=True)
|
self.archive_create('t.lzma', singlefile=True)
|
||||||
|
|
||||||
|
@needs_program('lzip')
|
||||||
|
def test_lzip (self):
|
||||||
|
self.program = 'lzip'
|
||||||
|
self.archive_test('t.txt.lz')
|
||||||
|
self.archive_extract('t.txt.lz')
|
||||||
|
self.archive_create('t.txt.lz', singlefile=True)
|
||||||
|
|
||||||
@needs_program('xz')
|
@needs_program('xz')
|
||||||
def test_xz (self):
|
def test_xz (self):
|
||||||
self.program = 'xz'
|
self.program = 'xz'
|
||||||
self.archive_test('t.xz')
|
self.archive_test('t.xz')
|
||||||
self.archive_extract('t.xz')
|
self.archive_extract('t.xz')
|
||||||
self.archive_create('t.xz', singlefile=True)
|
self.archive_create('t.xz', singlefile=True)
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,12 @@ class TestArchives (ArchiveTest):
|
||||||
# self.program = 'tar'
|
# self.program = 'tar'
|
||||||
# self.archive_commands('t.tar.lzma.foo', format="tar", encoding="lzma")
|
# self.archive_commands('t.tar.lzma.foo', format="tar", encoding="lzma")
|
||||||
|
|
||||||
|
@needs_program('file')
|
||||||
|
@needs_codec('tar', 'lzip')
|
||||||
|
def test_tar_lzip (self):
|
||||||
|
self.program = 'tar'
|
||||||
|
self.archive_commands('t.tar.lz.foo', format="tar", encoding="lzip")
|
||||||
|
|
||||||
@needs_program('file')
|
@needs_program('file')
|
||||||
@needs_codec('tar', 'xz')
|
@needs_codec('tar', 'xz')
|
||||||
def test_tar_xz (self):
|
def test_tar_xz (self):
|
||||||
|
@ -91,6 +97,12 @@ class TestArchives (ArchiveTest):
|
||||||
# self.program = 'star'
|
# self.program = 'star'
|
||||||
# self.archive_commands('t.tar.lzma.foo', format="tar", encoding="lzma")
|
# self.archive_commands('t.tar.lzma.foo', format="tar", encoding="lzma")
|
||||||
|
|
||||||
|
@needs_program('file')
|
||||||
|
@needs_codec('tar', 'lzip')
|
||||||
|
def test_star_lzip (self):
|
||||||
|
self.program = 'star'
|
||||||
|
self.archive_commands('t.tar.lz.foo', format="tar", encoding="lzip")
|
||||||
|
|
||||||
@needs_program('file')
|
@needs_program('file')
|
||||||
@needs_codec('tar', 'xz')
|
@needs_codec('tar', 'xz')
|
||||||
def test_star_xz (self):
|
def test_star_xz (self):
|
||||||
|
@ -121,6 +133,7 @@ class TestArchives (ArchiveTest):
|
||||||
self.archive_list('t.Z.foo')
|
self.archive_list('t.Z.foo')
|
||||||
# file(1) does not recognize .lzma files
|
# file(1) does not recognize .lzma files
|
||||||
#self.archive_list('t.lzma.foo')
|
#self.archive_list('t.lzma.foo')
|
||||||
|
self.archive_list('t.txt.lz.foo')
|
||||||
|
|
||||||
@needs_program('file')
|
@needs_program('file')
|
||||||
@needs_program('unzip')
|
@needs_program('unzip')
|
||||||
|
@ -278,6 +291,14 @@ class TestArchives (ArchiveTest):
|
||||||
# self.archive_extract('t.lzma.foo')
|
# self.archive_extract('t.lzma.foo')
|
||||||
# self.archive_create('t.lzma.foo', format="lzma", singlefile=True)
|
# self.archive_create('t.lzma.foo', format="lzma", singlefile=True)
|
||||||
|
|
||||||
|
@needs_program('file')
|
||||||
|
@needs_program('lzip')
|
||||||
|
def test_lzip (self):
|
||||||
|
self.program = 'lzip'
|
||||||
|
self.archive_test('t.txt.lz.foo')
|
||||||
|
self.archive_extract('t.txt.lz.foo')
|
||||||
|
self.archive_create('t.txt.lz.foo', format="lzip", singlefile=True)
|
||||||
|
|
||||||
@needs_program('file')
|
@needs_program('file')
|
||||||
@needs_program('xz')
|
@needs_program('xz')
|
||||||
def test_xz (self):
|
def test_xz (self):
|
||||||
|
|
|
@ -49,6 +49,8 @@ class TestMime (unittest.TestCase):
|
||||||
self.mime_test("t.lzma", "application/x-lzma", None)
|
self.mime_test("t.lzma", "application/x-lzma", None)
|
||||||
# file(1) does not recognize .lzma files
|
# file(1) does not recognize .lzma files
|
||||||
#self.mime_test("t.lzma.foo", "application/x-lzma", None)
|
#self.mime_test("t.lzma.foo", "application/x-lzma", None)
|
||||||
|
self.mime_test("t.txt.lz", "application/x-lzip", None)
|
||||||
|
self.mime_test("t.txt.lz.foo", "application/x-lzip", None)
|
||||||
self.mime_test("t.lzo", "application/x-lzop", None)
|
self.mime_test("t.lzo", "application/x-lzop", None)
|
||||||
self.mime_test("t.lzo.foo", "application/x-lzop", None)
|
self.mime_test("t.lzo.foo", "application/x-lzop", None)
|
||||||
self.mime_test("t.rar", "application/x-rar", None)
|
self.mime_test("t.rar", "application/x-rar", None)
|
||||||
|
@ -66,6 +68,8 @@ class TestMime (unittest.TestCase):
|
||||||
#self.mime_test("t.tar.lzma.foo", "application/x-tar", "lzma")
|
#self.mime_test("t.tar.lzma.foo", "application/x-tar", "lzma")
|
||||||
self.mime_test("t.tar.xz", "application/x-tar", "xz")
|
self.mime_test("t.tar.xz", "application/x-tar", "xz")
|
||||||
self.mime_test("t.tar.xz.foo", "application/x-tar", "xz")
|
self.mime_test("t.tar.xz.foo", "application/x-tar", "xz")
|
||||||
|
self.mime_test("t.tar.lz", "application/x-tar", "lzip")
|
||||||
|
self.mime_test("t.tar.lz.foo", "application/x-tar", "lzip")
|
||||||
self.mime_test("t.tar.Z", "application/x-tar", "compress")
|
self.mime_test("t.tar.Z", "application/x-tar", "compress")
|
||||||
self.mime_test("t.tar.Z.foo", "application/x-tar", "compress")
|
self.mime_test("t.tar.Z.foo", "application/x-tar", "compress")
|
||||||
self.mime_test("t.taz", "application/x-tar", "compress")
|
self.mime_test("t.taz", "application/x-tar", "compress")
|
||||||
|
|
Loading…
Reference in New Issue