We were recursively removing from self.heads; rewrite this such we try
removing heads this in a loop.
This gives a nice performance boost.
def ack(self, sha):
"""Ack that a revision and its ancestors are present in the source."""
- if sha in self.heads:
- self.heads.remove(sha)
- if sha in self.parents:
- for p in self.parents[sha]:
- self.ack(p)
+ ancestors = set([sha])
+
+ # stop if we run out of heads to remove
+ while self.heads:
+ for a in ancestors:
+ if a in self.heads:
+ self.heads.remove(a)
+
+ # collect all ancestors
+ new_ancestors = set()
+ for a in ancestors:
+ if a in self.parents:
+ new_ancestors.update(self.parents[a])
+
+ # no more ancestors; stop
+ if not new_ancestors:
+ break
+
+ ancestors = new_ancestors
def next(self):
"""Iterate over ancestors of heads in the target."""