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