Changeset - cc5cf1a93902
[Not reviewed]
default
0 2 0
Marcin Kuzminski - 16 years ago 2010-04-28 02:08:45
marcin@python-works.com
Implemented simplehg middleware,moved make_ui functions to lib.utils
2 files changed with 87 insertions and 13 deletions:
0 comments (0 inline, 0 general)
pylons_app/lib/simplehg.py
Show inline comments
 
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,13 +12,32 @@ class SimpleHg(object):
 
        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):
 
    """
 
@@ -35,3 +48,5 @@ def is_mercurial(environ):
 
    if http_accept and http_accept.startswith('application/mercurial'):
 
        return True
 
    return False
 

	
 

	
pylons_app/lib/utils.py
Show inline comments
 
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 @@ def is_mercurial(environ):
 
    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
 

	
 

	
 

	
0 comments (0 inline, 0 general)