diff mercurial/revlog.py @ 47153:f58a13c52726

revlog: split the `version` attribute into its two components The `revlog.version` attribute contained an integer coding 2 different informations: * the revlog version number * a bit field defining some specific feature of the revlog We now explicitly store the two components independently. This avoid exposing the implementation details all around the code and prepare for future revlog version that would encode the information in a different way. In the process we drop the `version` attribute from the interface. It was flagged for removal when that interface was created. Differential Revision: https://phab.mercurial-scm.org/D10565
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Mon, 03 May 2021 12:20:45 +0200
parents 84b176ad2860
children 47ffc754989a
line wrap: on
line diff
--- a/mercurial/revlog.py	Mon May 03 12:20:35 2021 +0200
+++ b/mercurial/revlog.py	Mon May 03 12:20:45 2021 +0200
@@ -451,10 +451,8 @@
 
             versionflags = newversionflags
 
-        self.version = versionflags
-
-        flags = versionflags & ~0xFFFF
-        fmt = versionflags & 0xFFFF
+        flags = self._format_flags = versionflags & ~0xFFFF
+        fmt = self._format_version = versionflags & 0xFFFF
 
         if fmt == REVLOGV0:
             if flags:
@@ -519,7 +517,7 @@
                 use_rust_index = self.opener.options.get(b'rust.index')
 
         self._parse_index = parse_index_v1
-        if self.version == REVLOGV0:
+        if self._format_version == REVLOGV0:
             self._parse_index = revlogv0.parse_index_v0
         elif fmt == REVLOGV2:
             self._parse_index = parse_index_v2
@@ -1945,12 +1943,13 @@
                     trindex = r
 
         with self._indexfp(b'w') as fp:
-            self.version &= ~FLAG_INLINE_DATA
+            self._format_flags &= ~FLAG_INLINE_DATA
             self._inline = False
             for i in self:
                 e = self.index.entry_binary(i)
                 if i == 0:
-                    header = self.index.pack_header(self.version)
+                    header = self._format_flags | self._format_version
+                    header = self.index.pack_header(header)
                     e = header + e
                 fp.write(e)
 
@@ -2269,13 +2268,14 @@
             len(serialized_sidedata),
         )
 
-        if self.version & 0xFFFF != REVLOGV2:
+        if self._format_version != REVLOGV2:
             e = e[:8]
 
         self.index.append(e)
         entry = self.index.entry_binary(curr)
         if curr == 0:
-            header = self.index.pack_header(self.version)
+            header = self._format_flags | self._format_version
+            header = self.index.pack_header(header)
             entry = header + entry
         self._writeentry(
             transaction,
@@ -2307,7 +2307,7 @@
         to `n - 1`'s sidedata being written after `n`'s data.
 
         TODO cache this in a docket file before getting out of experimental."""
-        if self.version & 0xFFFF != REVLOGV2:
+        if self._format_version != REVLOGV2:
             return self.end(prev)
 
         offset = 0
@@ -2847,9 +2847,10 @@
                 addrevisioncb(self, rev, node)
 
     def censorrevision(self, tr, censornode, tombstone=b''):
-        if (self.version & 0xFFFF) == REVLOGV0:
+        if self._format_version == REVLOGV0:
             raise error.RevlogError(
-                _(b'cannot censor with version %d revlogs') % self.version
+                _(b'cannot censor with version %d revlogs')
+                % self._format_version
             )
 
         censorrev = self.rev(censornode)
@@ -2875,7 +2876,8 @@
             datafile=newdatafile,
             censorable=True,
         )
-        newrl.version = self.version
+        newrl._format_version = self._format_version
+        newrl._format_flags = self._format_flags
         newrl._generaldelta = self._generaldelta
         newrl._parse_index = self._parse_index
 
@@ -2947,7 +2949,7 @@
         if di:
             yield revlogproblem(error=_(b'index contains %d extra bytes') % di)
 
-        version = self.version & 0xFFFF
+        version = self._format_version
 
         # The verifier tells us what version revlog we should be.
         if version != state[b'expectedversion']:
@@ -3137,6 +3139,7 @@
                 self.index.replace_sidedata_info(rev, e[8], e[9], e[0])
                 packed = self.index.entry_binary(rev)
                 if rev == 0:
-                    header = self.index.pack_header(self.version)
+                    header = self._format_flags | self._format_version
+                    header = self.index.pack_header(header)
                     packed = header + packed
                 fp.write(packed)