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]))