[PATCH 3 of 7] revlog: teach revlog to construct a revision from parentdeltas

in3xes at gmail.com in3xes at gmail.com
Fri Aug 6 02:00:35 CDT 2010


# HG changeset patch
# User Pradeepkumar Gayam <in3xes at gmail.com>
# Date 1281076955 -19800
# Node ID 9f91eb15f5d051492f5d5590603a66b9ea87001c
# Parent  0155341e71903631a6e91b2cf237ac000529161d
revlog: teach revlog to construct a revision from parentdeltas

diff -r 0155341e7190 -r 9f91eb15f5d0 mercurial/revlog.py
--- a/mercurial/revlog.py	Fri Aug 06 12:10:31 2010 +0530
+++ b/mercurial/revlog.py	Fri Aug 06 12:12:35 2010 +0530
@@ -1035,7 +1035,7 @@
 
     def revdiff(self, rev1, rev2):
         """return or calculate a delta between two revisions"""
-        if rev1 + 1 == rev2 and self.base(rev1) == self.base(rev2):
+        if rev1 != nullrev and self.deltaparent(rev2) == rev1:
             return self._chunk(rev2)
 
         return mdiff.textdiff(self.revision(self.node(rev1)),
@@ -1052,6 +1052,10 @@
         text = None
         rev = self.rev(node)
         base = self.base(rev)
+        if self._parentdelta:
+            base, chain = self.deltachain(rev)
+        else:
+            chain = [r for r in xrange(base + 1, rev + 1)]
 
         # check rev flags
         if self.flags(rev) & ~REVIDX_KNOWN_FLAGS:
@@ -1059,16 +1063,21 @@
                               (self.flags(rev) & ~REVIDX_KNOWN_FLAGS))
 
         # do we have useful data cached?
-        if self._cache and self._cache[1] >= base and self._cache[1] < rev:
-            base = self._cache[1]
-            text = self._cache[2]
+        if self._cache:
+            try:
+                intersect = chain.index(self._cache[1])
+            except ValueError:
+                pass
+            else:
+                base, chain = chain[intersect], chain[intersect + 1:]
+                text = self._cache[2]
 
         self._loadindex(base, rev + 1)
         self._chunkraw(base, rev)
         if text is None:
             text = self._chunk(base)
 
-        bins = [self._chunk(r) for r in xrange(base + 1, rev + 1)]
+        bins = [self._chunk(r) for r in chain]
         text = mdiff.patches(text, bins)
         p1, p2 = self.parents(node)
         if (node != hash(text, p1, p2) and


More information about the Mercurial-devel mailing list