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 @@ -10,16 +10,18 @@ """ import datetime -from itertools import chain +import itertools + from rhodecode.lib.vcs.utils import author_name, author_email from rhodecode.lib.vcs.utils.lazy import LazyProperty from rhodecode.lib.vcs.utils.helpers import get_dict_for_attrs from rhodecode.lib.vcs.conf import settings -from rhodecode.lib.vcs.exceptions import ChangesetError, EmptyRepositoryError, \ - NodeAlreadyAddedError, NodeAlreadyChangedError, NodeAlreadyExistsError, \ - NodeAlreadyRemovedError, NodeDoesNotExistError, NodeNotChangedError, \ - RepositoryError +from rhodecode.lib.vcs.exceptions import ( + ChangesetError, EmptyRepositoryError, NodeAlreadyAddedError, + NodeAlreadyChangedError, NodeAlreadyExistsError, NodeAlreadyRemovedError, + NodeDoesNotExistError, NodeNotChangedError, RepositoryError +) class BaseRepository(object): @@ -80,6 +82,13 @@ class BaseRepository(object): def __len__(self): return self.count() + def __eq__(self, other): + same_instance = isinstance(other, self.__class__) + return same_instance and getattr(other, 'path', None) == self.path + + def __ne__(self, other): + return not self.__eq__(other) + @LazyProperty def alias(self): for k, v in settings.BACKENDS.items(): @@ -844,7 +853,7 @@ class BaseInMemoryChangeset(object): Returns generator of paths from nodes marked as added, changed or removed. """ - for node in chain(self.added, self.changed, self.removed): + for node in itertools.chain(self.added, self.changed, self.removed): yield node.path def get_paths(self): @@ -995,3 +1004,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))