Mercurial > kallithea
changeset 7722:0441afb55a96
middleware: move VCS specific functionality to the VCS apps
For Git, inline _handle_githooks into a wrapper app so it is simple and
explicit and executed exactly when the request is processed.
For Mercurial, similarly, only set REPO_NAME when the request actually is
processed.
author | Mads Kiilerich <mads@kiilerich.com> |
---|---|
date | Wed, 23 Jan 2019 03:47:46 +0100 |
parents | 96e26544d037 |
children | d14328af601e |
files | kallithea/lib/middleware/simplegit.py kallithea/lib/middleware/simplehg.py |
diffstat | 2 files changed, 31 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/kallithea/lib/middleware/simplegit.py Tue Jan 08 13:04:19 2019 +0100 +++ b/kallithea/lib/middleware/simplegit.py Wed Jan 23 03:47:46 2019 +0100 @@ -35,12 +35,13 @@ from webob.exc import HTTPNotFound, HTTPForbidden, HTTPInternalServerError, \ HTTPNotAcceptable, HTTPBadRequest -from kallithea.model.db import Ui +from kallithea.model.db import Ui, Repository from kallithea.lib.utils2 import safe_str, safe_unicode, get_server_url, \ _set_extras from kallithea.lib.base import BaseVCSController from kallithea.lib.utils import make_ui, is_valid_repo +from kallithea.lib.hooks import log_pull_action from kallithea.lib.middleware.pygrack import make_wsgi_app log = logging.getLogger(__name__) @@ -119,38 +120,34 @@ # GIT REQUEST HANDLING #=================================================================== log.debug('HOOKS extras is %s', extras) - baseui = make_ui() _set_extras(extras or {}) try: - self._handle_githooks(parsed_request.repo_name, parsed_request.action, baseui, environ) log.info('%s action on %s repo "%s" by "%s" from %s', parsed_request.action, self.scm_alias, parsed_request.repo_name, safe_str(user.username), ip_addr) - app = self.__make_app(parsed_request.repo_name) + app = self._make_app(parsed_request) return app(environ, start_response) except Exception: log.error(traceback.format_exc()) raise HTTPInternalServerError() - def __make_app(self, repo_name): + def _make_app(self, parsed_request): """ Return a pygrack wsgi application. """ - return make_wsgi_app(repo_name, safe_str(self.basepath)) # FIXME: safe_str??? - - def _handle_githooks(self, repo_name, action, baseui, environ): - """ - Handles pull action, push is handled by post-receive hook - """ - from kallithea.lib.hooks import log_pull_action - service = environ['QUERY_STRING'].split('=') + pygrack_app = make_wsgi_app(parsed_request.repo_name, self.basepath) - if len(service) < 2: - return + def wrapper_app(environ, start_response): + if (parsed_request.cmd == 'info/refs' and + parsed_request.service == 'git-upload-pack' + ): + baseui = make_ui() + repo = Repository.get_by_repo_name(parsed_request.repo_name) + scm_repo = repo.scm_instance + # Run hooks, like Mercurial outgoing.pull_logger does + log_pull_action(ui=baseui, repo=scm_repo._repo) + # Note: push hooks are handled by post-receive hook - from kallithea.model.db import Repository - _repo = Repository.get_by_repo_name(repo_name) - _repo = _repo.scm_instance + return pygrack_app(environ, start_response) - if action == 'pull': - log_pull_action(ui=baseui, repo=_repo._repo) + return wrapper_app
--- a/kallithea/lib/middleware/simplehg.py Tue Jan 08 13:04:19 2019 +0100 +++ b/kallithea/lib/middleware/simplehg.py Wed Jan 23 03:47:46 2019 +0100 @@ -172,26 +172,29 @@ #====================================================================== # MERCURIAL REQUEST HANDLING #====================================================================== - str_repo_name = safe_str(parsed_request.repo_name) - repo_path = os.path.join(safe_str(self.basepath), str_repo_name) - log.debug('Repository path is %s', repo_path) - log.debug('HOOKS extras is %s', extras) - baseui = make_ui(repo_path=repo_path) _set_extras(extras or {}) try: log.info('%s action on %s repo "%s" by "%s" from %s', parsed_request.action, self.scm_alias, parsed_request.repo_name, safe_str(user.username), ip_addr) - environ['REPO_NAME'] = str_repo_name # used by hgweb_mod.hgweb - app = self.__make_app(repo_path, baseui) + app = self._make_app(parsed_request) return app(environ, start_response) except Exception: log.error(traceback.format_exc()) raise HTTPInternalServerError() - def __make_app(self, repo_name, baseui): + def _make_app(self, parsed_request): + """ + Make an hgweb wsgi application. """ - Make an hgweb wsgi application using baseui. - """ - return hgweb_mod.hgweb(repo_name, name=repo_name, baseui=baseui) + str_repo_name = safe_str(parsed_request.repo_name) + repo_path = os.path.join(safe_str(self.basepath), str_repo_name) + baseui = make_ui(repo_path=repo_path) + hgweb_app = hgweb_mod.hgweb(repo_path, name=str_repo_name, baseui=baseui) + + def wrapper_app(environ, start_response): + environ['REPO_NAME'] = str_repo_name # used by hgweb_mod.hgweb + return hgweb_app(environ, start_response) + + return wrapper_app