diff --git a/rhodecode/controllers/changelog.py b/rhodecode/controllers/changelog.py --- a/rhodecode/controllers/changelog.py +++ b/rhodecode/controllers/changelog.py @@ -69,19 +69,14 @@ class ChangelogController(BaseRepoContro 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 @@ class ChangelogController(BaseRepoContro 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 @@ class ChangelogController(BaseRepoContro 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) diff --git a/rhodecode/lib/vcs/backends/base.py b/rhodecode/lib/vcs/backends/base.py --- a/rhodecode/lib/vcs/backends/base.py +++ b/rhodecode/lib/vcs/backends/base.py @@ -1002,3 +1002,27 @@ class EmptyChangeset(BaseChangeset): 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)) diff --git a/rhodecode/lib/vcs/backends/git/repository.py b/rhodecode/lib/vcs/backends/git/repository.py --- a/rhodecode/lib/vcs/backends/git/repository.py +++ b/rhodecode/lib/vcs/backends/git/repository.py @@ -22,7 +22,7 @@ from dulwich.objects import Tag 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 @@ class GitRepository(BaseRepository): 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): diff --git a/rhodecode/lib/vcs/backends/hg/repository.py b/rhodecode/lib/vcs/backends/hg/repository.py --- a/rhodecode/lib/vcs/backends/hg/repository.py +++ b/rhodecode/lib/vcs/backends/hg/repository.py @@ -4,7 +4,7 @@ import datetime 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 @@ class MercurialRepository(BaseRepository 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): """