Mercurial > kallithea
comparison rhodecode/lib/middleware/simplegit.py @ 2257:a437a986d399
merged beta into stable
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Thu, 10 May 2012 20:27:45 +0200 |
parents | dc2584ba5fbc 37c143aa8616 |
children | 63e58ef80ef1 |
comparison
equal
deleted
inserted
replaced
2206:deb816e5a579 | 2257:a437a986d399 |
---|---|
42 self.repo.get_peeled) | 42 self.repo.get_peeled) |
43 objects_iter = self.repo.fetch_objects( | 43 objects_iter = self.repo.fetch_objects( |
44 graph_walker.determine_wants, graph_walker, self.progress, | 44 graph_walker.determine_wants, graph_walker, self.progress, |
45 get_tagged=self.get_tagged) | 45 get_tagged=self.get_tagged) |
46 | 46 |
47 # Do they want any objects? | 47 # Did the process short-circuit (e.g. in a stateless RPC call)? Note |
48 if objects_iter is None or len(objects_iter) == 0: | 48 # that the client still expects a 0-object pack in most cases. |
49 if objects_iter is None: | |
49 return | 50 return |
50 | 51 |
51 self.progress("counting objects: %d, done.\n" % len(objects_iter)) | 52 self.progress("counting objects: %d, done.\n" % len(objects_iter)) |
52 dulserver.write_pack_objects(dulserver.ProtocolFile(None, write), | 53 dulserver.write_pack_objects(dulserver.ProtocolFile(None, write), |
53 objects_iter, len(objects_iter)) | 54 objects_iter) |
54 messages = [] | 55 messages = [] |
55 messages.append('thank you for using rhodecode') | 56 messages.append('thank you for using rhodecode') |
56 | 57 |
57 for msg in messages: | 58 for msg in messages: |
58 self.progress(msg + "\n") | 59 self.progress(msg + "\n") |
59 # we are done | 60 # we are done |
60 self.proto.write("0000") | 61 self.proto.write("0000") |
61 | 62 |
63 | |
62 dulserver.DEFAULT_HANDLERS = { | 64 dulserver.DEFAULT_HANDLERS = { |
63 'git-upload-pack': SimpleGitUploadPackHandler, | 65 'git-upload-pack': SimpleGitUploadPackHandler, |
64 'git-receive-pack': dulserver.ReceivePackHandler, | 66 'git-receive-pack': dulserver.ReceivePackHandler, |
65 } | 67 } |
66 | 68 |
70 from paste.httpheaders import REMOTE_USER, AUTH_TYPE | 72 from paste.httpheaders import REMOTE_USER, AUTH_TYPE |
71 | 73 |
72 from rhodecode.lib.utils2 import safe_str | 74 from rhodecode.lib.utils2 import safe_str |
73 from rhodecode.lib.base import BaseVCSController | 75 from rhodecode.lib.base import BaseVCSController |
74 from rhodecode.lib.auth import get_container_username | 76 from rhodecode.lib.auth import get_container_username |
75 from rhodecode.lib.utils import is_valid_repo | 77 from rhodecode.lib.utils import is_valid_repo, make_ui |
76 from rhodecode.model.db import User | 78 from rhodecode.model.db import User |
77 | 79 |
78 from webob.exc import HTTPNotFound, HTTPForbidden, HTTPInternalServerError | 80 from webob.exc import HTTPNotFound, HTTPForbidden, HTTPInternalServerError |
79 | 81 |
80 log = logging.getLogger(__name__) | 82 log = logging.getLogger(__name__) |
97 def _handle_request(self, environ, start_response): | 99 def _handle_request(self, environ, start_response): |
98 | 100 |
99 if not is_git(environ): | 101 if not is_git(environ): |
100 return self.application(environ, start_response) | 102 return self.application(environ, start_response) |
101 | 103 |
102 proxy_key = 'HTTP_X_REAL_IP' | 104 ipaddr = self._get_ip_addr(environ) |
103 def_key = 'REMOTE_ADDR' | |
104 ipaddr = environ.get(proxy_key, environ.get(def_key, '0.0.0.0')) | |
105 username = None | 105 username = None |
106 self._git_first_op = False | |
106 # skip passing error to error controller | 107 # skip passing error to error controller |
107 environ['pylons.status_code_redirect'] = True | 108 environ['pylons.status_code_redirect'] = True |
108 | 109 |
109 #====================================================================== | 110 #====================================================================== |
110 # EXTRACT REPOSITORY NAME FROM ENV | 111 # EXTRACT REPOSITORY NAME FROM ENV |
176 | 177 |
177 #check permissions for this repository | 178 #check permissions for this repository |
178 perm = self._check_permission(action, user, repo_name) | 179 perm = self._check_permission(action, user, repo_name) |
179 if perm is not True: | 180 if perm is not True: |
180 return HTTPForbidden()(environ, start_response) | 181 return HTTPForbidden()(environ, start_response) |
182 extras = { | |
183 'ip': ipaddr, | |
184 'username': username, | |
185 'action': action, | |
186 'repository': repo_name, | |
187 'scm': 'git', | |
188 } | |
181 | 189 |
182 #=================================================================== | 190 #=================================================================== |
183 # GIT REQUEST HANDLING | 191 # GIT REQUEST HANDLING |
184 #=================================================================== | 192 #=================================================================== |
185 repo_path = os.path.join(safe_str(self.basepath), safe_str(repo_name)) | 193 repo_path = os.path.join(safe_str(self.basepath), safe_str(repo_name)) |
186 log.debug('Repository path is %s' % repo_path) | 194 log.debug('Repository path is %s' % repo_path) |
187 | 195 |
196 baseui = make_ui('db') | |
197 self.__inject_extras(repo_path, baseui, extras) | |
198 | |
199 | |
188 try: | 200 try: |
189 #invalidate cache on push | 201 # invalidate cache on push |
190 if action == 'push': | 202 if action == 'push': |
191 self._invalidate_cache(repo_name) | 203 self._invalidate_cache(repo_name) |
204 self._handle_githooks(repo_name, action, baseui, environ) | |
205 | |
192 log.info('%s action on GIT repo "%s"' % (action, repo_name)) | 206 log.info('%s action on GIT repo "%s"' % (action, repo_name)) |
193 app = self.__make_app(repo_name, repo_path) | 207 app = self.__make_app(repo_name, repo_path) |
194 return app(environ, start_response) | 208 return app(environ, start_response) |
195 except Exception: | 209 except Exception: |
196 log.error(traceback.format_exc()) | 210 log.error(traceback.format_exc()) |
247 else: | 261 else: |
248 # try to fallback to stored variable as we don't know if the last | 262 # try to fallback to stored variable as we don't know if the last |
249 # operation is pull/push | 263 # operation is pull/push |
250 op = getattr(self, '_git_stored_op', 'pull') | 264 op = getattr(self, '_git_stored_op', 'pull') |
251 return op | 265 return op |
266 | |
267 def _handle_githooks(self, repo_name, action, baseui, environ): | |
268 from rhodecode.lib.hooks import log_pull_action, log_push_action | |
269 service = environ['QUERY_STRING'].split('=') | |
270 if len(service) < 2: | |
271 return | |
272 | |
273 from rhodecode.model.db import Repository | |
274 _repo = Repository.get_by_repo_name(repo_name) | |
275 _repo = _repo.scm_instance | |
276 _repo._repo.ui = baseui | |
277 | |
278 push_hook = 'pretxnchangegroup.push_logger' | |
279 pull_hook = 'preoutgoing.pull_logger' | |
280 _hooks = dict(baseui.configitems('hooks')) or {} | |
281 if action == 'push' and _hooks.get(push_hook): | |
282 log_push_action(ui=baseui, repo=_repo._repo) | |
283 elif action == 'pull' and _hooks.get(pull_hook): | |
284 log_pull_action(ui=baseui, repo=_repo._repo) | |
285 | |
286 def __inject_extras(self, repo_path, baseui, extras={}): | |
287 """ | |
288 Injects some extra params into baseui instance | |
289 | |
290 :param baseui: baseui instance | |
291 :param extras: dict with extra params to put into baseui | |
292 """ | |
293 | |
294 # make our hgweb quiet so it doesn't print output | |
295 baseui.setconfig('ui', 'quiet', 'true') | |
296 | |
297 #inject some additional parameters that will be available in ui | |
298 #for hooks | |
299 for k, v in extras.items(): | |
300 baseui.setconfig('rhodecode_extras', k, v) |