src/mercurialserver/servelog.py
author David Douard <david.douard@logilab.fr>
Mon, 03 Nov 2014 11:12:45 +0100
changeset 372 80f78674c56e
parent 312 4e65f8242c0b
child 373 a286d6c6b19c
permissions -rw-r--r--
Add support for phases This adds a "publish" permission level (between "init" and "write") required to be able to change the phase of a changeset from "draft" to "public". Update documentation accordingly. This is meant to be used for using the changeset evolution feature of mercurial, see http://evolution.experimentalworks.net/doc/

"""
Hook to log changesets pushed and pulled
"""

from mercurial.i18n import _
import mercurial.util
import mercurial.node

import os
import time
import fcntl

try:
    import json
    json.dumps
except ImportError:
    import simplejson as json

from mercurialserver import ruleset, changes

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()