archive: Add support for 7-Zip source archives
Dynamically check the unpacker and gracefully inform the user about the missing utility. BUG:FIXED:3870
This commit is contained in:
@@ -1336,6 +1336,7 @@
|
|||||||
<value>bzip2</value>
|
<value>bzip2</value>
|
||||||
<value>lzma</value>
|
<value>lzma</value>
|
||||||
<value>xz</value>
|
<value>xz</value>
|
||||||
|
<value>7z</value>
|
||||||
<value>binary</value>
|
<value>binary</value>
|
||||||
</choice>
|
</choice>
|
||||||
</attribute>
|
</attribute>
|
||||||
|
|||||||
@@ -32,6 +32,9 @@ import pisi.context as ctx
|
|||||||
class UnknownArchiveType(Exception):
|
class UnknownArchiveType(Exception):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
class ArchiveHandlerNotInstalled(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
# Proxy class inspired from tarfile._BZ2Proxy
|
# Proxy class inspired from tarfile._BZ2Proxy
|
||||||
class _LZMAProxy(object):
|
class _LZMAProxy(object):
|
||||||
@@ -461,6 +464,25 @@ class ArchiveTarZ(ArchiveBase):
|
|||||||
pass
|
pass
|
||||||
self.tar.close()
|
self.tar.close()
|
||||||
|
|
||||||
|
class Archive7Zip(ArchiveBase):
|
||||||
|
"""ArchiveZip handles 7-Zip archives."""
|
||||||
|
|
||||||
|
def __init__(self, file_path, arch_type="7z"):
|
||||||
|
super(Archive7Zip, self).__init__(file_path, arch_type)
|
||||||
|
self.cmd = pisi.util.search_executable(arch_type)
|
||||||
|
if not self.cmd:
|
||||||
|
raise ArchiveHandlerNotInstalled
|
||||||
|
|
||||||
|
def unpack(self, target_dir, clean_dir=False):
|
||||||
|
super(Archive7Zip, self).unpack(target_dir, clean_dir)
|
||||||
|
self.unpack_dir(target_dir)
|
||||||
|
|
||||||
|
def unpack_dir(self, target_dir):
|
||||||
|
"""Unpack 7z archive to a given target directory(target_dir)."""
|
||||||
|
|
||||||
|
# e.g. 7z x -bd -o<target_directory> <archive.7z>
|
||||||
|
pisi.util.run_batch("%s x -bd -o%s %s" % (self.cmd, target_dir, self.file_path))
|
||||||
|
|
||||||
|
|
||||||
class ArchiveZip(ArchiveBase):
|
class ArchiveZip(ArchiveBase):
|
||||||
"""ArchiveZip handles zip archives.
|
"""ArchiveZip handles zip archives.
|
||||||
@@ -639,6 +661,7 @@ class Archive:
|
|||||||
'bzip2': ArchiveBzip2,
|
'bzip2': ArchiveBzip2,
|
||||||
'lzma': ArchiveLzma,
|
'lzma': ArchiveLzma,
|
||||||
'xz': ArchiveLzma,
|
'xz': ArchiveLzma,
|
||||||
|
'7z': Archive7Zip,
|
||||||
'binary': ArchiveBinary}
|
'binary': ArchiveBinary}
|
||||||
|
|
||||||
handler = handlers.get(arch_type)
|
handler = handlers.get(arch_type)
|
||||||
@@ -659,6 +682,7 @@ class Archive:
|
|||||||
("bz2", (".bz2", ".bz")),
|
("bz2", (".bz2", ".bz")),
|
||||||
("lzma", (".lzma",)),
|
("lzma", (".lzma",)),
|
||||||
("xz", (".xz",)),
|
("xz", (".xz",)),
|
||||||
|
("7z", (".7z",)),
|
||||||
("binary", (".bin", ".run", ".sh")))
|
("binary", (".bin", ".run", ".sh")))
|
||||||
|
|
||||||
for _type, extensions in types:
|
for _type, extensions in types:
|
||||||
|
|||||||
@@ -123,6 +123,9 @@ class SourceArchive:
|
|||||||
except pisi.archive.UnknownArchiveType:
|
except pisi.archive.UnknownArchiveType:
|
||||||
raise Error(_("Unknown archive type '%s' is given for '%s'.")
|
raise Error(_("Unknown archive type '%s' is given for '%s'.")
|
||||||
% (self.archive.type, self.url.filename()))
|
% (self.archive.type, self.url.filename()))
|
||||||
|
except pisi.archive.ArchiveHandlerNotInstalled:
|
||||||
|
raise Error(_("Pisi needs %s to unpack this archive but it is not installed.")
|
||||||
|
% self.archive.type)
|
||||||
|
|
||||||
target_dir = os.path.join(target_dir, self.archive.target or "")
|
target_dir = os.path.join(target_dir, self.archive.target or "")
|
||||||
archive.unpack(target_dir, clean_dir)
|
archive.unpack(target_dir, clean_dir)
|
||||||
|
|||||||
Reference in New Issue
Block a user