changeset 3747:600ffde2634c beta

changelog pagination with branch filtering now uses common logic that non branch filtered version. - introduced CollectionGenerator object as a helper for achieving abstraction layer on top of filtered results
author Marcin Kuzminski <marcin@python-works.com>
date Sat, 13 Apr 2013 14:36:02 +0200
parents 76b935e7427d
children 9d743ca9cede
files rhodecode/controllers/changelog.py rhodecode/lib/vcs/backends/base.py rhodecode/lib/vcs/backends/git/repository.py rhodecode/lib/vcs/backends/hg/repository.py
diffstat 4 files changed, 54 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/controllers/changelog.py	Sat Apr 13 13:33:04 2013 +0200
+++ b/rhodecode/controllers/changelog.py	Sat Apr 13 14:36:02 2013 +0200
@@ -69,19 +69,14 @@
         p = safe_int(request.params.get('page', 1), 1)
         branch_name = request.params.get('branch', None)
         try:
-            if branch_name:
-                collection = [z for z in
-                              c.rhodecode_repo.get_changesets(start=0,
-                                                    branch_name=branch_name)]
-                c.total_cs = len(collection)
-            else:
-                collection = c.rhodecode_repo
-                c.total_cs = len(c.rhodecode_repo)
+            collection = c.rhodecode_repo.get_changesets(start=0,
+                                                    branch_name=branch_name)
+            c.total_cs = len(collection)
 
             c.pagination = RepoPage(collection, page=p, item_count=c.total_cs,
                                     items_per_page=c.size, branch=branch_name)
             collection = list(c.pagination)
-            page_revisions = [x.raw_id for x in collection]
+            page_revisions = [x.raw_id for x in c.pagination]
             c.comments = c.rhodecode_db_repo.get_comments(page_revisions)
             c.statuses = c.rhodecode_db_repo.statuses(page_revisions)
         except (RepositoryError, ChangesetDoesNotExistError, Exception), e:
@@ -89,12 +84,13 @@
             h.flash(str(e), category='error')
             return redirect(url('changelog_home', repo_name=c.repo_name))
 
-        self._graph(c.rhodecode_repo, collection, c.total_cs, c.size, p)
-
         c.branch_name = branch_name
         c.branch_filters = [('', _('All Branches'))] + \
             [(k, k) for k in c.rhodecode_repo.branches.keys()]
 
+        self._graph(c.rhodecode_repo, [x.revision for x in c.pagination],
+                    c.total_cs, c.size, p)
+
         return render('changelog/changelog.html')
 
     def changelog_details(self, cs):
@@ -102,20 +98,22 @@
             c.cs = c.rhodecode_repo.get_changeset(cs)
             return render('changelog/changelog_details.html')
 
-    def _graph(self, repo, collection, repo_size, size, p):
+    def _graph(self, repo, revs_int, repo_size, size, p):
         """
-        Generates a DAG graph for mercurial
+        Generates a DAG graph for repo
 
-        :param repo: repo instance
-        :param size: number of commits to show
-        :param p: page number
+        :param repo:
+        :param revs_int:
+        :param repo_size:
+        :param size:
+        :param p:
         """
-        if not collection:
+        if not revs_int:
             c.jsdata = json.dumps([])
             return
 
         data = []
-        revs = [x.revision for x in collection]
+        revs = revs_int
 
         dag = _dagwalker(repo, revs, repo.alias)
         dag = _colored(dag)
--- a/rhodecode/lib/vcs/backends/base.py	Sat Apr 13 13:33:04 2013 +0200
+++ b/rhodecode/lib/vcs/backends/base.py	Sat Apr 13 14:36:02 2013 +0200
@@ -1002,3 +1002,27 @@
 
     def get_file_size(self, path):
         return 0
+
+
+class CollectionGenerator(object):
+
+    def __init__(self, repo, revs):
+        self.repo = repo
+        self.revs = revs
+
+    def __len__(self):
+        return len(self.revs)
+
+    def __iter__(self):
+        for rev in self.revs:
+            yield self.repo.get_changeset(rev)
+
+    def __getslice__(self, i, j):
+        """
+        Returns a iterator of sliced repository
+        """
+        sliced_revs = self.revs[i:j]
+        return CollectionGenerator(self.repo, sliced_revs)
+
+    def __repr__(self):
+        return 'CollectionGenerator<%s>' % (len(self))
--- a/rhodecode/lib/vcs/backends/git/repository.py	Sat Apr 13 13:33:04 2013 +0200
+++ b/rhodecode/lib/vcs/backends/git/repository.py	Sat Apr 13 14:36:02 2013 +0200
@@ -22,7 +22,7 @@
 from string import Template
 
 import rhodecode
-from rhodecode.lib.vcs.backends.base import BaseRepository
+from rhodecode.lib.vcs.backends.base import BaseRepository, CollectionGenerator
 from rhodecode.lib.vcs.exceptions import BranchDoesNotExistError
 from rhodecode.lib.vcs.exceptions import ChangesetDoesNotExistError
 from rhodecode.lib.vcs.exceptions import EmptyRepositoryError
@@ -533,8 +533,7 @@
         revs = revs[start_pos:end_pos]
         if reverse:
             revs = reversed(revs)
-        for rev in revs:
-            yield self.get_changeset(rev)
+        return CollectionGenerator(self, revs)
 
     def get_diff(self, rev1, rev2, path=None, ignore_whitespace=False,
                  context=3):
--- a/rhodecode/lib/vcs/backends/hg/repository.py	Sat Apr 13 13:33:04 2013 +0200
+++ b/rhodecode/lib/vcs/backends/hg/repository.py	Sat Apr 13 14:36:02 2013 +0200
@@ -4,7 +4,7 @@
 import urllib
 import urllib2
 
-from rhodecode.lib.vcs.backends.base import BaseRepository
+from rhodecode.lib.vcs.backends.base import BaseRepository, CollectionGenerator
 from .workdir import MercurialWorkdir
 from .changeset import MercurialChangeset
 from .inmemory import MercurialInMemoryChangeset
@@ -474,24 +474,22 @@
         if end_pos is not None:
             end_pos += 1
         #filter branches
-
+        filter_ = []
         if branch_name:
-            revisions = scmutil.revrange(self._repo,
-                                         ['branch("%s")' % (branch_name)])
+            filter_.append('branch("%s")' % (branch_name))
+
+        if start_date:
+            filter_.append('date(">%s")' % start_date)
+        if end_date:
+            filter_.append('date("<%s")' % end_date)
+        if filter_:
+            revisions = scmutil.revrange(self._repo, filter_)
         else:
             revisions = self.revisions
-
-        slice_ = reversed(revisions[start_pos:end_pos]) if reverse else \
+        revs = reversed(revisions[start_pos:end_pos]) if reverse else \
                 revisions[start_pos:end_pos]
 
-        for id_ in slice_:
-            cs = self.get_changeset(id_)
-            if start_date and cs.date < start_date:
-                continue
-            if end_date and cs.date > end_date:
-                continue
-
-            yield cs
+        return CollectionGenerator(self, revs)
 
     def pull(self, url):
         """