comparison mercurial/revlog.py @ 41084:84491ae0b3f0

revlog: more efficient implementation for issnapshot We avoid multiple method calls and tuple creation, this provides a significant speedup in some case: example affected manifest write before: 0.815520s after: 0.487767s (-40%)
author Boris Feld <boris.feld@octobus.net>
date Mon, 17 Dec 2018 10:51:36 +0100
parents cbc3cbd9ff93
children a28833d79aca
comparison
equal deleted inserted replaced
41083:cbc3cbd9ff93 41084:84491ae0b3f0
1533 def issnapshot(self, rev): 1533 def issnapshot(self, rev):
1534 """tells whether rev is a snapshot 1534 """tells whether rev is a snapshot
1535 """ 1535 """
1536 if rev == nullrev: 1536 if rev == nullrev:
1537 return True 1537 return True
1538 deltap = self.deltaparent(rev) 1538 entry = self.index[rev]
1539 if deltap == nullrev: 1539 base = entry[3]
1540 if base == rev:
1540 return True 1541 return True
1541 elif not self._sparserevlog: 1542 elif not self._sparserevlog:
1542 return False 1543 return False
1543 p1, p2 = self.parentrevs(rev) 1544 if base == nullrev:
1544 if deltap in (p1, p2): 1545 return True
1546 p1 = entry[5]
1547 p2 = entry[6]
1548 if base == p1 or base == p2:
1545 return False 1549 return False
1546 return self.issnapshot(deltap) 1550 return self.issnapshot(base)
1547 1551
1548 def snapshotdepth(self, rev): 1552 def snapshotdepth(self, rev):
1549 """number of snapshot in the chain before this one""" 1553 """number of snapshot in the chain before this one"""
1550 if not self.issnapshot(rev): 1554 if not self.issnapshot(rev):
1551 raise error.ProgrammingError('revision %d not a snapshot') 1555 raise error.ProgrammingError('revision %d not a snapshot')