mercurial/revlog.py
changeset 11930 12547cedc264
parent 11929 1839a7518b0d
child 11931 6051db1327f8
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")