diff -r 80f78674c56e -r a286d6c6b19c src/mercurialserver/servelog.py --- a/src/mercurialserver/servelog.py Mon Nov 03 11:12:45 2014 +0100 +++ b/src/mercurialserver/servelog.py Wed Mar 05 12:16:46 2014 +0100 @@ -18,26 +18,44 @@ from mercurialserver import ruleset, changes +def writelog(repo, op, **kw): + """Write a log entry in the mercurial-server log file as a JSON + formatted dict. + + op is the operation (typically 'push', 'pull' or 'publish') + + any element in the kw argument is also added in the log entry + dictionnary. + """ + logentry = kw.copy() + logentry.update(dict( + timestamp=time.strftime("%Y-%m-%d_%H:%M:%S Z", time.gmtime()), + op=op, + key=ruleset.rules.get('user'), + ssh_connection=os.environ['SSH_CONNECTION'],)) + with open(repo.join("mercurial-server.log"), "a+") as log: + fcntl.flock(log.fileno(), fcntl.LOCK_EX) + log.seek(0, os.SEEK_END) + # YAML log file format + log.write("- %s\n" % json.dumps(data)) + def hook(ui, repo, hooktype, node=None, source=None, **kwargs): if hooktype == 'changegroup': op = "push" elif hooktype == 'outgoing': op = "pull" else: - raise mercurial.util.Abort(_('servelog installed as wrong hook type,' - ' must be changegroup or outgoing but is %s') % hooktype) - log = open(repo.join("mercurial-server.log"), "a+") - try: - fcntl.flock(log.fileno(), fcntl.LOCK_EX) - log.seek(0, os.SEEK_END) - # YAML log file format - log.write("- %s\n" % json.dumps(dict( - timestamp=time.strftime("%Y-%m-%d_%H:%M:%S Z", time.gmtime()), - op=op, - key=ruleset.rules.get('user'), - ssh_connection=os.environ['SSH_CONNECTION'], - nodes=[mercurial.node.hex(ctx.node()) - for ctx in changes.changes(repo, node)], - ))) - finally: - log.close() + raise mercurial.util.Abort(_('servelog.hook installed as wrong hook type,' + ' must be changegroup or outgoing but is %s') % hooktype) + writelog(repo, op, + nodes=[mercurial.node.hex(ctx.node()) + for ctx in changes.changes(repo, node)]) + +def phaseshook(ui, repo, hooktype, node=None, source=None, **kwargs): + if hooktype == 'pushkey': + if kwargs.get('namespace') == 'phases': + writelog(repo, 'publish', nodes=[kwargs['key']]) + else: + raise mercurial.util.Abort(_('servelog.phaseshook installed as wrong hook type,' + ' must be pushkey but is %s') % hooktype) +