(Arne Babenhauserheide)
2010-08-15: Fix maximum recursion depth exceeded error: Fix maximum recursion depth exceeded error: factored out recursive parents function into a while and a for loop.
diff --git a/infocalypse/graph.py b/infocalypse/graph.py
--- a/infocalypse/graph.py
+++ b/infocalypse/graph.py
@@ -924,10 +924,11 @@ def build_version_table(graph, repo):
# Find most recent ancestors for version which are already in
# the version map. REDFLAG: fix. don't make reference to time
-def find_latest_bases(repo, version, version_map, traversed, base_revs):
- """ INTERNAL: Add latest known base revs for version to base_revs. """
- #print "find_latest_bases -- called: ", version[:12]
- assert version_map != {NULL_REV:FIRST_INDEX}
+def _check_base(repo, version, version_map, traversed, base_revs):
+ """ INTERNAL: Check for a given base,
+ if it's in traversed (do nothing)
+ or version map (add to base_revs).
+ If not one of these, return the parents."""
if version in traversed:
return
traversed.add(version)
@@ -936,8 +937,20 @@ def find_latest_bases(repo, version, ver
base_revs.add(version)
return
parents = [hexlify(parent.node()) for parent in repo[version].parents()]
- for parent in parents:
- find_latest_bases(repo, parent, version_map, traversed, base_revs)
+ return parents
+
+def find_latest_bases(repo, version, version_map, traversed, base_revs):
+ """ INTERNAL: Add latest known base revs for version to base_revs. """
+ #print "find_latest_bases -- called: ", version[:12]
+ assert version_map != {NULL_REV:FIRST_INDEX}
+ parents = _check_base(repo, version, version_map, traversed, base_revs)
+ while parents:
+ pas = parents[:]
+ parents = []
+ for parent in pas:
+ ps = _check_base(repo, parent, version_map, traversed, base_revs)
+ if ps is not None:
+ parents.extend(ps)
# REDFLAG: correct? I can't come up with a counter example.