[PATCH 2 of 4] imported patch newdef
Pradeepkumar Gayam
in3xes at gmail.com
Tue Jun 22 02:31:03 CDT 2010
# HG changeset patch
# User Pradeepkumar Gayam <in3xes at gmail.com>
# Date 1277183801 -19800
# Node ID 3c0cf3b7fd9ece7f7d31c6119eb83eea5807f89d
# Parent 466d7fb61dca5cb1e54e4e38fb941fba1a5d0909
imported patch newdef
diff -r 466d7fb61dca -r 3c0cf3b7fd9e mercurial/revlog.py
--- a/mercurial/revlog.py Tue Jun 22 10:46:41 2010 +0530
+++ b/mercurial/revlog.py Tue Jun 22 10:46:41 2010 +0530
@@ -997,9 +997,17 @@
def _chunkclear(self):
self._chunkcache = (0, '')
+ def deltaparent(self, rev):
+ if self.base(rev) == rev:
+ return nullrev
+ elif self.flags(rev) & REVLOG_PARENTDELTA_FLAGS:
+ return self.parentrevs(rev)[0]
+ else:
+ return rev-1
+
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)),
@@ -1007,6 +1015,14 @@
def flags(self, rev):
return gettype(self.index[rev][0])
+
+ def deltachain(self, rev):
+ chain = []
+ while self.base(rev) != rev:
+ chain.append(rev)
+ rev = self.deltaparent(rev)
+ chain.reverse()
+ return rev, chain
def revision(self, node):
"""return an uncompressed revision of a given node"""
@@ -1018,7 +1034,7 @@
# look up what we need to read
text = None
rev = self.rev(node)
- base = self.base(rev)
+ base, chain = self.deltachain(rev)
# check rev flags
if self.flags(rev) & ~1:
@@ -1026,16 +1042,21 @@
(self.flags(rev)))
# 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):
More information about the Mercurial-devel
mailing list