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)