view pylons_app/lib/simplehg.py @ 116:345811faa8a0

Changed simplehg middleware repo name function
author Marcin Kuzminski <marcin@python-works.com>
date Wed, 28 Apr 2010 22:09:33 +0200
parents cc5cf1a93902
children f8ae5c1dfae2
line wrap: on
line source

import os
from mercurial.hgweb import hgweb
from mercurial.hgweb.request import wsgiapplication
from pylons_app.lib.utils import make_ui
class SimpleHg(object):

    def __init__(self, application, config):
        self.application = application
        self.config = config
        
    def __call__(self, environ, start_response):
        if not is_mercurial(environ):
            return self.application(environ, start_response)
        else:
            #repo_name = environ['PATH_INFO'].replace('/', '')
            repo_name = environ['PATH_INFO'].split('/')[1]
            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)            

    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
    ``HTTP_ACCEPT`` of such request would start with ``application/mercurial``.
    """
    http_accept = environ.get('HTTP_ACCEPT')
    if http_accept and http_accept.startswith('application/mercurial'):
        return True
    return False