changeset 3805:a5c234e934c5 beta

synced with latest vcs
author Marcin Kuzminski <marcin@python-works.com>
date Thu, 02 May 2013 16:15:30 +0200
parents e2ebd8808351
children 351cbe90d797
files rhodecode/lib/vcs/__init__.py rhodecode/lib/vcs/backends/git/changeset.py rhodecode/lib/vcs/backends/git/repository.py rhodecode/lib/vcs/backends/hg/repository.py rhodecode/tests/vcs/test_changesets.py rhodecode/tests/vcs/test_workdirs.py
diffstat 6 files changed, 47 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- 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]))
 
--- 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))
 
--- 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
--- 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:
--- 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)
--- 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.