comparison mercurial/bundle2.py @ 30353:d045b4091197

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. Again, this will allow us to easily transition to different compression engine APIs when they are implemented.
author Gregory Szorc <gregory.szorc@gmail.com>
date Mon, 07 Nov 2016 18:36:48 -0800
parents f81002f736d7
children 5925bda42dbd
comparison
equal deleted inserted replaced
30352:75f5beb54e29 30353:d045b4091197
679 _magicstring = 'HG20' 679 _magicstring = 'HG20'
680 680
681 def __init__(self, ui, fp): 681 def __init__(self, ui, fp):
682 """If header is specified, we do not read it out of the stream.""" 682 """If header is specified, we do not read it out of the stream."""
683 self.ui = ui 683 self.ui = ui
684 self._decompressor = util.decompressors[None] 684 self._compengine = util.compengines.forbundletype('UN')
685 self._compressed = None 685 self._compressed = None
686 super(unbundle20, self).__init__(fp) 686 super(unbundle20, self).__init__(fp)
687 687
688 @util.propertycache 688 @util.propertycache
689 def params(self): 689 def params(self):
753 yield _pack(_fstreamparamsize, paramssize) 753 yield _pack(_fstreamparamsize, paramssize)
754 if paramssize: 754 if paramssize:
755 params = self._readexact(paramssize) 755 params = self._readexact(paramssize)
756 self._processallparams(params) 756 self._processallparams(params)
757 yield params 757 yield params
758 assert self._decompressor is util.decompressors[None] 758 assert self._compengine.bundletype == 'UN'
759 # From there, payload might need to be decompressed 759 # From there, payload might need to be decompressed
760 self._fp = self._decompressor(self._fp) 760 self._fp = self._compengine.decompressorreader(self._fp)
761 emptycount = 0 761 emptycount = 0
762 while emptycount < 2: 762 while emptycount < 2:
763 # so we can brainlessly loop 763 # so we can brainlessly loop
764 assert _fpartheadersize == _fpayloadsize 764 assert _fpartheadersize == _fpayloadsize
765 size = self._unpack(_fpartheadersize)[0] 765 size = self._unpack(_fpartheadersize)[0]
779 def iterparts(self): 779 def iterparts(self):
780 """yield all parts contained in the stream""" 780 """yield all parts contained in the stream"""
781 # make sure param have been loaded 781 # make sure param have been loaded
782 self.params 782 self.params
783 # From there, payload need to be decompressed 783 # From there, payload need to be decompressed
784 self._fp = self._decompressor(self._fp) 784 self._fp = self._compengine.decompressorreader(self._fp)
785 indebug(self.ui, 'start extraction of bundle2 parts') 785 indebug(self.ui, 'start extraction of bundle2 parts')
786 headerblock = self._readpartheader() 786 headerblock = self._readpartheader()
787 while headerblock is not None: 787 while headerblock is not None:
788 part = unbundlepart(self.ui, headerblock, self._fp) 788 part = unbundlepart(self.ui, headerblock, self._fp)
789 yield part 789 yield part
821 return decorator 821 return decorator
822 822
823 @b2streamparamhandler('compression') 823 @b2streamparamhandler('compression')
824 def processcompression(unbundler, param, value): 824 def processcompression(unbundler, param, value):
825 """read compression parameter and install payload decompression""" 825 """read compression parameter and install payload decompression"""
826 if value not in util.decompressors: 826 if value not in util.compengines.supportedbundletypes:
827 raise error.BundleUnknownFeatureError(params=(param,), 827 raise error.BundleUnknownFeatureError(params=(param,),
828 values=(value,)) 828 values=(value,))
829 unbundler._decompressor = util.decompressors[value] 829 unbundler._compengine = util.compengines.forbundletype(value)
830 if value is not None: 830 if value is not None:
831 unbundler._compressed = True 831 unbundler._compressed = True
832 832
833 class bundlepart(object): 833 class bundlepart(object):
834 """A bundle2 part contains application level payload 834 """A bundle2 part contains application level payload