changeset 604:5cc96df705b9

fixed @repo into :repo for docs fixed routes descriptions
author Marcin Kuzminski <marcin@python-works.com>
date Mon, 18 Oct 2010 03:04:58 +0200
parents 95a502d94860
children 72bed56219d6
files rhodecode/config/routing.py rhodecode/controllers/admin/repos.py rhodecode/lib/auth.py rhodecode/lib/helpers.py rhodecode/lib/hooks.py rhodecode/lib/indexers/__init__.py rhodecode/lib/pidlock.py rhodecode/lib/smtp_mailer.py rhodecode/lib/utils.py
diffstat 9 files changed, 123 insertions(+), 103 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/config/routing.py	Mon Oct 18 01:14:40 2010 +0200
+++ b/rhodecode/config/routing.py	Mon Oct 18 03:04:58 2010 +0200
@@ -1,4 +1,5 @@
-"""Routes configuration
+"""
+Routes configuration
 
 The more specific and detailed routes should be defined first so they
 may take precedent over the more generic routes. For more information
@@ -15,24 +16,28 @@
     map.minimization = False
     map.explicit = False
 
+    def check_repo(environ, match_dict):
+        """
+        check for valid repository for proper 404 handling
+        :param environ:
+        :param match_dict:
+        """
+        repo_name = match_dict.get('repo_name')
+        return not cr(repo_name, config['base_path'])
+
     # The ErrorController route (handles 404/500 error pages); it should
     # likely stay at the top, ensuring it can always be resolved
     map.connect('/error/{action}', controller='error')
     map.connect('/error/{action}/{id}', controller='error')
 
+    #==========================================================================
     # CUSTOM ROUTES HERE
+    #==========================================================================
+
+    #MAIN PAGE
     map.connect('hg_home', '/', controller='hg', action='index')
-    
-    def check_repo(environ, match_dict):
-        """
-        check for valid repository for proper 404 handling
-        @param environ:
-        @param match_dict:
-        """
-        repo_name = match_dict.get('repo_name')
-        return not cr(repo_name, config['base_path'])
- 
-    #REST REPO MAP
+
+    #ADMIN REPOSITORY REST ROUTES
     with map.submapper(path_prefix='/_admin', controller='admin/repos') as m:
         m.connect("repos", "/repos",
              action="create", conditions=dict(method=["POST"]))
@@ -67,11 +72,14 @@
         m.connect('delete_repo_user', "/repos_delete_user/{repo_name:.*}",
              action="delete_perm_user", conditions=dict(method=["DELETE"],
                                                         function=check_repo))
-        
+
+    #ADMIN USER REST ROUTES
     map.resource('user', 'users', controller='admin/users', path_prefix='/_admin')
+
+    #ADMIN PERMISSIONS REST ROUTES
     map.resource('permission', 'permissions', controller='admin/permissions', path_prefix='/_admin')
-    
-    #REST SETTINGS MAP
+
+    #ADMIN SETTINGS REST ROUTES
     with map.submapper(path_prefix='/_admin', controller='admin/settings') as m:
         m.connect("admin_settings", "/settings",
              action="create", conditions=dict(method=["POST"]))
@@ -101,8 +109,8 @@
              action="my_account_update", conditions=dict(method=["PUT"]))
         m.connect("admin_settings_create_repository", "/create_repository",
              action="create_repository", conditions=dict(method=["GET"]))
-    
-    #ADMIN
+
+    #ADMIN MAIN PAGES
     with map.submapper(path_prefix='/_admin', controller='admin/admin') as m:
         m.connect('admin_home', '', action='index')#main page
         m.connect('admin_add_repo', '/add_repo/{new_repo:[a-z0-9\. _-]*}',
@@ -110,13 +118,13 @@
     #SEARCH
     map.connect('search', '/_admin/search', controller='search',)
     map.connect('search_repo', '/_admin/search/{search_repo:.*}', controller='search')
-    
+
     #LOGIN/LOGOUT/REGISTER/SIGN IN
     map.connect('login_home', '/_admin/login', controller='login')
     map.connect('logout_home', '/_admin/logout', controller='login', action='logout')
     map.connect('register', '/_admin/register', controller='login', action='register')
     map.connect('reset_password', '/_admin/password_reset', controller='login', action='password_reset')
-        
+
     #FEEDS
     map.connect('rss_feed_home', '/{repo_name:.*}/feed/rss',
                 controller='feed', action='rss',
@@ -124,9 +132,9 @@
     map.connect('atom_feed_home', '/{repo_name:.*}/feed/atom',
                 controller='feed', action='atom',
                 conditions=dict(function=check_repo))
-    
-    
-    #OTHERS
+
+
+    #REPOSITORY ROUTES
     map.connect('changeset_home', '/{repo_name:.*}/changeset/{revision}',
                 controller='changeset', revision='tip',
                 conditions=dict(function=check_repo))
@@ -142,7 +150,7 @@
     map.connect('tags_home', '/{repo_name:.*}/tags',
                 controller='tags', conditions=dict(function=check_repo))
     map.connect('changelog_home', '/{repo_name:.*}/changelog',
-                controller='changelog', conditions=dict(function=check_repo))    
+                controller='changelog', conditions=dict(function=check_repo))
     map.connect('files_home', '/{repo_name:.*}/files/{revision}/{f_path:.*}',
                 controller='files', revision='tip', f_path='',
                 conditions=dict(function=check_repo))
@@ -157,10 +165,10 @@
                 conditions=dict(function=check_repo))
     map.connect('files_annotate_home', '/{repo_name:.*}/annotate/{revision}/{f_path:.*}',
                 controller='files', action='annotate', revision='tip', f_path='',
-                conditions=dict(function=check_repo))    
+                conditions=dict(function=check_repo))
     map.connect('files_archive_home', '/{repo_name:.*}/archive/{revision}/{fileformat}',
                 controller='files', action='archivefile', revision='tip',
-                conditions=dict(function=check_repo))   
+                conditions=dict(function=check_repo))
     map.connect('repo_settings_delete', '/{repo_name:.*}/settings',
                 controller='settings', action="delete",
                 conditions=dict(method=["DELETE"], function=check_repo))
@@ -177,5 +185,5 @@
     map.connect('repo_fork_home', '/{repo_name:.*}/fork',
                 controller='settings', action='fork',
                 conditions=dict(function=check_repo))
-        
+
     return map
--- a/rhodecode/controllers/admin/repos.py	Mon Oct 18 01:14:40 2010 +0200
+++ b/rhodecode/controllers/admin/repos.py	Mon Oct 18 03:04:58 2010 +0200
@@ -193,7 +193,7 @@
     def delete_perm_user(self, repo_name):
         """
         DELETE an existing repository permission user
-        @param repo_name:
+        :param repo_name:
         """
         
         try:
--- a/rhodecode/lib/auth.py	Mon Oct 18 01:14:40 2010 +0200
+++ b/rhodecode/lib/auth.py	Mon Oct 18 03:04:58 2010 +0200
@@ -66,7 +66,7 @@
     
 def get_crypt_password(password):
     """Cryptographic function used for password hashing based on sha1
-    @param password: password to hash
+    :param password: password to hash
     """    
     return bcrypt.hashpw(password, bcrypt.gensalt(10))
 
@@ -120,7 +120,7 @@
     permission given in db. We don't wannt to check each time from db for new 
     permissions since adding a new permission also requires application restart
     ie. to decorate new views with the newly created permission
-    @param config:
+    :param config:
     """
     log.info('getting information about all available permissions')
     try:
@@ -138,7 +138,7 @@
     """
     Fills user data with those from database and log out user if not present
     in database
-    @param user:
+    :param user:
     """
     sa = meta.Session
     dbuser = sa.query(User).get(user.user_id)
@@ -156,7 +156,7 @@
 def fill_perms(user):
     """
     Fills user permission attribute with permissions taken from database
-    @param user:
+    :param user:
     """
     
     sa = meta.Session
@@ -228,7 +228,7 @@
 def get_user(session):
     """
     Gets user from session, and wraps permissions into user
-    @param session:
+    :param session:
     """
     user = session.get('rhodecode_user', AuthUser())
     if user.is_authenticated:
--- a/rhodecode/lib/helpers.py	Mon Oct 18 01:14:40 2010 +0200
+++ b/rhodecode/lib/helpers.py	Mon Oct 18 03:04:58 2010 +0200
@@ -28,8 +28,8 @@
 class _Link(object):
     '''
     Make a url based on label and url with help of url_for
-    @param label:name of link    if not defined url is used
-    @param url: the url for link
+    :param label:name of link    if not defined url is used
+    :param url: the url for link
     '''
 
     def __call__(self, label='', *url_, **urlargs):
@@ -52,8 +52,8 @@
 def recursive_replace(str, replace=' '):
     """
     Recursive replace of given sign to just one instance
-    @param str: given string
-    @param replace:char to find and replace multiple instances
+    :param str: given string
+    :param replace:char to find and replace multiple instances
         
     Examples::
     >>> recursive_replace("Mighty---Mighty-Bo--sstones",'-')
@@ -72,7 +72,7 @@
         """
         Special function just to wrap our text into nice formatted autowrapped
         text
-        @param tooltip_title:
+        :param tooltip_title:
         """
         
         return wrap_paragraphs(escape(tooltip_title), trim_at)\
@@ -226,7 +226,7 @@
 def pygmentize(filenode, **kwargs):
     """
     pygmentize function using pygments
-    @param filenode:
+    :param filenode:
     """
     return literal(code_highlight(filenode.content,
                                   filenode.lexer, CodeHtmlFormatter(**kwargs)))
@@ -234,7 +234,7 @@
 def pygmentize_annotation(filenode, **kwargs):
     """
     pygmentize function for annotation
-    @param filenode:
+    :param filenode:
     """
     
     color_dict = {}
--- a/rhodecode/lib/hooks.py	Mon Oct 18 01:14:40 2010 +0200
+++ b/rhodecode/lib/hooks.py	Mon Oct 18 03:04:58 2010 +0200
@@ -53,9 +53,9 @@
 def user_action_mapper(ui, repo, hooktype=None, **kwargs):
     """
     Maps user last push action to new changeset id, from mercurial
-    @param ui:
-    @param repo:
-    @param hooktype:
+    :param ui:
+    :param repo:
+    :param hooktype:
     """
     
     try:
--- a/rhodecode/lib/indexers/__init__.py	Mon Oct 18 01:14:40 2010 +0200
+++ b/rhodecode/lib/indexers/__init__.py	Mon Oct 18 03:04:58 2010 +0200
@@ -115,8 +115,8 @@
         Smart function that implements chunking the content
         but not overlap chunks so it doesn't highlight the same
         close occurrences twice.
-        @param matcher:
-        @param size:
+        :param matcher:
+        :param size:
         """
         memory = [(0, 0)]
         for span in self.matcher.spans():
--- a/rhodecode/lib/pidlock.py	Mon Oct 18 01:14:40 2010 +0200
+++ b/rhodecode/lib/pidlock.py	Mon Oct 18 03:04:58 2010 +0200
@@ -109,8 +109,8 @@
     def makelock(self, lockname, pidfile):
         """
         this function will make an actual lock
-        @param lockname: acctual pid of file
-        @param pidfile: the file to write the pid in
+        :param lockname: acctual pid of file
+        :param pidfile: the file to write the pid in
         """
         if self.debug:
             print 'creating a file %s and pid: %s' % (pidfile, lockname)
--- a/rhodecode/lib/smtp_mailer.py	Mon Oct 18 01:14:40 2010 +0200
+++ b/rhodecode/lib/smtp_mailer.py	Mon Oct 18 03:04:58 2010 +0200
@@ -108,7 +108,7 @@
         '''
         Get content based on type, if content is a string do open first
         else just read because it's a probably open file object
-        @param msg_file:
+        :param msg_file:
         '''
         if isinstance(msg_file, str):
             return open(msg_file, "rb").read()
--- a/rhodecode/lib/utils.py	Mon Oct 18 01:14:40 2010 +0200
+++ b/rhodecode/lib/utils.py	Mon Oct 18 03:04:58 2010 +0200
@@ -36,7 +36,7 @@
 log = logging.getLogger(__name__)
 
 
-def get_repo_slug(request):    
+def get_repo_slug(request):
     return request.environ['pylons.routes_dict'].get('repo_name')
 
 def is_mercurial(environ):
@@ -49,14 +49,26 @@
         return True
     return False
 
+def is_git(environ):
+    """
+    Returns True if request's target is git server. ``HTTP_USER_AGENT`` would
+    then have git client version given.
+    
+    :param environ:
+    """
+    http_user_agent = environ.get('HTTP_USER_AGENT')
+    if http_user_agent.startswith('git'):
+        return True
+    return False
+
 def action_logger(user, action, repo, ipaddr, sa=None):
     """
     Action logger for various action made by users
     """
-    
+
     if not sa:
-        sa = meta.Session 
-        
+        sa = meta.Session
+
     try:
         if hasattr(user, 'user_id'):
             user_id = user.user_id
@@ -64,7 +76,7 @@
             user_id = sa.query(User).filter(User.username == user).one()
         else:
             raise Exception('You have to provide user object or username')
-       
+
         repo_name = repo.lstrip('/')
         user_log = UserLog()
         user_log.user_id = user_id
@@ -82,7 +94,7 @@
         raise
         sa.rollback()
         log.error('could not log user action:%s', str(e))
-                
+
 def check_repo_dir(paths):
     repos_path = paths[0][1].split('/')
     if repos_path[-1] in ['*', '**']:
@@ -122,7 +134,7 @@
         retries = retries - 1
         if retries < 0: raise IOError
         print complaint
-        
+
 @cache_region('super_short_term', 'cached_hg_ui')
 def get_hg_ui_cached():
     try:
@@ -139,13 +151,13 @@
         ret = sa.query(RhodeCodeSettings).all()
     finally:
         meta.Session.remove()
-        
+
     if not ret:
         raise Exception('Could not get application settings !')
     settings = {}
     for each in ret:
-        settings['rhodecode_' + each.app_settings_name] = each.app_settings_value    
-    
+        settings['rhodecode_' + each.app_settings_name] = each.app_settings_value
+
     return settings
 
 def get_hg_ui_settings():
@@ -154,7 +166,7 @@
         ret = sa.query(RhodeCodeUi).all()
     finally:
         meta.Session.remove()
-        
+
     if not ret:
         raise Exception('Could not get application ui settings !')
     settings = {}
@@ -163,15 +175,15 @@
         v = each.ui_value
         if k == '/':
             k = 'root_path'
-        
+
         if k.find('.') != -1:
             k = k.replace('.', '_')
-        
+
         if each.ui_section == 'hooks':
             v = each.ui_active
-        
-        settings[each.ui_section + '_' + k] = v  
-    
+
+        settings[each.ui_section + '_' + k] = v
+
     return settings
 
 #propagated from mercurial documentation
@@ -185,15 +197,15 @@
                 'paths', 'profiling',
                 'server', 'trusted',
                 'ui', 'web', ]
-        
-def make_ui(read_from='file', path=None, checkpaths=True):        
+
+def make_ui(read_from='file', path=None, checkpaths=True):
     """
     A function that will read python rc files or database
     and make an mercurial ui object from read options
     
-    @param path: path to mercurial config file
-    @param checkpaths: check the path
-    @param read_from: read from 'file' or 'db'
+    :param path: path to mercurial config file
+    :param checkpaths: check the path
+    :param read_from: read from 'file' or 'db'
     """
 
     baseui = ui.ui()
@@ -209,52 +221,52 @@
             for k, v in cfg.items(section):
                 baseui.setconfig(section, k, v)
                 log.debug('settings ui from file[%s]%s:%s', section, k, v)
-        if checkpaths:check_repo_dir(cfg.items('paths'))                
-              
-        
+        if checkpaths:check_repo_dir(cfg.items('paths'))
+
+
     elif read_from == 'db':
         hg_ui = get_hg_ui_cached()
         for ui_ in hg_ui:
             if ui_.ui_active:
                 log.debug('settings ui from db[%s]%s:%s', ui_.ui_section, ui_.ui_key, ui_.ui_value)
                 baseui.setconfig(ui_.ui_section, ui_.ui_key, ui_.ui_value)
-        
-    
+
+
     return baseui
 
 
 def set_rhodecode_config(config):
     hgsettings = get_hg_settings()
-    
+
     for k, v in hgsettings.items():
         config[k] = v
 
 def invalidate_cache(name, *args):
     """Invalidates given name cache"""
-    
+
     from beaker.cache import region_invalidate
     log.info('INVALIDATING CACHE FOR %s', name)
-    
+
     """propagate our arguments to make sure invalidation works. First
     argument has to be the name of cached func name give to cache decorator
     without that the invalidation would not work"""
     tmp = [name]
     tmp.extend(args)
     args = tuple(tmp)
-    
+
     if name == 'cached_repo_list':
         from rhodecode.model.hg_model import _get_repos_cached
         region_invalidate(_get_repos_cached, None, *args)
-        
+
     if name == 'full_changelog':
         from rhodecode.model.hg_model import _full_changelog_cached
         region_invalidate(_full_changelog_cached, None, *args)
-        
+
 class EmptyChangeset(BaseChangeset):
     """
     An dummy empty changeset.
     """
-    
+
     revision = -1
     message = ''
     author = ''
@@ -266,35 +278,35 @@
         representation.
         """
         return '0' * 40
-    
+
     @LazyProperty
     def short_id(self):
         return self.raw_id[:12]
 
     def get_file_changeset(self, path):
         return self
-    
+
     def get_file_content(self, path):
         return u''
-    
+
     def get_file_size(self, path):
         return 0
-    
+
 def repo2db_mapper(initial_repo_list, remove_obsolete=False):
     """
     maps all found repositories into db
     """
     from rhodecode.model.repo_model import RepoModel
-    
+
     sa = meta.Session
     user = sa.query(User).filter(User.admin == True).first()
-    
+
     rm = RepoModel()
-    
+
     for name, repo in initial_repo_list.items():
         if not sa.query(Repository).filter(Repository.repo_name == name).scalar():
             log.info('repository %s not found creating default', name)
-                
+
             form_data = {
                          'repo_name':name,
                          'description':repo.description if repo.description != 'unknown' else \
@@ -311,7 +323,7 @@
                 sa.delete(repo)
                 sa.commit()
 
-    
+
     meta.Session.remove()
 
 from UserDict import DictMixin
@@ -421,25 +433,25 @@
 #===============================================================================
 def create_test_index(repo_location, full_index):
     """Makes default test index
-    @param repo_location:
-    @param full_index:
+    :param repo_location:
+    :param full_index:
     """
     from rhodecode.lib.indexers.daemon import WhooshIndexingDaemon
     from rhodecode.lib.pidlock import DaemonLock, LockHeld
     from rhodecode.lib.indexers import IDX_LOCATION
     import shutil
-    
+
     if os.path.exists(IDX_LOCATION):
         shutil.rmtree(IDX_LOCATION)
-         
+
     try:
         l = DaemonLock()
         WhooshIndexingDaemon(repo_location=repo_location)\
             .run(full_index=full_index)
         l.release()
     except LockHeld:
-        pass    
-    
+        pass
+
 def create_test_env(repos_test_path, config):
     """Makes a fresh database and 
     install test repository into tmp dir
@@ -448,7 +460,7 @@
     import tarfile
     import shutil
     from os.path import dirname as dn, join as jn, abspath
-    
+
     log = logging.getLogger('TestEnvCreator')
     # create logger
     log.setLevel(logging.DEBUG)
@@ -456,20 +468,20 @@
     # create console handler and set level to debug
     ch = logging.StreamHandler()
     ch.setLevel(logging.DEBUG)
-    
+
     # create formatter
     formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
-    
+
     # add formatter to ch
     ch.setFormatter(formatter)
-    
+
     # add ch to logger
     log.addHandler(ch)
-    
+
     #PART ONE create db
     dbname = config['sqlalchemy.db1.url'].split('/')[-1]
     log.debug('making test db %s', dbname)
-    
+
     dbmanage = DbManage(log_sql=True, dbname=dbname, root=config['here'],
                         tests=True)
     dbmanage.create_tables(override=True)
@@ -478,12 +490,12 @@
     dbmanage.admin_prompt()
     dbmanage.create_permissions()
     dbmanage.populate_default_permissions()
-    
+
     #PART TWO make test repo
     log.debug('making test vcs repo')
     if os.path.isdir('/tmp/vcs_test'):
         shutil.rmtree('/tmp/vcs_test')
-        
+
     cur_dir = dn(dn(abspath(__file__)))
     tar = tarfile.open(jn(cur_dir, 'tests', "vcs_test.tar.gz"))
     tar.extractall('/tmp')