# HG changeset patch # User Mads Kiilerich # Date 2019-01-23 03:47:46 # Node ID 0441afb55a967a9913493ad17e97033db9ee042e # Parent 96e26544d037e0cb96a7d30c5fb46631807674c1 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. diff --git a/kallithea/lib/middleware/simplegit.py b/kallithea/lib/middleware/simplegit.py --- a/kallithea/lib/middleware/simplegit.py +++ b/kallithea/lib/middleware/simplegit.py @@ -35,12 +35,13 @@ import traceback 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 @@ class SimpleGit(BaseVCSController): # 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 diff --git a/kallithea/lib/middleware/simplehg.py b/kallithea/lib/middleware/simplehg.py --- a/kallithea/lib/middleware/simplehg.py +++ b/kallithea/lib/middleware/simplehg.py @@ -172,26 +172,29 @@ class SimpleHg(BaseVCSController): #====================================================================== # 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