comparison 2.00/zipfile266.diff @ 29:a8cc383b787c

Clean up zipfiles and diff them to stock ones
author Oleg Oshmyan <chortos@inbox.lv>
date Wed, 24 Nov 2010 23:21:31 +0000
parents
children f17f19d9eb0a
comparison
equal deleted inserted replaced
28:3d535503161f 29:a8cc383b787c
1 --- /usr/lib/python2.6/zipfile.py 2010-07-05 14:48:38.000000000 +0300
2 +++ zipfile.py 2010-08-05 03:51:16.062274000 +0300
3 @@ -1,6 +1,7 @@
4 """
5 Read and write ZIP files.
6 """
7 +# Improved by Chortos-2 in 2009 and 2010 (added bzip2 support)
8 import struct, os, time, sys, shutil
9 import binascii, cStringIO, stat
10
11 @@ -11,8 +12,13 @@
12 zlib = None
13 crc32 = binascii.crc32
14
15 +try:
16 + import bz2 # We may need its compression method
17 +except ImportError:
18 + bz2 = None
19 +
20 __all__ = ["BadZipfile", "error", "ZIP_STORED", "ZIP_DEFLATED", "is_zipfile",
21 - "ZipInfo", "ZipFile", "PyZipFile", "LargeZipFile" ]
22 + "ZipInfo", "ZipFile", "PyZipFile", "LargeZipFile", "ZIP_BZIP2" ]
23
24 class BadZipfile(Exception):
25 pass
26 @@ -33,6 +39,7 @@
27 # constants for Zip file compression methods
28 ZIP_STORED = 0
29 ZIP_DEFLATED = 8
30 +ZIP_BZIP2 = 12
31 # Other ZIP compression methods not supported
32
33 # Below are some formats and associated data for reading/writing headers using
34 @@ -467,6 +474,9 @@
35 self.compreadsize = 64*1024
36 if self.compress_type == ZIP_DEFLATED:
37 self.dc = zlib.decompressobj(-15)
38 + elif self.compress_type == ZIP_BZIP2:
39 + self.dc = bz2.BZ2Decompressor()
40 + self.compreadsize = 900000
41
42 def set_univ_newlines(self, univ_newlines):
43 self.univ_newlines = univ_newlines
44 @@ -578,7 +588,7 @@
45 if self.compress_type == ZIP_STORED:
46 lr = len(self.readbuffer)
47 bytesToRead = min(bytesToRead, size - lr)
48 - elif self.compress_type == ZIP_DEFLATED:
49 + else:
50 if len(self.readbuffer) > size:
51 # the user has requested fewer bytes than we've already
52 # pulled through the decompressor; don't read any more
53 @@ -608,14 +618,15 @@
54 newdata = ''.join(map(self.decrypter, newdata))
55
56 # decompress newly read data if necessary
57 - if newdata and self.compress_type == ZIP_DEFLATED:
58 + if newdata and self.compress_type != ZIP_STORED:
59 newdata = self.dc.decompress(newdata)
60 - self.rawbuffer = self.dc.unconsumed_tail
61 + self.rawbuffer = self.dc.unconsumed_tail if self.compress_type == ZIP_DEFLATED else ''
62 if self.eof and len(self.rawbuffer) == 0:
63 # we're out of raw bytes (both from the file and
64 # the local buffer); flush just to make sure the
65 # decompressor is done
66 - newdata += self.dc.flush()
67 + if hasattr(self.dc, 'flush'):
68 + newdata += self.dc.flush()
69 # prevent decompressor from being used again
70 self.dc = None
71
72 @@ -641,7 +652,8 @@
73 file: Either the path to the file, or a file-like object.
74 If it is a path, the file will be opened and closed by ZipFile.
75 mode: The mode can be either read "r", write "w" or append "a".
76 - compression: ZIP_STORED (no compression) or ZIP_DEFLATED (requires zlib).
77 + compression: ZIP_STORED (no compression), ZIP_DEFLATED (requires zlib),
78 + or ZIP_BZIP2 (requires bz2).
79 allowZip64: if True ZipFile will create files with ZIP64 extensions when
80 needed, otherwise it will raise an exception when this would
81 be necessary.
82 @@ -661,6 +673,10 @@
83 if not zlib:
84 raise RuntimeError,\
85 "Compression requires the (missing) zlib module"
86 + elif compression == ZIP_BZIP2:
87 + if not bz2:
88 + raise RuntimeError,\
89 + "Compression requires the (missing) bz2 module"
90 else:
91 raise RuntimeError, "That compression method is not supported"
92
93 @@ -987,7 +1003,10 @@
94 if zinfo.compress_type == ZIP_DEFLATED and not zlib:
95 raise RuntimeError, \
96 "Compression requires the (missing) zlib module"
97 - if zinfo.compress_type not in (ZIP_STORED, ZIP_DEFLATED):
98 + if zinfo.compress_type == ZIP_BZIP2 and not bz2:
99 + raise RuntimeError, \
100 + "Compression requires the (missing) bz2 module"
101 + if zinfo.compress_type not in (ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2):
102 raise RuntimeError, \
103 "That compression method is not supported"
104 if zinfo.file_size > ZIP64_LIMIT:
105 @@ -1048,6 +1067,8 @@
106 if zinfo.compress_type == ZIP_DEFLATED:
107 cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION,
108 zlib.DEFLATED, -15)
109 + elif zinfo.compress_type == ZIP_BZIP2:
110 + cmpr = bz2.BZ2Compressor()
111 else:
112 cmpr = None
113 while 1:
114 @@ -1105,6 +1126,10 @@
115 zlib.DEFLATED, -15)
116 bytes = co.compress(bytes) + co.flush()
117 zinfo.compress_size = len(bytes) # Compressed size
118 + elif zinfo.compress_type == ZIP_BZIP2:
119 + co = bz2.BZ2Compressor()
120 + bytes = co.compress(bytes) + co.flush()
121 + zinfo.compress_size = len(bytes) # Compressed size
122 else:
123 zinfo.compress_size = zinfo.file_size
124 zinfo.header_offset = self.fp.tell() # Start of header bytes