Mercurial > ~astiob > upreckon > hgweb
diff zipfile271.diff @ 49:245150080c48 1.20 1.20.3
Converted 1.20 into a branch
author | Oleg Oshmyan <chortos@inbox.lv> |
---|---|
date | Sun, 19 Dec 2010 23:23:24 +0200 |
parents | 2.00/zipfile271.diff@3000bb94addb |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zipfile271.diff Sun Dec 19 23:23:24 2010 +0200 @@ -0,0 +1,110 @@ +--- /usr/local/lib/python2.7/zipfile.py 2010-11-29 00:56:38.000000000 +0000 ++++ zipfile271.py 2010-11-29 01:20:17.000000000 +0000 +@@ -1,6 +1,7 @@ + """ + Read and write ZIP files. + """ ++# Improved by Chortos-2 in 2010 (added bzip2 support) + import struct, os, time, sys, shutil + import binascii, cStringIO, stat + import io +@@ -13,8 +14,13 @@ + zlib = None + crc32 = binascii.crc32 + ++try: ++ import bz2 # We may need its compression method ++except ImportError: ++ bz2 = None ++ + __all__ = ["BadZipfile", "error", "ZIP_STORED", "ZIP_DEFLATED", "is_zipfile", +- "ZipInfo", "ZipFile", "PyZipFile", "LargeZipFile" ] ++ "ZipInfo", "ZipFile", "PyZipFile", "LargeZipFile", "ZIP_BZIP2" ] + + class BadZipfile(Exception): + pass +@@ -35,6 +41,7 @@ + # constants for Zip file compression methods + ZIP_STORED = 0 + ZIP_DEFLATED = 8 ++ZIP_BZIP2 = 12 + # Other ZIP compression methods not supported + + # Below are some formats and associated data for reading/writing headers using +@@ -483,6 +490,9 @@ + + if self._compress_type == ZIP_DEFLATED: + self._decompressor = zlib.decompressobj(-15) ++ elif self._compress_type == ZIP_BZIP2: ++ self._decompressor = bz2.BZ2Decompressor() ++ self.MIN_READ_SIZE = 900000 + self._unconsumed = '' + + self._readbuffer = '' +@@ -641,6 +651,13 @@ + self._update_crc(data, eof=eof) + self._readbuffer = self._readbuffer[self._offset:] + data + self._offset = 0 ++ elif (len(self._unconsumed) > 0 and n > len_readbuffer and ++ self._compress_type == ZIP_BZIP2): ++ data = self._decompressor.decompress(self._unconsumed) ++ ++ self._unconsumed = '' ++ self._readbuffer = self._readbuffer[self._offset:] + data ++ self._offset = 0 + + # Read from buffer. + data = self._readbuffer[self._offset: self._offset + n] +@@ -657,7 +674,8 @@ + file: Either the path to the file, or a file-like object. + If it is a path, the file will be opened and closed by ZipFile. + mode: The mode can be either read "r", write "w" or append "a". +- compression: ZIP_STORED (no compression) or ZIP_DEFLATED (requires zlib). ++ compression: ZIP_STORED (no compression), ZIP_DEFLATED (requires zlib), ++ or ZIP_BZIP2 (requires bz2). + allowZip64: if True ZipFile will create files with ZIP64 extensions when + needed, otherwise it will raise an exception when this would + be necessary. +@@ -677,6 +695,10 @@ + if not zlib: + raise RuntimeError,\ + "Compression requires the (missing) zlib module" ++ elif compression == ZIP_BZIP2: ++ if not bz2: ++ raise RuntimeError,\ ++ "Compression requires the (missing) bz2 module" + else: + raise RuntimeError, "That compression method is not supported" + +@@ -1011,7 +1033,10 @@ + if zinfo.compress_type == ZIP_DEFLATED and not zlib: + raise RuntimeError, \ + "Compression requires the (missing) zlib module" +- if zinfo.compress_type not in (ZIP_STORED, ZIP_DEFLATED): ++ if zinfo.compress_type == ZIP_BZIP2 and not bz2: ++ raise RuntimeError, \ ++ "Compression requires the (missing) bz2 module" ++ if zinfo.compress_type not in (ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2): + raise RuntimeError, \ + "That compression method is not supported" + if zinfo.file_size > ZIP64_LIMIT: +@@ -1072,6 +1097,8 @@ + if zinfo.compress_type == ZIP_DEFLATED: + cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, + zlib.DEFLATED, -15) ++ elif zinfo.compress_type == ZIP_BZIP2: ++ cmpr = bz2.BZ2Compressor() + else: + cmpr = None + while 1: +@@ -1132,6 +1159,10 @@ + zlib.DEFLATED, -15) + bytes = co.compress(bytes) + co.flush() + zinfo.compress_size = len(bytes) # Compressed size ++ elif zinfo.compress_type == ZIP_BZIP2: ++ co = bz2.BZ2Compressor() ++ bytes = co.compress(bytes) + co.flush() ++ zinfo.compress_size = len(bytes) # Compressed size + else: + zinfo.compress_size = zinfo.file_size + zinfo.header_offset = self.fp.tell() # Start of header bytes