[PATCH 3 of 3] revlog: support reading general deltas

Sune Foldager cryo at cyanite.org
Thu May 5 06:18:50 CDT 2011


# HG changeset patch
# User Sune Foldager <cryo at cyanite.org>
# Date 1304593993 -7200
# Node ID 0628c80b2ac9049596a3fa0a2b19be2f70d531ba
# Parent  9c8d70e38372c2a67519d7e2804977803a81eaf1
revlog: support reading general deltas

Parentdelta (per entry) takes precedence over generaldelta (per revlog).

diff -r 9c8d70e38372 -r 0628c80b2ac9 mercurial/revlog.py
--- a/mercurial/revlog.py	Thu May 05 13:10:27 2011 +0200
+++ b/mercurial/revlog.py	Thu May 05 13:13:13 2011 +0200
@@ -28,10 +28,11 @@
 REVLOGNG = 1
 REVLOGNGINLINEDATA = (1 << 16)
 REVLOGSHALLOW = (1 << 17)
+REVLOGGENERALDELTA = (1 << 18)
 REVLOG_DEFAULT_FLAGS = REVLOGNGINLINEDATA
 REVLOG_DEFAULT_FORMAT = REVLOGNG
 REVLOG_DEFAULT_VERSION = REVLOG_DEFAULT_FORMAT | REVLOG_DEFAULT_FLAGS
-REVLOGNG_FLAGS = REVLOGNGINLINEDATA | REVLOGSHALLOW
+REVLOGNG_FLAGS = REVLOGNGINLINEDATA | REVLOGSHALLOW | REVLOGGENERALDELTA
 
 # revlog index flags
 REVIDX_KNOWN_FLAGS = 0
@@ -248,6 +249,7 @@
         self.version = v
         self._inline = v & REVLOGNGINLINEDATA
         self._shallow = v & REVLOGSHALLOW
+        self._generaldelta = v & REVLOGGENERALDELTA
         flags = v & ~0xFFFF
         fmt = v & 0xFFFF
         if fmt == REVLOGV0 and flags:
@@ -834,7 +836,10 @@
         self._chunkcache = (0, '')
 
     def _deltaparent(self, rev):
-        return rev - 1
+        if self._generaldelta:
+            return self.index[rev][3]
+        else:
+            return rev - 1
 
     def deltaparent(self, rev):
         """return deltaparent of the given revision"""
@@ -873,11 +878,15 @@
         # build delta chain
         chain = []
         index = self.index # for performance
+        generaldelta = self._generaldelta
         iterrev = rev
         e = index[iterrev]
         while iterrev != e[3] and iterrev != cachedrev:
             chain.append(iterrev)
-            iterrev -= 1
+            if generaldelta:
+                iterrev = e[3]
+            else:
+                iterrev -= 1
             e = index[iterrev]
         chain.reverse()
         base = iterrev


More information about the Mercurial-devel mailing list