From b12bb3ca3c9badc43fb39debe05eb917e5a3863a Mon Sep 17 00:00:00 2001
From: Henrik Levkowetz <henrik@levkowetz.com>
Date: Fri, 22 Dec 2017 19:28:59 +0000
Subject: [PATCH] Guard document replacement following methods against infinite
 recursion on circular relationships.  - Legacy-Id: 14457

---
 ietf/doc/utils.py | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/ietf/doc/utils.py b/ietf/doc/utils.py
index 5cd0efe00..2dcc88df4 100644
--- a/ietf/doc/utils.py
+++ b/ietf/doc/utils.py
@@ -650,22 +650,20 @@ def extract_complete_replaces_ancestor_mapping_for_docs(names):
 def make_rev_history(doc):
     # return document history data for inclusion in doc.json (used by timeline)
 
-    def get_predecessors(doc):
-        predecessors = []
+    def get_predecessors(doc, predecessors=[]):
         if hasattr(doc, 'relateddocument_set'):
             for alias in doc.related_that_doc('replaces'):
                 if alias.document not in predecessors:
                     predecessors.append(alias.document)
-                    predecessors.extend(get_predecessors(alias.document))
+                    predecessors.extend(get_predecessors(alias.document, predecessors))
         return predecessors
 
-    def get_ancestors(doc):
-        ancestors = []
+    def get_ancestors(doc, ancestors = []):
         if hasattr(doc, 'relateddocument_set'):
             for alias in doc.related_that('replaces'):
                 if alias.document not in ancestors:
                     ancestors.append(alias.document)
-                    ancestors.extend(get_ancestors(alias.document))
+                    ancestors.extend(get_ancestors(alias.document, ancestors))
         return ancestors
 
     def get_replaces_tree(doc):