comparison mercurial/revlog.py @ 9991:a7d11deb47dd

revlog: add fast path to ancestor
author Benoit Boissinot <benoit.boissinot@ens-lyon.org>
date Thu, 03 Dec 2009 01:01:49 +0100
parents a1943c2a4661
children 5b9709f81986
comparison
equal deleted inserted replaced
9990:c1d940d31aea 9991:a7d11deb47dd
1116 return node 1116 return node
1117 1117
1118 def ancestor(self, a, b): 1118 def ancestor(self, a, b):
1119 """calculate the least common ancestor of nodes a and b""" 1119 """calculate the least common ancestor of nodes a and b"""
1120 1120
1121 # fast path, check if it is a descendant
1122 a, b = self.rev(a), self.rev(b)
1123 start, end = sorted((a, b))
1124 for i in self.descendants(start):
1125 if i == end:
1126 return self.node(start)
1127 elif i > end:
1128 break
1129
1121 def parents(rev): 1130 def parents(rev):
1122 return [p for p in self.parentrevs(rev) if p != nullrev] 1131 return [p for p in self.parentrevs(rev) if p != nullrev]
1123 1132
1124 c = ancestor.ancestor(self.rev(a), self.rev(b), parents) 1133 c = ancestor.ancestor(a, b, parents)
1125 if c is None: 1134 if c is None:
1126 return nullid 1135 return nullid
1127 1136
1128 return self.node(c) 1137 return self.node(c)
1129 1138