diff -r eac3591abbf4 -r ff9fd7107d11 mercurial/revlog.py --- a/mercurial/revlog.py Mon May 03 21:04:55 2021 +0200 +++ b/mercurial/revlog.py Mon May 03 21:13:24 2021 +0200 @@ -35,6 +35,7 @@ from .pycompat import getattr from .revlogutils.constants import ( ALL_KINDS, + COMP_MODE_DEFAULT, COMP_MODE_INLINE, COMP_MODE_PLAIN, FEATURES_BY_VERSION, @@ -708,6 +709,15 @@ engine = util.compengines[self._compengine] return engine.revlogcompressor(self._compengineopts) + @util.propertycache + def _decompressor(self): + """the default decompressor""" + if self._docket is None: + return None + t = self._docket.default_compression_header + c = self._get_decompressor(t) + return c.decompress + def _indexfp(self): """file object for the revlog's index file""" return self.opener(self._indexfile, mode=b"r") @@ -1776,6 +1786,8 @@ data = self._getsegmentforrevs(rev, rev, df=df)[1] if compression_mode == COMP_MODE_PLAIN: return data + elif compression_mode == COMP_MODE_DEFAULT: + return self._decompressor(data) elif compression_mode == COMP_MODE_INLINE: return self.decompress(data) else: @@ -1829,6 +1841,8 @@ return [self._chunk(rev, df=df) for rev in revschunk] decomp = self.decompress + # self._decompressor might be None, but will not be used in that case + def_decomp = self._decompressor for rev in revschunk: chunkstart = start(rev) if inline: @@ -1840,6 +1854,8 @@ ladd(c) elif comp_mode == COMP_MODE_INLINE: ladd(decomp(c)) + elif comp_mode == COMP_MODE_DEFAULT: + ladd(def_decomp(c)) else: msg = 'unknown compression mode %d' msg %= comp_mode @@ -2489,8 +2505,12 @@ if not h and not d: # not data to store at all... declare them uncompressed compression_mode = COMP_MODE_PLAIN - elif not h and d[0:1] == b'\0': - compression_mode = COMP_MODE_PLAIN + elif not h: + t = d[0:1] + if t == b'\0': + compression_mode = COMP_MODE_PLAIN + elif t == self._docket.default_compression_header: + compression_mode = COMP_MODE_DEFAULT elif h == b'u': # we have a more efficient way to declare uncompressed h = b''