Mercurial > public > mercurial-scm > hg
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 |