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