454 |
454 |
455 def decompressorreader(self, fh): |
455 def decompressorreader(self, fh): |
456 return _GzipCompressedStreamReader(fh) |
456 return _GzipCompressedStreamReader(fh) |
457 |
457 |
458 class zlibrevlogcompressor(object): |
458 class zlibrevlogcompressor(object): |
|
459 |
|
460 def __init__(self, level=None): |
|
461 self._level = level |
|
462 |
459 def compress(self, data): |
463 def compress(self, data): |
460 insize = len(data) |
464 insize = len(data) |
461 # Caller handles empty input case. |
465 # Caller handles empty input case. |
462 assert insize > 0 |
466 assert insize > 0 |
463 |
467 |
464 if insize < 44: |
468 if insize < 44: |
465 return None |
469 return None |
466 |
470 |
467 elif insize <= 1000000: |
471 elif insize <= 1000000: |
468 compressed = zlib.compress(data) |
472 if self._level is None: |
|
473 compressed = zlib.compress(data) |
|
474 else: |
|
475 compressed = zlib.compress(data, self._level) |
469 if len(compressed) < insize: |
476 if len(compressed) < insize: |
470 return compressed |
477 return compressed |
471 return None |
478 return None |
472 |
479 |
473 # zlib makes an internal copy of the input buffer, doubling |
480 # zlib makes an internal copy of the input buffer, doubling |
474 # memory usage for large inputs. So do streaming compression |
481 # memory usage for large inputs. So do streaming compression |
475 # on large inputs. |
482 # on large inputs. |
476 else: |
483 else: |
477 z = zlib.compressobj() |
484 if self._level is None: |
|
485 z = zlib.compressobj() |
|
486 else: |
|
487 z = zlib.compressobj(level=self._level) |
478 parts = [] |
488 parts = [] |
479 pos = 0 |
489 pos = 0 |
480 while pos < insize: |
490 while pos < insize: |
481 pos2 = pos + 2**20 |
491 pos2 = pos + 2**20 |
482 parts.append(z.compress(data[pos:pos2])) |
492 parts.append(z.compress(data[pos:pos2])) |