Mercurial > kallithea
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,