diff --git a/contrib/perf.py b/contrib/perf.py --- a/contrib/perf.py +++ b/contrib/perf.py @@ -546,8 +546,12 @@ for part in bundle.iterparts(): pass + def iterpartsseekable(bundle): + for part in bundle.iterparts(seekable=True): + pass + def seek(bundle): - for part in bundle.iterparts(): + for part in bundle.iterparts(seekable=True): part.seek(0, os.SEEK_END) def makepartreadnbytes(size): @@ -583,6 +587,7 @@ benches.extend([ (makebench(forwardchunks), 'bundle2 forwardchunks()'), (makebench(iterparts), 'bundle2 iterparts()'), + (makebench(iterpartsseekable), 'bundle2 iterparts() seekable'), (makebench(seek), 'bundle2 part seek()'), (makepartreadnbytes(8192), 'bundle2 part read(8k)'), (makepartreadnbytes(16384), 'bundle2 part read(16k)'), diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py --- a/mercurial/bundle2.py +++ b/mercurial/bundle2.py @@ -845,8 +845,9 @@ yield self._readexact(size) - def iterparts(self): + def iterparts(self, seekable=False): """yield all parts contained in the stream""" + cls = seekableunbundlepart if seekable else unbundlepart # make sure param have been loaded self.params # From there, payload need to be decompressed @@ -854,7 +855,7 @@ indebug(self.ui, 'start extraction of bundle2 parts') headerblock = self._readpartheader() while headerblock is not None: - part = seekableunbundlepart(self.ui, headerblock, self._fp) + part = cls(self.ui, headerblock, self._fp) yield part # Ensure part is fully consumed so we can start reading the next # part. @@ -1154,7 +1155,7 @@ if headerblock is None: indebug(self.ui, 'no part found during interruption.') return - part = seekableunbundlepart(self.ui, headerblock, self._fp) + part = unbundlepart(self.ui, headerblock, self._fp) op = interruptoperation(self.ui) hardabort = False try: diff --git a/mercurial/bundlerepo.py b/mercurial/bundlerepo.py --- a/mercurial/bundlerepo.py +++ b/mercurial/bundlerepo.py @@ -289,7 +289,7 @@ self._cgunpacker = None cgpart = None - for part in bundle.iterparts(): + for part in bundle.iterparts(seekable=True): if part.type == 'changegroup': if cgpart: raise NotImplementedError("can't process "