diff --git a/pisi/archive.py b/pisi/archive.py index bf539e3d..089abcf9 100644 --- a/pisi/archive.py +++ b/pisi/archive.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2005 - 2007, TUBITAK/UEKAE +# Copyright (C) 2005-2010, TUBITAK/UEKAE # # 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 @@ -20,8 +20,6 @@ import tarfile import zipfile import gzip import bz2 -import struct -import sys import gettext __trans = gettext.translation('pisi', fallback=True) @@ -251,99 +249,6 @@ class ArchiveTar(ArchiveBase): raise LzmaRuntimeError(err) -class MyZipFile(zipfile.ZipFile): - def decompressToFile(self, name, outname): - import zlib - import binascii - - block_size = 1024 * 1024 * 2 - - if self.mode not in ("r", "a"): - raise RuntimeError, 'read() requires mode "r" or "a"' - if not self.fp: - raise RuntimeError, \ - "Attempt to read ZIP archive that was already closed" - zinfo = self.getinfo(name) - filepos = self.fp.tell() - - self.fp.seek(zinfo.header_offset, 0) - - # Skip the file header: - fheader = self.fp.read(30) - if fheader[0:4] != zipfile.stringFileHeader: - raise BadZipfile, "Bad magic number for file header" - - fheader = struct.unpack(zipfile.structFileHeader, fheader) - fname = self.fp.read(fheader[zipfile._FH_FILENAME_LENGTH]) - if fheader[zipfile._FH_EXTRA_FIELD_LENGTH]: - self.fp.read(fheader[zipfile._FH_EXTRA_FIELD_LENGTH]) - - if fname != zinfo.orig_filename: - raise zipfile.BadZipfile, \ - 'File name in directory "%s" and header "%s" differ.' % ( - zinfo.orig_filename, fname) - - destfile = file(outname, 'wb') - - if zinfo.compress_type == zipfile.ZIP_STORED: - total_read = 0 - crc = None - while total_read < zinfo.compress_size: - if zinfo.compress_size - total_read < block_size: - block_size = zinfo.compress_size - total_read - buff = self.fp.read(block_size) - destfile.write(buff) - total_read += (block_size) - if crc: - crc = binascii.crc32(buff, crc) - else: - crc = binascii.crc32(buff) - destfile.close() - self.fp.seek(filepos, 0) - if crc and crc != zinfo.CRC: - raise zipfile.BadZipfile, "Bad CRC-32 for file %s" % name - return - elif zinfo.compress_type != zipfile.ZIP_DEFLATED: - raise zipfile.BadZipfile, \ - "Unsupported compression method %d for file %s" % \ - (zinfo.compress_type, name) - - if not zlib: - raise RuntimeError, \ - "De-compression requires the (missing) zlib module" - # zlib compress/decompress code by Jeremy Hylton of CNRI - dc = zlib.decompressobj(-15) - - total_read = 0 - crc = None - while total_read < zinfo.compress_size: - if zinfo.compress_size - total_read < block_size: - block_size = zinfo.compress_size - total_read - buff = self.fp.read(block_size) - dcbuff = dc.decompress(dc.unconsumed_tail + buff) - destfile.write(dcbuff) - total_read += block_size - if crc: - crc = binascii.crc32(dcbuff, crc) - else: - crc = binascii.crc32(dcbuff) - - # need to feed in unused pad byte so that zlib won't choke - ex = dc.decompress(dc.unconsumed_tail + 'Z') + dc.flush() - if ex: - if crc: - crc = binascii.crc32(ex, crc) - else: - crc = binascii.crc32(ex) - destfile.write(ex) - - if crc and crc != zinfo.CRC: - raise zipfile.BadZipfile, "Bad CRC-32 for file %s" % name - - destfile.close() - self.fp.seek(filepos, 0) - - class ArchiveZip(ArchiveBase): """ArchiveZip handles zip archives. @@ -356,7 +261,7 @@ class ArchiveZip(ArchiveBase): def __init__(self, file_path, arch_type = "zip", mode = 'r'): super(ArchiveZip, self).__init__(file_path, arch_type) - self.zip_obj = MyZipFile(self.file_path, mode) + self.zip_obj = zipfile.ZipFile(self.file_path, mode) def close(self): """Close the zip archive.""" @@ -466,11 +371,8 @@ class ArchiveZip(ArchiveBase): perm >>= 16 perm |= 0x00000100 - if sys.version_info[:2] < (2, 6): - zip_obj.decompressToFile(info.filename, ofile) - else: - info.filename = outpath - zip_obj.extract(info, target_dir) + info.filename = outpath + zip_obj.extract(info, target_dir) os.chmod(ofile, perm) def unpack_files(self, paths, target_dir):