Mercurial > ~astiob > upreckon > hgweb
comparison zipfile266.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/zipfile266.diff@f17f19d9eb0a |
children |
comparison
equal
deleted
inserted
replaced
47:06f1683c8db9 | 49:245150080c48 |
---|---|
1 --- /usr/lib/python2.6/zipfile.py 2010-07-05 14:48:38.000000000 +0300 | |
2 +++ zipfile.py 2010-11-25 01:39:22.749743303 +0200 | |
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,17 @@ | |
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 + try: | |
68 + newdata += self.dc.flush() | |
69 + except AttributeError: | |
70 + pass | |
71 # prevent decompressor from being used again | |
72 self.dc = None | |
73 | |
74 @@ -641,7 +654,8 @@ | |
75 file: Either the path to the file, or a file-like object. | |
76 If it is a path, the file will be opened and closed by ZipFile. | |
77 mode: The mode can be either read "r", write "w" or append "a". | |
78 - compression: ZIP_STORED (no compression) or ZIP_DEFLATED (requires zlib). | |
79 + compression: ZIP_STORED (no compression), ZIP_DEFLATED (requires zlib), | |
80 + or ZIP_BZIP2 (requires bz2). | |
81 allowZip64: if True ZipFile will create files with ZIP64 extensions when | |
82 needed, otherwise it will raise an exception when this would | |
83 be necessary. | |
84 @@ -661,6 +675,10 @@ | |
85 if not zlib: | |
86 raise RuntimeError,\ | |
87 "Compression requires the (missing) zlib module" | |
88 + elif compression == ZIP_BZIP2: | |
89 + if not bz2: | |
90 + raise RuntimeError,\ | |
91 + "Compression requires the (missing) bz2 module" | |
92 else: | |
93 raise RuntimeError, "That compression method is not supported" | |
94 | |
95 @@ -987,7 +1005,10 @@ | |
96 if zinfo.compress_type == ZIP_DEFLATED and not zlib: | |
97 raise RuntimeError, \ | |
98 "Compression requires the (missing) zlib module" | |
99 - if zinfo.compress_type not in (ZIP_STORED, ZIP_DEFLATED): | |
100 + if zinfo.compress_type == ZIP_BZIP2 and not bz2: | |
101 + raise RuntimeError, \ | |
102 + "Compression requires the (missing) bz2 module" | |
103 + if zinfo.compress_type not in (ZIP_STORED, ZIP_DEFLATED, ZIP_BZIP2): | |
104 raise RuntimeError, \ | |
105 "That compression method is not supported" | |
106 if zinfo.file_size > ZIP64_LIMIT: | |
107 @@ -1048,6 +1069,8 @@ | |
108 if zinfo.compress_type == ZIP_DEFLATED: | |
109 cmpr = zlib.compressobj(zlib.Z_DEFAULT_COMPRESSION, | |
110 zlib.DEFLATED, -15) | |
111 + elif zinfo.compress_type == ZIP_BZIP2: | |
112 + cmpr = bz2.BZ2Compressor() | |
113 else: | |
114 cmpr = None | |
115 while 1: | |
116 @@ -1105,6 +1128,10 @@ | |
117 zlib.DEFLATED, -15) | |
118 bytes = co.compress(bytes) + co.flush() | |
119 zinfo.compress_size = len(bytes) # Compressed size | |
120 + elif zinfo.compress_type == ZIP_BZIP2: | |
121 + co = bz2.BZ2Compressor() | |
122 + bytes = co.compress(bytes) + co.flush() | |
123 + zinfo.compress_size = len(bytes) # Compressed size | |
124 else: | |
125 zinfo.compress_size = zinfo.file_size | |
126 zinfo.header_offset = self.fp.tell() # Start of header bytes |