changeset 4400:184159c21be2

vcs: replace recursive implementation of prev&next with iterative It was recursing over the repo and could give "maximum recursion depth exceeded". The implementation is still inefficient.
author Mads Kiilerich <madski@unity3d.com>
date Fri, 01 Aug 2014 20:28:42 +0200
parents 34a7bec2c525
children 4df61d1bd2d5
files kallithea/lib/vcs/backends/git/changeset.py kallithea/lib/vcs/backends/hg/changeset.py
diffstat 2 files changed, 28 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- a/kallithea/lib/vcs/backends/git/changeset.py	Fri Aug 01 20:28:42 2014 +0200
+++ b/kallithea/lib/vcs/backends/git/changeset.py	Fri Aug 01 20:28:42 2014 +0200
@@ -201,48 +201,40 @@
         return [self.repository.get_changeset(cs) for cs in children]
 
     def next(self, branch=None):
-
         if branch and self.branch != branch:
             raise VCSError('Branch option used on changeset not belonging '
                            'to that branch')
 
-        def _next(changeset, branch):
+        cs = self
+        while True:
             try:
-                next_ = changeset.revision + 1
-                next_rev = changeset.repository.revisions[next_]
+                next_ = cs.revision + 1
+                next_rev = cs.repository.revisions[next_]
             except IndexError:
                 raise ChangesetDoesNotExistError
-            cs = changeset.repository.get_changeset(next_rev)
+            cs = cs.repository.get_changeset(next_rev)
 
-            if branch and branch != cs.branch:
-                return _next(cs, branch)
-
-            return cs
-
-        return _next(self, branch)
+            if not branch or branch == cs.branch:
+                return cs
 
     def prev(self, branch=None):
         if branch and self.branch != branch:
             raise VCSError('Branch option used on changeset not belonging '
                            'to that branch')
 
-        def _prev(changeset, branch):
+        cs = self
+        while True:
             try:
-                prev_ = changeset.revision - 1
+                prev_ = cs.revision - 1
                 if prev_ < 0:
                     raise IndexError
-                prev_rev = changeset.repository.revisions[prev_]
+                prev_rev = cs.repository.revisions[prev_]
             except IndexError:
                 raise ChangesetDoesNotExistError
-
-            cs = changeset.repository.get_changeset(prev_rev)
+            cs = cs.repository.get_changeset(prev_rev)
 
-            if branch and branch != cs.branch:
-                return _prev(cs, branch)
-
-            return cs
-
-        return _prev(self, branch)
+            if not branch or branch == cs.branch:
+                return cs
 
     def diff(self, ignore_whitespace=True, context=3):
         rev1 = self.parents[0] if self.parents else self.repository.EMPTY_CHANGESET
--- a/kallithea/lib/vcs/backends/hg/changeset.py	Fri Aug 01 20:28:42 2014 +0200
+++ b/kallithea/lib/vcs/backends/hg/changeset.py	Fri Aug 01 20:28:42 2014 +0200
@@ -115,48 +115,40 @@
                 for child in self._ctx.children() if child.rev() >= 0]
 
     def next(self, branch=None):
-
         if branch and self.branch != branch:
             raise VCSError('Branch option used on changeset not belonging '
                            'to that branch')
 
-        def _next(changeset, branch):
+        cs = self
+        while True:
             try:
-                next_ = changeset.revision + 1
-                next_rev = changeset.repository.revisions[next_]
+                next_ = cs.revision + 1
+                next_rev = cs.repository.revisions[next_]
             except IndexError:
                 raise ChangesetDoesNotExistError
-            cs = changeset.repository.get_changeset(next_rev)
+            cs = cs.repository.get_changeset(next_rev)
 
-            if branch and branch != cs.branch:
-                return _next(cs, branch)
-
-            return cs
-
-        return _next(self, branch)
+            if not branch or branch == cs.branch:
+                return cs
 
     def prev(self, branch=None):
         if branch and self.branch != branch:
             raise VCSError('Branch option used on changeset not belonging '
                            'to that branch')
 
-        def _prev(changeset, branch):
+        cs = self
+        while True:
             try:
-                prev_ = changeset.revision - 1
+                prev_ = cs.revision - 1
                 if prev_ < 0:
                     raise IndexError
-                prev_rev = changeset.repository.revisions[prev_]
+                prev_rev = cs.repository.revisions[prev_]
             except IndexError:
                 raise ChangesetDoesNotExistError
-
-            cs = changeset.repository.get_changeset(prev_rev)
+            cs = cs.repository.get_changeset(prev_rev)
 
-            if branch and branch != cs.branch:
-                return _prev(cs, branch)
-
-            return cs
-
-        return _prev(self, branch)
+            if not branch or branch == cs.branch:
+                return cs
 
     def diff(self, ignore_whitespace=True, context=3):
         return ''.join(self._ctx.diff(git=True,