[PATCH 3 of 6] revlog: teach revlog to construct a revision from parentdeltas
in3xes at gmail.com
in3xes at gmail.com
Mon Aug 9 11:09:18 CDT 2010
# HG changeset patch
# User Pradeepkumar Gayam <in3xes at gmail.com>
# Date 1281366447 -19800
# Node ID 9edb2bea4b760990f97a8d1bb6e7bea65f0d4858
# Parent 9536451a578d75dae45bbefb197d48ef6d06d64c
revlog: teach revlog to construct a revision from parentdeltas
diff -r 9536451a578d -r 9edb2bea4b76 mercurial/revlog.py
--- a/mercurial/revlog.py Mon Aug 09 20:34:28 2010 +0530
+++ b/mercurial/revlog.py Mon Aug 09 20:37:27 2010 +0530
@@ -1041,7 +1041,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)),
@@ -1057,7 +1057,13 @@
# look up what we need to read
text = None
rev = self.rev(node)
- base = self.base(rev)
+ parentdelta = hasattr(self.opener, 'options') and \
+ 'parentdelta' in self.opener.options
+ if not self._deltachain and not parentdelta:
+ base = self.base(rev)
+ chain = [r for r in xrange(base + 1, rev + 1)]
+ else:
+ base, chain = self.deltachain(rev)
# check rev flags
if self.flags(rev) & ~REVIDX_KNOWN_FLAGS:
@@ -1065,9 +1071,14 @@
(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]
# drop cache to save memory
self._cache = None
@@ -1077,7 +1088,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
More information about the Mercurial-devel
mailing list