mercurial/revlog.py
changeset 14253 c28d5200374c
parent 14252 19067884c5f5
child 14270 d6907a5674a2
--- a/mercurial/revlog.py	Sat May 07 22:40:14 2011 +0200
+++ b/mercurial/revlog.py	Sat May 07 22:40:17 2011 +0200
@@ -27,10 +27,11 @@
 REVLOGV0 = 0
 REVLOGNG = 1
 REVLOGNGINLINEDATA = (1 << 16)
+REVLOGGENERALDELTA = (1 << 17)
 REVLOG_DEFAULT_FLAGS = REVLOGNGINLINEDATA
 REVLOG_DEFAULT_FORMAT = REVLOGNG
 REVLOG_DEFAULT_VERSION = REVLOG_DEFAULT_FORMAT | REVLOG_DEFAULT_FLAGS
-REVLOGNG_FLAGS = REVLOGNGINLINEDATA
+REVLOGNG_FLAGS = REVLOGNGINLINEDATA | REVLOGGENERALDELTA
 
 # revlog index flags
 REVIDX_KNOWN_FLAGS = 0
@@ -243,6 +244,7 @@
 
         self.version = v
         self._inline = v & REVLOGNGINLINEDATA
+        self._generaldelta = v & REVLOGGENERALDELTA
         flags = v & ~0xFFFF
         fmt = v & 0xFFFF
         if fmt == REVLOGV0 and flags:
@@ -830,8 +832,11 @@
 
     def deltaparent(self, rev):
         """return deltaparent of the given revision"""
-        if self.index[rev][3] == rev:
+        base = self.index[rev][3]
+        if base == rev:
             return nullrev
+        elif self._generaldelta:
+            return base
         else:
             return rev - 1
 
@@ -865,11 +870,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