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