comparison mercurial/revlog.py @ 12886:c25945a148c1 stable

revlog: fix buildtext local scope buildtext stores its result in _addrevision scope to avoid repeated builds cachedelta is already visible
author Matt Mackall <mpm@selenic.com>
date Sat, 30 Oct 2010 02:47:34 -0500
parents 557988c691d1
children 8ce6240587b1
comparison
equal deleted inserted replaced
12885:b5eae8e24e80 12886:c25945a148c1
1155 ifh.close() 1155 ifh.close()
1156 1156
1157 def _addrevision(self, node, text, transaction, link, p1, p2, 1157 def _addrevision(self, node, text, transaction, link, p1, p2,
1158 cachedelta, ifh, dfh): 1158 cachedelta, ifh, dfh):
1159 1159
1160 def buildtext(cachedelta): 1160 btext = [text]
1161 if text is not None: 1161 def buildtext():
1162 return text 1162 if btext[0] is not None:
1163 return btext[0]
1163 # flush any pending writes here so we can read it in revision 1164 # flush any pending writes here so we can read it in revision
1164 if dfh: 1165 if dfh:
1165 dfh.flush() 1166 dfh.flush()
1166 ifh.flush() 1167 ifh.flush()
1167 basetext = self.revision(self.node(cachedelta[0])) 1168 basetext = self.revision(self.node(cachedelta[0]))
1168 patchedtext = mdiff.patch(basetext, cachedelta[1]) 1169 btext[0] = mdiff.patch(basetext, cachedelta[1])
1169 chk = hash(patchedtext, p1, p2) 1170 chk = hash(btext[0], p1, p2)
1170 if chk != node: 1171 if chk != node:
1171 raise RevlogError(_("consistency error in delta")) 1172 raise RevlogError(_("consistency error in delta"))
1172 return patchedtext 1173 return btext[0]
1173 1174
1174 curr = len(self) 1175 curr = len(self)
1175 prev = curr - 1 1176 prev = curr - 1
1176 base = curr 1177 base = curr
1177 offset = self.end(prev) 1178 offset = self.end(prev)
1188 if deltarev != nullrev: 1189 if deltarev != nullrev:
1189 # can we use the cached delta? 1190 # can we use the cached delta?
1190 if cachedelta: 1191 if cachedelta:
1191 cacherev, d = cachedelta 1192 cacherev, d = cachedelta
1192 if cacherev != deltarev: 1193 if cacherev != deltarev:
1193 text = buildtext(cachedelta) 1194 text = buildtext()
1194 d = None 1195 d = None
1195 if d is None: 1196 if d is None:
1196 ptext = self.revision(deltanode) 1197 ptext = self.revision(deltanode)
1197 d = mdiff.textdiff(ptext, text) 1198 d = mdiff.textdiff(ptext, text)
1198 data = compress(d) 1199 data = compress(d)
1208 cachedelta[1]) 1209 cachedelta[1])
1209 else: 1210 else:
1210 textlen = len(text) 1211 textlen = len(text)
1211 if (d is None or dist > textlen * 2 or 1212 if (d is None or dist > textlen * 2 or
1212 (self.flags(base) & REVIDX_PUNCHED_FLAG)): 1213 (self.flags(base) & REVIDX_PUNCHED_FLAG)):
1213 text = buildtext(cachedelta) 1214 text = buildtext()
1214 data = compress(text) 1215 data = compress(text)
1215 l = len(data[1]) + len(data[0]) 1216 l = len(data[1]) + len(data[0])
1216 base = curr 1217 base = curr
1217 1218
1218 e = (offset_type(offset, flags), l, textlen, 1219 e = (offset_type(offset, flags), l, textlen,