##// END OF EJS Templates
revlog: cache chain info after calculating it for a rev (issue4452)...
Siddharth Agarwal -
r23306:f7a42f8e default
parent child Browse files
Show More
@@ -270,6 +270,8 b' class revlog(object):'
270 270 self.nodemap = self._nodecache = nodemap
271 271 if not self._chunkcache:
272 272 self._chunkclear()
273 # revnum -> (chain-length, sum-delta-length)
274 self._chaininfocache = {}
273 275
274 276 def tip(self):
275 277 return self.node(len(self.index) - 2)
@@ -355,7 +357,11 b' class revlog(object):'
355 357 return base
356 358 def chainlen(self, rev):
357 359 return self._chaininfo(rev)[0]
360
358 361 def _chaininfo(self, rev):
362 chaininfocache = self._chaininfocache
363 if rev in chaininfocache:
364 return chaininfocache[rev]
359 365 index = self.index
360 366 generaldelta = self._generaldelta
361 367 iterrev = rev
@@ -369,10 +375,20 b' class revlog(object):'
369 375 iterrev = e[3]
370 376 else:
371 377 iterrev -= 1
378 if iterrev in chaininfocache:
379 t = chaininfocache[iterrev]
380 clen += t[0]
381 compresseddeltalen += t[1]
382 break
372 383 e = index[iterrev]
373 # add text length of base since decompressing that also takes work
374 compresseddeltalen += e[1]
375 return clen, compresseddeltalen
384 else:
385 # Add text length of base since decompressing that also takes
386 # work. For cache hits the length is already included.
387 compresseddeltalen += e[1]
388 r = (clen, compresseddeltalen)
389 chaininfocache[rev] = r
390 return r
391
376 392 def flags(self, rev):
377 393 return self.index[rev][0] & 0xFFFF
378 394 def rawsize(self, rev):
@@ -1453,6 +1469,7 b' class revlog(object):'
1453 1469
1454 1470 # then reset internal state in memory to forget those revisions
1455 1471 self._cache = None
1472 self._chaininfocache = {}
1456 1473 self._chunkclear()
1457 1474 for x in xrange(rev, len(self)):
1458 1475 del self.nodemap[self.node(x)]
General Comments 0
You need to be logged in to leave comments. Login now