Mercurial > public > mercurial-scm > hg
comparison mercurial/utils/compression.py @ 42042:aaececb4b066
compression: accept level management for zlib compression
We update the zlib related class to be support setting the compression level.
This changeset focus on updating the internal only. A way to configure this
level will be introduced in the next changeset.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Wed, 27 Mar 2019 19:34:10 +0100 |
parents | 3e47d1ec9da5 |
children | 1fac9b931d46 |
comparison
equal
deleted
inserted
replaced
42041:3e47d1ec9da5 | 42042:aaececb4b066 |
---|---|
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])) |