@@ -90,49 +90,49 @@ def log_pull_action(ui, repo, **kwargs):
"""
extras = dict(repo.ui.configitems('rhodecode_extras'))
username = extras['username']
repository = extras['repository']
scm = extras['scm']
action = 'pull'
action_logger(username, action, repository, extras['ip'], commit=True)
# extension hook call
callback = getattr(EXTENSIONS, 'PULL_HOOK', None)
if isfunction(callback):
kw = {}
kw.update(extras)
callback(**kw)
return 0
def log_push_action(ui, repo, **kwargs):
Maps user last push action to new changeset id, from mercurial
:param ui:
:param repo:
:param repo: repo object containing the `ui` object
action = extras['action'] + ':%s'
if scm == 'hg':
node = kwargs['node']
def get_revs(repo, rev_opt):
if rev_opt:
revs = revrange(repo, rev_opt)
if len(revs) == 0:
return (nullrev, nullrev)
return (max(revs), min(revs))
else:
return (len(repo) - 1, 0)
stop, start = get_revs(repo, [node + ':'])
revs = (str(repo[r]) for r in xrange(start, stop + 1))
@@ -180,49 +180,49 @@ class SimpleGit(BaseVCSController):
if perm is not True:
return HTTPForbidden()(environ, start_response)
extras = {
'ip': ipaddr,
'username': username,
'action': action,
'repository': repo_name,
'scm': 'git',
}
#===================================================================
# GIT REQUEST HANDLING
repo_path = os.path.join(safe_str(self.basepath), safe_str(repo_name))
log.debug('Repository path is %s' % repo_path)
baseui = make_ui('db')
self.__inject_extras(repo_path, baseui, extras)
try:
# invalidate cache on push
if action == 'push':
self._invalidate_cache(repo_name)
self._handle_githooks(action, baseui, environ)
self._handle_githooks(repo_name, action, baseui, environ)
log.info('%s action on GIT repo "%s"' % (action, repo_name))
app = self.__make_app(repo_name, repo_path)
return app(environ, start_response)
except Exception:
log.error(traceback.format_exc())
return HTTPInternalServerError()(environ, start_response)
def __make_app(self, repo_name, repo_path):
Make an wsgi application using dulserver
:param repo_name: name of the repository
:param repo_path: full path to the repository
_d = {'/' + repo_name: Repo(repo_path)}
backend = dulserver.DictBackend(_d)
gitserve = make_wsgi_chain(backend)
return gitserve
def __get_repository(self, environ):
Get's repository name out of PATH_INFO header
@@ -243,58 +243,58 @@ class SimpleGit(BaseVCSController):
def __get_action(self, environ):
Maps git request commands into a pull or push command.
:param environ:
service = environ['QUERY_STRING'].split('=')
if len(service) > 1:
service_cmd = service[1]
mapping = {
'git-receive-pack': 'push',
'git-upload-pack': 'pull',
op = mapping[service_cmd]
self._git_stored_op = op
return op
# try to fallback to stored variable as we don't know if the last
# operation is pull/push
op = getattr(self, '_git_stored_op', 'pull')
def _handle_githooks(self, action, baseui, environ):
def _handle_githooks(self, repo_name, action, baseui, environ):
from rhodecode.lib.hooks import log_pull_action, log_push_action
if len(service) < 2:
return
from rhodecode.model.db import Repository
_repo = Repository.get_by_repo_name(repo_name)
_repo = _repo.scm_instance
_repo._repo.ui = baseui
push_hook = 'pretxnchangegroup.push_logger'
pull_hook = 'preoutgoing.pull_logger'
_hooks = dict(baseui.configitems('hooks')) or {}
if action == 'push' and _hooks.get(push_hook):
log_push_action(ui=baseui, repo=repo._repo)
log_push_action(ui=baseui, repo=_repo._repo)
elif action == 'pull' and _hooks.get(pull_hook):
log_pull_action(ui=baseui, repo=repo._repo)
log_pull_action(ui=baseui, repo=_repo._repo)
def __inject_extras(self, repo_path, baseui, extras={}):
Injects some extra params into baseui instance
:param baseui: baseui instance
:param extras: dict with extra params to put into baseui
# make our hgweb quiet so it doesn't print output
baseui.setconfig('ui', 'quiet', 'true')
#inject some additional parameters that will be available in ui
#for hooks
for k, v in extras.items():
baseui.setconfig('rhodecode_extras', k, v)
Status change: