mercurial/utils/compression.py
changeset 48946 642e31cb55f0
parent 48875 6000f5b25c9b
child 50910 93b0de7f13ca
equal deleted inserted replaced
48945:55d132525155 48946:642e31cb55f0
    30     'compenginewireprotosupport',
    30     'compenginewireprotosupport',
    31     ('name', 'serverpriority', 'clientpriority'),
    31     ('name', 'serverpriority', 'clientpriority'),
    32 )
    32 )
    33 
    33 
    34 
    34 
    35 class propertycache(object):
    35 class propertycache:
    36     def __init__(self, func):
    36     def __init__(self, func):
    37         self.func = func
    37         self.func = func
    38         self.name = func.__name__
    38         self.name = func.__name__
    39 
    39 
    40     def __get__(self, obj, type=None):
    40     def __get__(self, obj, type=None):
    45     def cachevalue(self, obj, value):
    45     def cachevalue(self, obj, value):
    46         # __dict__ assignment required to bypass __setattr__ (eg: repoview)
    46         # __dict__ assignment required to bypass __setattr__ (eg: repoview)
    47         obj.__dict__[self.name] = value
    47         obj.__dict__[self.name] = value
    48 
    48 
    49 
    49 
    50 class compressormanager(object):
    50 class compressormanager:
    51     """Holds registrations of various compression engines.
    51     """Holds registrations of various compression engines.
    52 
    52 
    53     This class essentially abstracts the differences between compression
    53     This class essentially abstracts the differences between compression
    54     engines to allow new compression formats to be added easily, possibly from
    54     engines to allow new compression formats to be added easily, possibly from
    55     extensions.
    55     extensions.
   217 
   217 
   218 
   218 
   219 compengines = compressormanager()
   219 compengines = compressormanager()
   220 
   220 
   221 
   221 
   222 class compressionengine(object):
   222 class compressionengine:
   223     """Base class for compression engines.
   223     """Base class for compression engines.
   224 
   224 
   225     Compression engines must implement the interface defined by this class.
   225     Compression engines must implement the interface defined by this class.
   226     """
   226     """
   227 
   227 
   336         The object is reusable but is not thread safe.
   336         The object is reusable but is not thread safe.
   337         """
   337         """
   338         raise NotImplementedError()
   338         raise NotImplementedError()
   339 
   339 
   340 
   340 
   341 class _CompressedStreamReader(object):
   341 class _CompressedStreamReader:
   342     def __init__(self, fh):
   342     def __init__(self, fh):
   343         if safehasattr(fh, 'unbufferedread'):
   343         if safehasattr(fh, 'unbufferedread'):
   344             self._reader = fh.unbufferedread
   344             self._reader = fh.unbufferedread
   345         else:
   345         else:
   346             self._reader = fh.read
   346             self._reader = fh.read
   480         yield z.flush()
   480         yield z.flush()
   481 
   481 
   482     def decompressorreader(self, fh):
   482     def decompressorreader(self, fh):
   483         return _GzipCompressedStreamReader(fh)
   483         return _GzipCompressedStreamReader(fh)
   484 
   484 
   485     class zlibrevlogcompressor(object):
   485     class zlibrevlogcompressor:
   486         def __init__(self, level=None):
   486         def __init__(self, level=None):
   487             self._level = level
   487             self._level = level
   488 
   488 
   489         def compress(self, data):
   489         def compress(self, data):
   490             insize = len(data)
   490             insize = len(data)
   624         return it
   624         return it
   625 
   625 
   626     def decompressorreader(self, fh):
   626     def decompressorreader(self, fh):
   627         return fh
   627         return fh
   628 
   628 
   629     class nooprevlogcompressor(object):
   629     class nooprevlogcompressor:
   630         def compress(self, data):
   630         def compress(self, data):
   631             return None
   631             return None
   632 
   632 
   633     def revlogcompressor(self, opts=None):
   633     def revlogcompressor(self, opts=None):
   634         return self.nooprevlogcompressor()
   634         return self.nooprevlogcompressor()
   696         yield z.flush()
   696         yield z.flush()
   697 
   697 
   698     def decompressorreader(self, fh):
   698     def decompressorreader(self, fh):
   699         return _ZstdCompressedStreamReader(fh, self._module)
   699         return _ZstdCompressedStreamReader(fh, self._module)
   700 
   700 
   701     class zstdrevlogcompressor(object):
   701     class zstdrevlogcompressor:
   702         def __init__(self, zstd, level=3):
   702         def __init__(self, zstd, level=3):
   703             # TODO consider omitting frame magic to save 4 bytes.
   703             # TODO consider omitting frame magic to save 4 bytes.
   704             # This writes content sizes into the frame header. That is
   704             # This writes content sizes into the frame header. That is
   705             # extra storage. But it allows a correct size memory allocation
   705             # extra storage. But it allows a correct size memory allocation
   706             # to hold the result.
   706             # to hold the result.
   780     # help.makeitemsdocs() expects a dict of names to items with a .__doc__.
   780     # help.makeitemsdocs() expects a dict of names to items with a .__doc__.
   781     items = {}
   781     items = {}
   782 
   782 
   783     # We need to format the docstring. So use a dummy object/type to hold it
   783     # We need to format the docstring. So use a dummy object/type to hold it
   784     # rather than mutating the original.
   784     # rather than mutating the original.
   785     class docobject(object):
   785     class docobject:
   786         pass
   786         pass
   787 
   787 
   788     for name in compengines:
   788     for name in compengines:
   789         engine = compengines[name]
   789         engine = compengines[name]
   790 
   790