[PATCH 05 of 11] bundle2: use compression engines API to obtain decompressor
Gregory Szorc
gregory.szorc at gmail.com
Tue Nov 1 20:08:38 EDT 2016
# HG changeset patch
# User Gregory Szorc <gregory.szorc at gmail.com>
# Date 1477158197 25200
# Sat Oct 22 10:43:17 2016 -0700
# Node ID 859682e2187c46bb7ab68aedd7dcbab5266d878e
# Parent b32a9f8f72bcaea41d23165cc26583b0dcfb0fc6
bundle2: use compression engines API to obtain decompressor
Like the recent change for the compressor side, this too is
relatively straightforward. We now store a compression engine
on the instance instead of a low-level decompressor. This will
allow us to transition to a new decompression API when one is
ready.
diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
--- a/mercurial/bundle2.py
+++ b/mercurial/bundle2.py
@@ -676,17 +676,17 @@ class unbundle20(unpackermixin):
This class is fed with a binary stream and yields parts through its
`iterparts` methods."""
_magicstring = 'HG20'
def __init__(self, ui, fp):
"""If header is specified, we do not read it out of the stream."""
self.ui = ui
- self._decompressor = util.decompressors[None]
+ self._compengine = util.compressionengines.forbundletype('UN')
self._compressed = None
super(unbundle20, self).__init__(fp)
@util.propertycache
def params(self):
"""dictionary of stream level parameters"""
indebug(self.ui, 'reading bundle2 stream parameters')
params = {}
@@ -750,19 +750,19 @@ class unbundle20(unpackermixin):
if paramssize < 0:
raise error.BundleValueError('negative bundle param size: %i'
% paramssize)
yield _pack(_fstreamparamsize, paramssize)
if paramssize:
params = self._readexact(paramssize)
self._processallparams(params)
yield params
- assert self._decompressor is util.decompressors[None]
+ assert self._compengine.bundletype == 'UN'
# From there, payload might need to be decompressed
- self._fp = self._decompressor(self._fp)
+ self._fp = self._compengine.decompressorreader(self._fp)
emptycount = 0
while emptycount < 2:
# so we can brainlessly loop
assert _fpartheadersize == _fpayloadsize
size = self._unpack(_fpartheadersize)[0]
yield _pack(_fpartheadersize, size)
if size:
emptycount = 0
@@ -776,17 +776,17 @@ class unbundle20(unpackermixin):
yield self._readexact(size)
def iterparts(self):
"""yield all parts contained in the stream"""
# make sure param have been loaded
self.params
# From there, payload need to be decompressed
- self._fp = self._decompressor(self._fp)
+ self._fp = self._compengine.decompressorreader(self._fp)
indebug(self.ui, 'start extraction of bundle2 parts')
headerblock = self._readpartheader()
while headerblock is not None:
part = unbundlepart(self.ui, headerblock, self._fp)
yield part
part.seek(0, 2)
headerblock = self._readpartheader()
indebug(self.ui, 'end of bundle2 stream')
@@ -818,20 +818,20 @@ def b2streamparamhandler(name):
assert name not in formatmap
b2streamparamsmap[name] = func
return func
return decorator
@b2streamparamhandler('compression')
def processcompression(unbundler, param, value):
"""read compression parameter and install payload decompression"""
- if value not in util.decompressors:
+ if value not in util.compressionengines.supportedbundletypes:
raise error.BundleUnknownFeatureError(params=(param,),
values=(value,))
- unbundler._decompressor = util.decompressors[value]
+ unbundler._compengine = util.compressionengines.forbundletype(value)
if value is not None:
unbundler._compressed = True
class bundlepart(object):
"""A bundle2 part contains application level payload
The part `type` is used to route the part to the application level
handler.
More information about the Mercurial-devel
mailing list