changeset 3835:42981614c624 beta

vcs: fixed issues with calling get_changesets method doesn't throws EmptyRepositoryError when called on empty repos
author Marcin Kuzminski <marcin@python-works.com>
date Fri, 10 May 2013 14:35:02 +0200
parents 2ad55d8ba11d
children 14a6e9ffd9c8
files rhodecode/lib/vcs/backends/git/repository.py rhodecode/lib/vcs/backends/hg/repository.py rhodecode/tests/vcs/test_changesets.py
diffstat 3 files changed, 30 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/lib/vcs/backends/git/repository.py	Thu May 09 22:51:53 2013 +0200
+++ b/rhodecode/lib/vcs/backends/git/repository.py	Fri May 10 14:35:02 2013 +0200
@@ -81,6 +81,18 @@
         except KeyError:
             return None
 
+    @property
+    def _empty(self):
+        """
+        Checks if repository is empty ie. without any changesets
+        """
+
+        try:
+            self.revisions[0]
+        except (KeyError, IndexError):
+            return True
+        return False
+
     @LazyProperty
     def revisions(self):
         """
@@ -250,9 +262,7 @@
 
         is_null = lambda o: len(o) == revision.count('0')
 
-        try:
-            self.revisions[0]
-        except (KeyError, IndexError):
+        if self._empty:
             raise EmptyRepositoryError("There are no changesets yet")
 
         if revision in (None, '', 'tip', 'HEAD', 'head', -1):
@@ -492,6 +502,11 @@
         if branch_name and branch_name not in self.branches:
             raise BranchDoesNotExistError("Branch '%s' not found" \
                                           % branch_name)
+        # actually we should check now if it's not an empty repo to not spaw
+        # subprocess commands
+        if self._empty:
+            raise EmptyRepositoryError("There are no changesets yet")
+
         # %H at format means (full) commit hash, initial hashes are retrieved
         # in ascending date order
         cmd_template = 'log --date-order --reverse --pretty=format:"%H"'
--- a/rhodecode/lib/vcs/backends/hg/repository.py	Thu May 09 22:51:53 2013 +0200
+++ b/rhodecode/lib/vcs/backends/hg/repository.py	Fri May 10 14:35:02 2013 +0200
@@ -78,7 +78,7 @@
     @property
     def _empty(self):
         """
-        Checks if repository is empty without any changesets
+        Checks if repository is empty ie. without any changesets
         """
         # TODO: Following raises errors when using InMemoryChangeset...
         # return len(self._repo.changelog) == 0
--- a/rhodecode/tests/vcs/test_changesets.py	Thu May 09 22:51:53 2013 +0200
+++ b/rhodecode/tests/vcs/test_changesets.py	Fri May 10 14:35:02 2013 +0200
@@ -1,5 +1,6 @@
 from __future__ import with_statement
 
+import time
 import datetime
 from rhodecode.lib import vcs
 from rhodecode.tests.vcs.base import BackendTestMixin
@@ -12,9 +13,10 @@
 )
 from rhodecode.lib.vcs.exceptions import (
     BranchDoesNotExistError, ChangesetDoesNotExistError,
-    RepositoryError
+    RepositoryError, EmptyRepositoryError
 )
 from rhodecode.lib.vcs.utils.compat import unittest
+from rhodecode.tests.vcs.conf import get_new_dir
 
 
 class TestBaseChangeset(unittest.TestCase):
@@ -197,6 +199,14 @@
         changesets = list(self.repo.get_changesets(start=2, end=3))
         self.assertEqual(len(changesets), 2)
 
+    def test_get_changesets_on_empty_repo_raises_EmptyRepository_error(self):
+        Backend = self.get_backend()
+        repo_path = get_new_dir(str(time.time()))
+        repo = Backend(repo_path, create=True)
+
+        with self.assertRaises(EmptyRepositoryError):
+            list(repo.get_changesets(start='foobar'))
+
     def test_get_changesets_includes_end_changeset(self):
         second_id = self.repo.revisions[1]
         changesets = list(self.repo.get_changesets(end=second_id))