Mercurial > ~astiob > upreckon > hgweb
diff zipfile266.diff @ 48:ab6312ce3790 1.21
Converted 1.21 into a branch
author | Oleg Oshmyan <chortos@inbox.lv> |
---|---|
date | Sun, 19 Dec 2010 23:19:59 +0200 |
parents | 2.00/zipfile266.diff@f17f19d9eb0a |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/zipfile266.diff Sun Dec 19 23:19:59 2010 +0200 @@ -0,0 +1,126 @@ +--- /usr/lib/python2.6/zipfile.py 2010-07-05 14:48:38.000000000 +0300 ++++ zipfile.py 2010-11-25 01:39:22.749743303 +0200 +@@ -1,6 +1,7 @@ + """ + Read and write ZIP files. + """ ++# Improved by Chortos-2 in 2009 and 2010 (added bzip2 support) + import struct, os, time, sys, shutil + import binascii, cStringIO, stat + +@@ -11,8 +12,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 +@@ -33,6 +39,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 +@@ -467,6 +474,9 @@ + self.compreadsize = 64*1024 + if self.compress_type == ZIP_DEFLATED: + self.dc = zlib.decompressobj(-15) ++ elif self.compress_type == ZIP_BZIP2: ++ self.dc = bz2.BZ2Decompressor() ++ self.compreadsize = 900000 + + def set_univ_newlines(self, univ_newlines): + self.univ_newlines = univ_newlines +@@ -578,7 +588,7 @@ + if self.compress_type == ZIP_STORED: + lr = len(self.readbuffer) + bytesToRead = min(bytesToRead, size - lr) +- elif self.compress_type == ZIP_DEFLATED: ++ else: + if len(self.readbuffer) > size: + # the user has requested fewer bytes than we've already + # pulled through the decompressor; don't read any more +@@ -608,14 +618,17 @@ + newdata = ''.join(map(self.decrypter, newdata)) + + # decompress newly read data if necessary +- if newdata and self.compress_type == ZIP_DEFLATED: ++ if newdata and self.compress_type != ZIP_STORED: + newdata = self.dc.decompress(newdata) +- self.rawbuffer = self.dc.unconsumed_tail ++ self.rawbuffer = self.dc.unconsumed_tail if self.compress_type == ZIP_DEFLATED else '' + if self.eof and len(self.rawbuffer) == 0: + # we're out of raw bytes (both from the file and + # the local buffer); flush just to make sure the + # decompressor is done +- newdata += self.dc.flush() ++ try: ++ newdata += self.dc.flush() ++ except AttributeError: ++ pass + # prevent decompressor from being used again + self.dc = None + +@@ -641,7 +654,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. +@@ -661,6 +675,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" + +@@ -987,7 +1005,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: +@@ -1048,6 +1069,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: +@@ -1105,6 +1128,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