##// END OF EJS Templates
vcs: do an early detection of vcs-type request....
marcink -
r1297:de699d5e default
parent child Browse files
Show More
@@ -165,7 +165,7 b' class SimpleVCS(object):'
165 self.acl_repo_name = acl_repo_name
165 self.acl_repo_name = acl_repo_name
166 self.is_shadow_repo = True
166 self.is_shadow_repo = True
167
167
168 log.debug('Repository names: %s', {
168 log.debug('Setting all VCS repository names: %s', {
169 'acl_repo_name': self.acl_repo_name,
169 'acl_repo_name': self.acl_repo_name,
170 'url_repo_name': self.url_repo_name,
170 'url_repo_name': self.url_repo_name,
171 'vcs_repo_name': self.vcs_repo_name,
171 'vcs_repo_name': self.vcs_repo_name,
@@ -35,6 +35,9 b' from rhodecode.model.settings import Vcs'
35
35
36 log = logging.getLogger(__name__)
36 log = logging.getLogger(__name__)
37
37
38 VCS_TYPE_KEY = '_rc_vcs_type'
39 VCS_TYPE_SKIP = '_rc_vcs_skip'
40
38
41
39 def is_git(environ):
42 def is_git(environ):
40 """
43 """
@@ -126,6 +129,43 b' class GunzipMiddleware(object):'
126 return self.app(environ, start_response)
129 return self.app(environ, start_response)
127
130
128
131
132 def is_vcs_call(environ):
133 if VCS_TYPE_KEY in environ:
134 raw_type = environ[VCS_TYPE_KEY]
135 return raw_type and raw_type != VCS_TYPE_SKIP
136 return False
137
138
139 def detect_vcs_request(environ, backends):
140 checks = {
141 'hg': (is_hg, SimpleHg),
142 'git': (is_git, SimpleGit),
143 'svn': (is_svn, SimpleSvn),
144 }
145 handler = None
146
147 if VCS_TYPE_KEY in environ:
148 raw_type = environ[VCS_TYPE_KEY]
149 if raw_type == VCS_TYPE_SKIP:
150 log.debug('got `skip` marker for vcs detection, skipping...')
151 return handler
152
153 _check, handler = checks.get(raw_type) or [None, None]
154 if handler:
155 log.debug('got handler:%s from environ', handler)
156
157 if not handler:
158 log.debug('checking if request is of VCS type in order: %s', backends)
159 for vcs_type in backends:
160 vcs_check, _handler = checks[vcs_type]
161 if vcs_check(environ):
162 log.debug('vcs handler found %s', _handler)
163 handler = _handler
164 break
165
166 return handler
167
168
129 class VCSMiddleware(object):
169 class VCSMiddleware(object):
130
170
131 def __init__(self, app, config, appenlight_client, registry):
171 def __init__(self, app, config, appenlight_client, registry):
@@ -136,11 +176,6 b' class VCSMiddleware(object):'
136 self.use_gzip = True
176 self.use_gzip = True
137 # order in which we check the middlewares, based on vcs.backends config
177 # order in which we check the middlewares, based on vcs.backends config
138 self.check_middlewares = config['vcs.backends']
178 self.check_middlewares = config['vcs.backends']
139 self.checks = {
140 'hg': (is_hg, SimpleHg),
141 'git': (is_git, SimpleGit),
142 'svn': (is_svn, SimpleSvn),
143 }
144
179
145 def vcs_config(self, repo_name=None):
180 def vcs_config(self, repo_name=None):
146 """
181 """
@@ -155,14 +190,10 b' class VCSMiddleware(object):'
155
190
156 def _get_handler_app(self, environ):
191 def _get_handler_app(self, environ):
157 app = None
192 app = None
158 log.debug('Checking vcs types in order: %r', self.check_middlewares)
193 log.debug('VCSMiddleware: detecting vcs type.')
159 for vcs_type in self.check_middlewares:
194 handler = detect_vcs_request(environ, self.check_middlewares)
160 vcs_check, handler = self.checks[vcs_type]
195 if handler:
161 if vcs_check(environ):
196 app = handler(self.application, self.config, self.registry)
162 log.debug(
163 'Found VCS Middleware to handle the request %s', handler)
164 app = handler(self.application, self.config, self.registry)
165 break
166
197
167 return app
198 return app
168
199
@@ -28,12 +28,16 b' from pylons.util import ContextObj'
28 from routes.util import URLGenerator
28 from routes.util import URLGenerator
29
29
30 from rhodecode.lib.base import attach_context_attributes, get_auth_user
30 from rhodecode.lib.base import attach_context_attributes, get_auth_user
31 from rhodecode.lib.middleware.vcs import (
32 detect_vcs_request, VCS_TYPE_KEY, VCS_TYPE_SKIP)
31 from rhodecode.model import meta
33 from rhodecode.model import meta
32
34
35
33 log = logging.getLogger(__name__)
36 log = logging.getLogger(__name__)
34
37
35
38
36 def pylons_compatibility_tween_factory(handler, registry):
39 def pylons_compatibility_tween_factory(handler, registry):
40
37 def pylons_compatibility_tween(request):
41 def pylons_compatibility_tween(request):
38 """
42 """
39 While migrating from pylons to pyramid we need to call some pylons code
43 While migrating from pylons to pyramid we need to call some pylons code
@@ -43,13 +47,23 b' def pylons_compatibility_tween_factory(h'
43 config = rhodecode.CONFIG
47 config = rhodecode.CONFIG
44 environ = request.environ
48 environ = request.environ
45 session = request.session
49 session = request.session
46 session_key = (config['pylons.environ_config']
50
47 .get('session', 'beaker.session'))
51 vcs_handler = detect_vcs_request(
52 request.environ, request.registry.settings.get('vcs.backends'))
53
54 if vcs_handler:
55 request.environ[VCS_TYPE_KEY] = vcs_handler.SCM
56 return handler(request)
57
58 request.environ[VCS_TYPE_KEY] = VCS_TYPE_SKIP
48
59
49 # Setup pylons globals.
60 # Setup pylons globals.
50 pylons.config._push_object(config)
61 pylons.config._push_object(config)
51 pylons.request._push_object(request)
62 pylons.request._push_object(request)
52 pylons.session._push_object(session)
63 pylons.session._push_object(session)
64
65 session_key = (
66 config['pylons.environ_config'].get('session', 'beaker.session'))
53 environ[session_key] = session
67 environ[session_key] = session
54 pylons.url._push_object(URLGenerator(config['routes.map'],
68 pylons.url._push_object(URLGenerator(config['routes.map'],
55 environ))
69 environ))
General Comments 0
You need to be logged in to leave comments. Login now