|
@@ -706,11 +706,25 @@ class ObjectStoreGraphWalker(object):
|
|
|
|
|
|
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."""
|