19 import errno, shutil, sys, tempfile, traceback |
19 import errno, shutil, sys, tempfile, traceback |
20 import re as remod |
20 import re as remod |
21 import os, time, datetime, calendar, textwrap, signal, collections |
21 import os, time, datetime, calendar, textwrap, signal, collections |
22 import imp, socket, urllib |
22 import imp, socket, urllib |
23 import gc |
23 import gc |
|
24 import bz2 |
|
25 import zlib |
24 |
26 |
25 if os.name == 'nt': |
27 if os.name == 'nt': |
26 import windows as platform |
28 import windows as platform |
27 else: |
29 else: |
28 import posix as platform |
30 import posix as platform |
2336 pos = path.rfind('/') |
2338 pos = path.rfind('/') |
2337 while pos != -1: |
2339 while pos != -1: |
2338 yield path[:pos] |
2340 yield path[:pos] |
2339 pos = path.rfind('/', 0, pos) |
2341 pos = path.rfind('/', 0, pos) |
2340 |
2342 |
|
2343 # compression utility |
|
2344 |
|
2345 class nocompress(object): |
|
2346 def compress(self, x): |
|
2347 return x |
|
2348 def flush(self): |
|
2349 return "" |
|
2350 |
|
2351 compressors = { |
|
2352 'UN': nocompress, |
|
2353 # lambda to prevent early import |
|
2354 'BZ': lambda: bz2.BZ2Compressor(), |
|
2355 'GZ': lambda: zlib.compressobj(), |
|
2356 } |
|
2357 |
|
2358 def _makedecompressor(decompcls): |
|
2359 def generator(f): |
|
2360 d = decompcls() |
|
2361 for chunk in filechunkiter(f): |
|
2362 yield d.decompress(chunk) |
|
2363 def func(fh): |
|
2364 return chunkbuffer(generator(fh)) |
|
2365 return func |
|
2366 |
|
2367 def _bz2(): |
|
2368 d = bz2.BZ2Decompressor() |
|
2369 # Bzip2 stream start with BZ, but we stripped it. |
|
2370 # we put it back for good measure. |
|
2371 d.decompress('BZ') |
|
2372 return d |
|
2373 |
|
2374 decompressors = {'UN': lambda fh: fh, |
|
2375 'BZ': _makedecompressor(_bz2), |
|
2376 'GZ': _makedecompressor(lambda: zlib.decompressobj()), |
|
2377 } |
|
2378 |
2341 # convenient shortcut |
2379 # convenient shortcut |
2342 dst = debugstacktrace |
2380 dst = debugstacktrace |