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") |