mercurial/revlog.py
changeset 47253 4abd474a10af
parent 47252 2219853a1503
child 47256 de63be070e02
--- a/mercurial/revlog.py	Mon May 03 12:35:25 2021 +0200
+++ b/mercurial/revlog.py	Mon May 03 12:35:35 2021 +0200
@@ -2088,7 +2088,10 @@
             if not self._inline:
                 try:
                     dfh = self._datafp(b"r+")
-                    dfh.seek(0, os.SEEK_END)
+                    if self._docket is None:
+                        dfh.seek(0, os.SEEK_END)
+                    else:
+                        dfh.seek(self._docket.data_end, os.SEEK_SET)
                 except IOError as inst:
                     if inst.errno != errno.ENOENT:
                         raise
@@ -2455,16 +2458,10 @@
         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._format_version != REVLOGV2:
+        if self._docket is None:
             return self.end(prev)
-
-        offset = 0
-        for rev, entry in enumerate(self.index):
-            sidedata_end = entry[8] + entry[9]
-            # Sidedata for a previous rev has potentially been written after
-            # this rev's end, so take the max.
-            offset = max(self.end(rev), offset, sidedata_end)
-        return offset
+        else:
+            return self._docket.data_end
 
     def _writeentry(self, transaction, entry, data, link, offset, sidedata):
         # Files opened in a+ mode have inconsistent behavior on various
@@ -2488,7 +2485,10 @@
         else:
             ifh.seek(self._docket.index_end, os.SEEK_SET)
         if dfh:
-            dfh.seek(0, os.SEEK_END)
+            if self._docket is None:
+                dfh.seek(0, os.SEEK_END)
+            else:
+                dfh.seek(self._docket.data_end, os.SEEK_SET)
 
         curr = len(self) - 1
         if not self._inline:
@@ -2511,6 +2511,7 @@
             self._enforceinlinesize(transaction)
         if self._docket is not None:
             self._docket.index_end = self._writinghandles[0].tell()
+            self._docket.data_end = self._writinghandles[1].tell()
 
         nodemaputil.setup_persistent_nodemap(transaction, self)
 
@@ -2673,18 +2674,19 @@
             return
 
         # first truncate the files on disk
-        end = self.start(rev)
+        data_end = self.start(rev)
         if not self._inline:
-            transaction.add(self._datafile, end)
+            transaction.add(self._datafile, data_end)
             end = rev * self.index.entry_size
         else:
-            end += rev * self.index.entry_size
+            end = data_end + (rev * self.index.entry_size)
 
         transaction.add(self._indexfile, end)
         if self._docket is not None:
             # XXX we could, leverage the docket while stripping. However it is
             # not powerfull enough at the time of this comment
             self._docket.index_end = end
+            self._docket.data_end = data_end
             self._docket.write(transaction, stripping=True)
 
         # then reset internal state in memory to forget those revisions
@@ -3210,7 +3212,11 @@
         # append the new sidedata
         with self._writing(transaction):
             ifh, dfh = self._writinghandles
-            dfh.seek(0, os.SEEK_END)
+            if self._docket is not None:
+                dfh.seek(self._docket.data_end, os.SEEK_SET)
+            else:
+                dfh.seek(0, os.SEEK_END)
+
             current_offset = dfh.tell()
             for rev in range(startrev, endrev + 1):
                 entry = self.index[rev]
@@ -3242,6 +3248,8 @@
                 dfh.write(serialized_sidedata)
                 new_entries.append(entry)
                 current_offset += len(serialized_sidedata)
+                if self._docket is not None:
+                    self._docket.data_end = dfh.tell()
 
             # rewrite the new index entries
             ifh.seek(startrev * self.index.entry_size)