# HG changeset patch # User Marcin Kuzminski # Date 1367504130 -7200 # Node ID a5c234e934c50ad9e9b99e9a179d232a5d2d398c # Parent e2ebd880835132cab3832d6eaf1bf6feb7d1ff1f synced with latest vcs diff -r e2ebd8808351 -r a5c234e934c5 rhodecode/lib/vcs/__init__.py --- a/rhodecode/lib/vcs/__init__.py Thu May 02 00:08:03 2013 +0200 +++ b/rhodecode/lib/vcs/__init__.py Thu May 02 16:15:30 2013 +0200 @@ -10,7 +10,7 @@ :copyright: (c) 2010-2011 by Marcin Kuzminski, Lukasz Balcerzak. """ -VERSION = (0, 4, 0, 'dev') +VERSION = (0, 5, 0, 'dev') __version__ = '.'.join((str(each) for each in VERSION[:4])) diff -r e2ebd8808351 -r a5c234e934c5 rhodecode/lib/vcs/backends/git/changeset.py --- a/rhodecode/lib/vcs/backends/git/changeset.py Thu May 02 00:08:03 2013 +0200 +++ b/rhodecode/lib/vcs/backends/git/changeset.py Thu May 02 16:15:30 2013 +0200 @@ -29,7 +29,7 @@ self.repository = repository try: - commit = self.repository._repo.get_object(revision) + commit = self.repository._repo[revision] if isinstance(commit, objects.Tag): revision = commit.object[1] commit = self.repository._repo.get_object(commit.object[1]) @@ -39,7 +39,6 @@ self.id = self.raw_id self.short_id = self.raw_id[:12] self._commit = commit - self._tree_id = commit.tree self._committer_property = 'committer' self._author_property = 'author' @@ -47,12 +46,14 @@ self._date_tz_property = 'commit_timezone' self.revision = repository.revisions.index(revision) - self.message = safe_unicode(commit.message) - self.nodes = {} self._paths = {} @LazyProperty + def message(self): + return safe_unicode(self._commit.message) + + @LazyProperty def committer(self): return safe_unicode(getattr(self._commit, self._committer_property)) diff -r e2ebd8808351 -r a5c234e934c5 rhodecode/lib/vcs/backends/git/repository.py --- a/rhodecode/lib/vcs/backends/git/repository.py Thu May 02 00:08:03 2013 +0200 +++ b/rhodecode/lib/vcs/backends/git/repository.py Thu May 02 16:15:30 2013 +0200 @@ -43,6 +43,8 @@ from .inmemory import GitInMemoryChangeset from .workdir import GitWorkdir +SHA_PATTERN = re.compile(r'^[[0-9a-fA-F]{12}|[0-9a-fA-F]{40}]$') + log = logging.getLogger(__name__) @@ -60,11 +62,13 @@ repo = self._get_repo(create, src_url, update_after_clone, bare) self.bare = repo.bare - self._config_files = [ - bare and abspath(self.path, 'config') - or abspath(self.path, '.git', 'config'), - abspath(get_user_home(), '.gitconfig'), - ] + @property + def _config_files(self): + return [ + self.bare and abspath(self.path, 'config') + or abspath(self.path, '.git', 'config'), + abspath(get_user_home(), '.gitconfig'), + ] @property def _repo(self): @@ -242,17 +246,19 @@ For git backend we always return integer here. This way we ensure that changset's revision attribute would become integer. """ - pattern = re.compile(r'^[[0-9a-fA-F]{12}|[0-9a-fA-F]{40}]$') - is_bstr = lambda o: isinstance(o, (str, unicode)) + is_null = lambda o: len(o) == revision.count('0') - if len(self.revisions) == 0: + try: + self.revisions[0] + except (KeyError, IndexError): raise EmptyRepositoryError("There are no changesets yet") if revision in (None, '', 'tip', 'HEAD', 'head', -1): - revision = self.revisions[-1] + return self.revisions[-1] - if ((is_bstr(revision) and revision.isdigit() and len(revision) < 12) + is_bstr = isinstance(revision, (str, unicode)) + if ((is_bstr and revision.isdigit() and len(revision) < 12) or isinstance(revision, int) or is_null(revision)): try: revision = self.revisions[int(revision)] @@ -260,23 +266,23 @@ raise ChangesetDoesNotExistError("Revision %s does not exist " "for this repository" % (revision)) - elif is_bstr(revision): + elif is_bstr: # get by branch/tag name _ref_revision = self._parsed_refs.get(revision) - _tags_shas = self.tags.values() if _ref_revision: # and _ref_revision[1] in ['H', 'RH', 'T']: return _ref_revision[0] + _tags_shas = self.tags.values() # maybe it's a tag ? we don't have them in self.revisions - elif revision in _tags_shas: + if revision in _tags_shas: return _tags_shas[_tags_shas.index(revision)] - elif not pattern.match(revision) or revision not in self.revisions: + elif not SHA_PATTERN.match(revision) or revision not in self.revisions: raise ChangesetDoesNotExistError("Revision %s does not exist " "for this repository" % (revision)) # Ensure we return full id - if not pattern.match(str(revision)): + if not SHA_PATTERN.match(str(revision)): raise ChangesetDoesNotExistError("Given revision %s not recognized" % revision) return revision diff -r e2ebd8808351 -r a5c234e934c5 rhodecode/lib/vcs/backends/hg/repository.py --- a/rhodecode/lib/vcs/backends/hg/repository.py Thu May 02 00:08:03 2013 +0200 +++ b/rhodecode/lib/vcs/backends/hg/repository.py Thu May 02 16:15:30 2013 +0200 @@ -492,10 +492,12 @@ if branch_name: filter_.append('branch("%s")' % (branch_name)) - if start_date: + if start_date and not end_date: filter_.append('date(">%s")' % start_date) - if end_date: + if end_date and not start_date: filter_.append('date("<%s")' % end_date) + if start_date and end_date: + filter_.append('date(">%s") and date("<%s")' % (start_date, end_date)) if filter_: revisions = scmutil.revrange(self._repo, filter_) else: diff -r e2ebd8808351 -r a5c234e934c5 rhodecode/tests/vcs/test_changesets.py --- a/rhodecode/tests/vcs/test_changesets.py Thu May 02 00:08:03 2013 +0200 +++ b/rhodecode/tests/vcs/test_changesets.py Thu May 02 16:15:30 2013 +0200 @@ -208,6 +208,14 @@ self.assertGreaterEqual(cs.date, start_date) def test_get_changesets_respects_end_date(self): + start_date = datetime.datetime(2010, 1, 1) + end_date = datetime.datetime(2010, 2, 1) + for cs in self.repo.get_changesets(start_date=start_date, + end_date=end_date): + self.assertGreaterEqual(cs.date, start_date) + self.assertLessEqual(cs.date, end_date) + + def test_get_changesets_respects_start_date_and_end_date(self): end_date = datetime.datetime(2010, 2, 1) for cs in self.repo.get_changesets(end_date=end_date): self.assertLessEqual(cs.date, end_date) diff -r e2ebd8808351 -r a5c234e934c5 rhodecode/tests/vcs/test_workdirs.py --- a/rhodecode/tests/vcs/test_workdirs.py Thu May 02 00:08:03 2013 +0200 +++ b/rhodecode/tests/vcs/test_workdirs.py Thu May 02 16:15:30 2013 +0200 @@ -49,8 +49,10 @@ author=u'joe', branch='foobar', ) + self.assertEqual(self.repo.workdir.get_branch(), self.default_branch) def test_get_changeset(self): + old_head = self.repo.get_changeset() self.imc.add(FileNode('docs/index.txt', content='Documentation\n')) head = self.imc.commit( @@ -58,8 +60,14 @@ author=u'joe', branch='foobar', ) + self.assertEqual(self.repo.workdir.get_branch(), self.default_branch) + self.repo.workdir.checkout_branch('foobar') self.assertEqual(self.repo.workdir.get_changeset(), head) + # Make sure that old head is still there after update to defualt branch + self.repo.workdir.checkout_branch(self.default_branch) + self.assertEqual(self.repo.workdir.get_changeset(), old_head) + def test_checkout_branch(self): from rhodecode.lib.vcs.exceptions import BranchDoesNotExistError # first, 'foobranch' does not exist.