log --follow: use a set instead of a list
benchmarked with hg log -qf on the linux kernel:
before:
Time: real 39.010 secs (user 38.840+0.000 sys 0.060+0.000)
after:
Time: real 8.560 secs (user 8.440+0.000 sys 0.080+0.000)
--- a/mercurial/cmdutil.py Tue Dec 08 23:36:06 2009 +0100
+++ b/mercurial/cmdutil.py Thu Dec 10 00:14:22 2009 +0100
@@ -1169,7 +1169,7 @@
class followfilter(object):
def __init__(self, onlyfirst=False):
self.startrev = nullrev
- self.roots = []
+ self.roots = set()
self.onlyfirst = onlyfirst
def match(self, rev):
@@ -1187,18 +1187,18 @@
if rev > self.startrev:
# forward: all descendants
if not self.roots:
- self.roots.append(self.startrev)
+ self.roots.add(self.startrev)
for parent in realparents(rev):
if parent in self.roots:
- self.roots.append(rev)
+ self.roots.add(rev)
return True
else:
# backwards: all parents
if not self.roots:
- self.roots.extend(realparents(self.startrev))
+ self.roots.update(realparents(self.startrev))
if rev in self.roots:
self.roots.remove(rev)
- self.roots.extend(realparents(rev))
+ self.roots.update(realparents(rev))
return True
return False