##// END OF EJS Templates
revlog: incrementally build node cache with linear searches...
Matt Mackall -
r13275:68da048b default
parent child Browse files
Show More
@@ -176,10 +176,7 b' class revlogio(object):'
176 176 def parseindex(self, data, inline):
177 177 # call the C implementation to parse the index data
178 178 index, cache = parsers.parse_index2(data, inline)
179 nodemap = None
180 if not data:
181 nodemap = {nullid: nullrev}
182 return index, nodemap, cache
179 return index, None, cache
183 180
184 181 def packentry(self, entry, node, version, rev):
185 182 p = _pack(indexformatng, *entry)
@@ -228,6 +225,8 b' class revlog(object):'
228 225 self._shallowroot = shallowroot
229 226 self._parentdelta = 0
230 227 self._pcache = {}
228 self._nodecache = {nullid: nullrev}
229 self._nodepos = None
231 230
232 231 v = REVLOG_DEFAULT_VERSION
233 232 if hasattr(opener, 'options') and 'defversion' in opener.options:
@@ -274,20 +273,10 b' class revlog(object):'
274 273 raise RevlogError(_("index %s is corrupted") % (self.indexfile))
275 274 self.index, nodemap, self._chunkcache = d
276 275 if nodemap is not None:
277 self.nodemap = nodemap
278 self.rev = self._revmap
276 self.nodemap = self._nodecache = nodemap
279 277 if not self._chunkcache:
280 278 self._chunkclear()
281 279
282 @util.propertycache
283 def nodemap(self):
284 n = {nullid: nullrev}
285 i = self.index
286 for r in xrange(len(i) - 1):
287 n[i[r][7]] = r
288 self.rev = self._revmap
289 return n
290
291 280 def tip(self):
292 281 return self.node(len(self.index) - 2)
293 282 def __len__(self):
@@ -295,20 +284,31 b' class revlog(object):'
295 284 def __iter__(self):
296 285 for i in xrange(len(self)):
297 286 yield i
298 def _revmap(self, node):
299 try:
300 return self.nodemap[node]
301 except KeyError:
302 raise LookupError(node, self.indexfile, _('no node'))
287
288 @util.propertycache
289 def nodemap(self):
290 n = self.rev(self.node(0))
291 return self._nodecache
303 292
304 293 def rev(self, node):
305 if node == nullid:
306 return nullrev
294 try:
295 return self._nodecache[node]
296 except KeyError:
297 n = self._nodecache
298 if node in n:
299 return n[node]
307 300 i = self.index
308 for r in xrange(len(i) - 2, -1, -1):
309 if i[r][7] == node:
301 p = self._nodepos
302 if p is None:
303 p = len(i) - 2
304 for r in xrange(p, -1, -1):
305 v = i[r][7]
306 n[v] = r
307 if v == node:
308 self._nodepos = r - 1
310 309 return r
311 310 raise LookupError(node, self.indexfile, _('no node'))
311
312 312 def node(self, rev):
313 313 return self.index[rev][7]
314 314 def linkrev(self, rev):
General Comments 0
You need to be logged in to leave comments. Login now