mercurial/revlog.py
changeset 47266 ff9fd7107d11
parent 47265 eac3591abbf4
child 47267 2b69555e4875
--- 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''