comparison mercurial/revlog.py @ 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
comparison
equal deleted inserted replaced
11929:1839a7518b0d 11930:12547cedc264
1038 check = True 1038 check = True
1039 return check, rev, chain 1039 return check, rev, chain
1040 1040
1041 def revdiff(self, rev1, rev2): 1041 def revdiff(self, rev1, rev2):
1042 """return or calculate a delta between two revisions""" 1042 """return or calculate a delta between two revisions"""
1043 if rev1 + 1 == rev2 and self.base(rev1) == self.base(rev2): 1043 if rev1 != nullrev and self.deltaparent(rev2) == rev1:
1044 return self._chunk(rev2) 1044 return self._chunk(rev2)
1045 1045
1046 return mdiff.textdiff(self.revision(self.node(rev1)), 1046 return mdiff.textdiff(self.revision(self.node(rev1)),
1047 self.revision(self.node(rev2))) 1047 self.revision(self.node(rev2)))
1048 1048
1049 def revision(self, node): 1049 def revision(self, node):
1050 """return an uncompressed revision of a given node""" 1050 """return an uncompressed revision of a given node"""
1051 cache = nullrev
1051 if node == nullid: 1052 if node == nullid:
1052 return "" 1053 return ""
1053 if self._cache and self._cache[0] == node: 1054 if self._cache:
1054 return self._cache[2] 1055 cache = self._cache[1]
1056 if self._cache[0] == node:
1057 return self._cache[2]
1055 1058
1056 # look up what we need to read 1059 # look up what we need to read
1057 text = None 1060 text = None
1058 rev = self.rev(node) 1061 rev = self.rev(node)
1059 base = self.base(rev) 1062 cache, base, chain = self.deltachain(rev, cache)
1060 1063
1061 # check rev flags 1064 # check rev flags
1062 if self.flags(rev) & ~REVIDX_KNOWN_FLAGS: 1065 if self.flags(rev) & ~REVIDX_KNOWN_FLAGS:
1063 raise RevlogError(_('incompatible revision flag %x') % 1066 raise RevlogError(_('incompatible revision flag %x') %
1064 (self.flags(rev) & ~REVIDX_KNOWN_FLAGS)) 1067 (self.flags(rev) & ~REVIDX_KNOWN_FLAGS))
1065 1068
1066 # do we have useful data cached? 1069 # do we have useful data cached?
1067 if self._cache and self._cache[1] >= base and self._cache[1] < rev: 1070 if cache and self._cache:
1068 base = self._cache[1]
1069 text = self._cache[2] 1071 text = self._cache[2]
1070 1072
1071 # drop cache to save memory 1073 # drop cache to save memory
1072 self._cache = None 1074 self._cache = None
1073 1075
1074 self._loadindex(base, rev + 1) 1076 self._loadindex(base, rev + 1)
1075 self._chunkraw(base, rev) 1077 self._chunkraw(base, rev)
1076 if text is None: 1078 if text is None:
1077 text = self._chunk(base) 1079 text = self._chunk(base)
1078 1080
1079 bins = [self._chunk(r) for r in xrange(base + 1, rev + 1)] 1081 bins = [self._chunk(r) for r in chain]
1080 text = mdiff.patches(text, bins) 1082 text = mdiff.patches(text, bins)
1081 p1, p2 = self.parents(node) 1083 p1, p2 = self.parents(node)
1082 if (node != hash(text, p1, p2) and 1084 if (node != hash(text, p1, p2) and
1083 not (self.flags(rev) & REVIDX_PUNCHED_FLAG)): 1085 not (self.flags(rev) & REVIDX_PUNCHED_FLAG)):
1084 raise RevlogError(_("integrity check failed on %s:%d") 1086 raise RevlogError(_("integrity check failed on %s:%d")