view pylons_app/controllers/hg.py @ 10:525ed90e4577

major app speedup moved the wsgi creation to app globals, in order to make it run only once. little config changes.
author Marcin Kuzminski
date Sat, 20 Feb 2010 14:30:13 +0100
parents 3092016c6d0c
children 5f30a6d558dc
line wrap: on
line source

#!/usr/bin/python
# -*- coding: utf-8 -*-
import logging
from pylons_app.lib.base import BaseController
from pylons import c, g, session, h, request
from mako.template import Template
from pprint import pprint
import os
from mercurial import ui, hg
from mercurial.error import RepoError
from ConfigParser import ConfigParser

log = logging.getLogger(__name__)

class HgController(BaseController):
    def index(self):
        return g.hgapp(request.environ, self.start_response)

    def view(self, *args, **kwargs):
        return g.hgapp(request.environ, self.start_response)

    def add_repo(self, new_repo):
        tmpl = '''
                  <html>
                    <body>
                        %(msg)s%(new_repo)s!<br \>
                        <a href="/">repos</a>
                    </body>
                  </html>
                '''
        #extra check it can be add since it's the command
        if new_repo == 'add':
            return [tmpl % ({'new_repo':'', 'msg':'you basstard ! this repo is a command'})]

        new_repo = new_repo.replace(" ", "_")
        new_repo = new_repo.replace("-", "_")

        try:
            self._create_repo(new_repo)
        except Exception as e:
            return [tmpl % ({'new_repo':' Exception when adding: ' + new_repo, 'msg':str(e)})]

        return [tmpl % ({'new_repo':new_repo, 'msg':'added repo: '})]

    def _check_repo(self, repo_name):
        p = os.path.dirname(__file__)
        config_path = os.path.join(p, '../..', 'hgwebdir.config')

        cp = ConfigParser()

        cp.read(config_path)
        repos_path = cp.get('paths', '/').replace("**", '')

        if not repos_path:
            raise Exception('Could not read config !')

        self.repo_path = os.path.join(repos_path, repo_name)

        try:
            r = hg.repository(ui.ui(), self.repo_path)
            hg.verify(r)
            #here we hnow that repo exists it was verified
            log.info('%s repo is already created', repo_name)
            raise Exception('Repo exists')
        except RepoError:
            log.info('%s repo is free for creation', repo_name)
            #it means that there is no valid repo there...
            return True


    def _create_repo(self, repo_name):
        if repo_name in [None, '', 'add']:
            raise Exception('undefined repo_name of repo')

        if self._check_repo(repo_name):
            log.info('creating repo %s in %s', repo_name, self.repo_path)
            cmd = """mkdir %s && hg init %s""" \
                    % (self.repo_path, self.repo_path)
            os.popen(cmd)

#def _make_app():
#    #for single a repo
#    #return hgweb("/path/to/repo", "Name")
#    repos = "hgwebdir.config"
#    return  hgwebdir(repos)
#

#    def view(self, environ, start_response):
#        #the following is only needed when using hgwebdir
#        app = _make_app()
#        #return wsgi_app(environ, start_response)
#        response = app(request.environ, self.start_response)
#
#        if environ['PATH_INFO'].find("static") != -1:
#            return response
#        else:
#            #wrap the murcurial response in a mako template.
#            template = Template("".join(response),
#                                lookup = environ['pylons.pylons']\
#                                .config['pylons.g'].mako_lookup)
#
#            return template.render(g = g, c = c, session = session, h = h)