changeset 1508:4aba7be311e8 beta

API added checks for a valid repository on pull command Added pre-check if repository have a remote_uri defines before pulling bugfix with no default arguments on api function added traceback when unhandled exception occurs on API
author Marcin Kuzminski <marcin@python-works.com>
date Sun, 02 Oct 2011 02:06:23 +0200
parents 7d687ed11929
children da886cc79907 3338a0994472
files rhodecode/controllers/api/__init__.py rhodecode/controllers/api/api.py rhodecode/model/db.py rhodecode/model/scm.py
diffstat 4 files changed, 37 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/controllers/api/__init__.py	Sat Oct 01 21:51:28 2011 +0300
+++ b/rhodecode/controllers/api/__init__.py	Sun Oct 02 02:06:23 2011 +0200
@@ -30,6 +30,7 @@
 import logging
 import types
 import urllib
+import traceback
 from itertools import izip_longest
 
 from paste.response import replace_header
@@ -135,8 +136,9 @@
         # self.kargs and dispatch control to WGIController
         argspec = inspect.getargspec(self._func)
         arglist = argspec[0][1:]
-        defaults = argspec[3]
+        defaults = argspec[3] or []
         default_empty = types.NotImplementedType
+        
         kwarglist = list(izip_longest(reversed(arglist),reversed(defaults),
                                 fillvalue=default_empty))
 
@@ -202,7 +204,7 @@
         except JSONRPCError as e:
             self._error = str(e)
         except Exception as e:
-            log.debug('Encountered unhandled exception: %s', repr(e))
+            log.error('Encountered unhandled exception: %s' % traceback.format_exc())
             json_exc = JSONRPCError('Internal server error')
             self._error = str(json_exc)
 
--- a/rhodecode/controllers/api/api.py	Sat Oct 01 21:51:28 2011 +0300
+++ b/rhodecode/controllers/api/api.py	Sun Oct 02 02:06:23 2011 +0200
@@ -5,7 +5,7 @@
 from rhodecode.lib.auth import HasPermissionAllDecorator
 from rhodecode.model.scm import ScmModel
 
-from rhodecode.model.db import User, UsersGroup
+from rhodecode.model.db import User, UsersGroup, Repository
 
 log = logging.getLogger(__name__)
 
@@ -36,6 +36,9 @@
         :param repo:
         """
 
+        if Repository.is_valid(repo) is False:
+            raise JSONRPCError('Unknown repo "%s"' % repo)
+        
         try:
             ScmModel().pull_changes(repo, self.rhodecode_user.username)
             return 'Pulled from %s' % repo
--- a/rhodecode/model/db.py	Sat Oct 01 21:51:28 2011 +0300
+++ b/rhodecode/model/db.py	Sun Oct 02 02:06:23 2011 +0200
@@ -499,6 +499,17 @@
     def get_repo_forks(cls, repo_id):
         return Session.query(cls).filter(Repository.fork_id == repo_id)
 
+    @classmethod
+    def base_path(cls):
+        """
+        Returns base path when all repos are stored
+        
+        :param cls:
+        """
+        q = Session.query(RhodeCodeUi).filter(RhodeCodeUi.ui_key == '/')
+        q.options(FromCache("sql_cache_short", "repository_repo_path"))
+        return q.one().ui_value
+
     @property
     def just_name(self):
         return self.repo_name.split(os.sep)[-1]
@@ -570,6 +581,19 @@
 
         return baseui
 
+    @classmethod
+    def is_valid(cls, repo_name):
+        """
+        returns True if given repo name is a valid filesystem repository
+         
+        @param cls:
+        @param repo_name:
+        """
+        from rhodecode.lib.utils import is_valid_repo
+
+        return is_valid_repo(repo_name, cls.base_path())
+
+
     #==========================================================================
     # SCM PROPERTIES
     #==========================================================================
--- a/rhodecode/model/scm.py	Sat Oct 01 21:51:28 2011 +0300
+++ b/rhodecode/model/scm.py	Sun Oct 02 02:06:23 2011 +0200
@@ -307,6 +307,10 @@
 
     def pull_changes(self, repo_name, username):
         dbrepo = Repository.by_repo_name(repo_name)
+        clone_uri = dbrepo.clone_uri
+        if not clone_uri:
+            raise Exception("This repository doesn't have a clone uri")
+        
         repo = dbrepo.scm_instance
         try:
             extras = {'ip': '',
@@ -318,13 +322,12 @@
             for k, v in extras.items():
                 repo._repo.ui.setconfig('rhodecode_extras', k, v)
 
-            repo.pull(dbrepo.clone_uri)
+            repo.pull(clone_uri)
             self.mark_for_invalidation(repo_name)
         except:
             log.error(traceback.format_exc())
             raise
 
-
     def commit_change(self, repo, repo_name, cs, user, author, message, content,
                       f_path):