changeset 114:cc5cf1a93902

Implemented simplehg middleware,moved make_ui functions to lib.utils
author Marcin Kuzminski <marcin@python-works.com>
date Wed, 28 Apr 2010 02:08:45 +0200
parents b6e219f3a58d
children 8c038e588a42
files pylons_app/lib/simplehg.py pylons_app/lib/utils.py
diffstat 2 files changed, 87 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/pylons_app/lib/simplehg.py	Wed Apr 28 01:56:11 2010 +0200
+++ b/pylons_app/lib/simplehg.py	Wed Apr 28 02:08:45 2010 +0200
@@ -1,13 +1,7 @@
 import os
-
-import cgi
-from mercurial import util
-from mercurial.hgweb.request import wsgirequest, normalize
 from mercurial.hgweb import hgweb
-from pylons.controllers.util import Response
 from mercurial.hgweb.request import wsgiapplication
-
-
+from pylons_app.lib.utils import make_ui
 class SimpleHg(object):
 
     def __init__(self, application, config):
@@ -18,14 +12,33 @@
         if not is_mercurial(environ):
             return self.application(environ, start_response)
         else:
-            from pprint import pprint
-            pprint(environ)
+            repo_name = environ['PATH_INFO'].replace('/', '')
+            if not environ['PATH_INFO'].endswith == '/':
+                environ['PATH_INFO'] += '/'
+            #environ['SCRIPT_NAME'] = request.path
+            environ['PATH_INFO'] = '/'
+            self.baseui = make_ui()
+            self.basepath = self.baseui.configitems('paths')[0][1].replace('*', '')
+            self.repo_path = os.path.join(self.basepath, repo_name)
+            app = wsgiapplication(self._make_app)
+            return app(environ, start_response)            
 
-            repo_path = os.path.join('/home/marcink/python_workspace/', environ['PATH_INFO'].replace('/', ''))
-            def _make_app():return hgweb(repo_path, "Name")
-            app = wsgiapplication(_make_app)
-            return app(environ, start_response)            
+    def _make_app(self):
+        hgserve = hgweb(self.repo_path)
+        return  self.load_web_settings(hgserve)
+        
                 
+    def load_web_settings(self, hgserve):
+        repoui = make_ui(os.path.join(self.repo_path, '.hg', 'hgrc'), False)
+        #set the global ui for hgserve
+        hgserve.repo.ui = self.baseui
+        
+        if repoui:
+            #set the repository based config
+            hgserve.repo.ui = repoui
+            
+        return hgserve
+                                
 def is_mercurial(environ):
     """
     Returns True if request's target is mercurial server - header
@@ -35,3 +48,5 @@
     if http_accept and http_accept.startswith('application/mercurial'):
         return True
     return False
+
+
--- a/pylons_app/lib/utils.py	Wed Apr 28 01:56:11 2010 +0200
+++ b/pylons_app/lib/utils.py	Wed Apr 28 02:08:45 2010 +0200
@@ -1,3 +1,6 @@
+from mercurial import ui, config
+import os
+import logging
    
 def get_repo_slug(request):
     path_info = request.environ.get('PATH_INFO')
@@ -14,3 +17,59 @@
     if http_accept and http_accept.startswith('application/mercurial'):
         return True
     return False
+
+def check_repo_dir(paths):
+    repos_path = paths[0][1].split('/')
+    if repos_path[-1] in ['*', '**']:
+        repos_path = repos_path[:-1]
+    if repos_path[0] != '/':
+        repos_path[0] = '/'
+    if not os.path.isdir(os.path.join(*repos_path)):
+        raise Exception('Not a valid repository in %s' % paths[0][1])
+        
+def make_ui(path='hgwebdir.config', checkpaths=True):        
+    """
+    A funcion that will read python rc files and make an ui from read options
+    
+    @param path: path to mercurial config file
+    """
+    if not os.path.isfile(path):
+        logging.error('Unable to read config file %s' % path)
+        return False
+    #propagated from mercurial documentation
+    sections = [
+                'alias',
+                'auth',
+                'decode/encode',
+                'defaults',
+                'diff',
+                'email',
+                'extensions',
+                'format',
+                'merge-patterns',
+                'merge-tools',
+                'hooks',
+                'http_proxy',
+                'smtp',
+                'patch',
+                'paths',
+                'profiling',
+                'server',
+                'trusted',
+                'ui',
+                'web',
+                ]
+
+    baseui = ui.ui()
+    cfg = config.config()
+    cfg.read(path)
+    if checkpaths:check_repo_dir(cfg.items('paths'))
+
+    for section in sections:
+        for k, v in cfg.items(section):
+            baseui.setconfig(section, k, v)
+    
+    return baseui
+
+
+