# HG changeset patch # User Marcin Kuzminski # Date 1272413325 -7200 # Node ID cc5cf1a93902d08c4334dd816f6ba2aa851b290f # Parent b6e219f3a58d61d363e3cb5b62463809b410c27f Implemented simplehg middleware,moved make_ui functions to lib.utils diff -r b6e219f3a58d -r cc5cf1a93902 pylons_app/lib/simplehg.py --- 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 + + diff -r b6e219f3a58d -r cc5cf1a93902 pylons_app/lib/utils.py --- 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 + + +