mercurial/utils/compression.py
changeset 42042 aaececb4b066
parent 42041 3e47d1ec9da5
child 42043 1fac9b931d46
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]))