changeset 11930:12547cedc264

revlog: teach revlog to construct a revision from parentdeltas
author Pradeepkumar Gayam <in3xes@gmail.com>
date Tue, 10 Aug 2010 22:27:16 +0530
parents 1839a7518b0d
children 6051db1327f8
files mercurial/revlog.py
diffstat 1 files changed, 9 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/revlog.py	Tue Aug 10 22:26:08 2010 +0530
+++ b/mercurial/revlog.py	Tue Aug 10 22:27:16 2010 +0530
@@ -1040,7 +1040,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)),
@@ -1048,15 +1048,18 @@
 
     def revision(self, node):
         """return an uncompressed revision of a given node"""
+        cache = nullrev
         if node == nullid:
             return ""
-        if self._cache and self._cache[0] == node:
-            return self._cache[2]
+        if self._cache:
+            cache = self._cache[1]
+            if self._cache[0] == node:
+                return self._cache[2]
 
         # look up what we need to read
         text = None
         rev = self.rev(node)
-        base = self.base(rev)
+        cache, base, chain = self.deltachain(rev, cache)
 
         # check rev flags
         if self.flags(rev) & ~REVIDX_KNOWN_FLAGS:
@@ -1064,8 +1067,7 @@
                               (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]
+        if cache and self._cache:
             text = self._cache[2]
 
         # drop cache to save memory
@@ -1076,7 +1078,7 @@
         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