[Python-checkins] hooks: add irker (IRC checkin notifications) hook

georg.brandl python-checkins at python.org
Fri Sep 28 12:04:45 CEST 2012


http://hg.python.org/hooks/rev/1969b6dfc63e
changeset:   84:1969b6dfc63e
user:        Georg Brandl <georg at python.org>
date:        Fri Sep 28 12:04:18 2012 +0200
summary:
  add irker (IRC checkin notifications) hook

files:
  hgirker.py |  88 ++++++++++++++++++++++++++++++++++++++++++
  1 files changed, 88 insertions(+), 0 deletions(-)


diff --git a/hgirker.py b/hgirker.py
new file mode 100644
--- /dev/null
+++ b/hgirker.py
@@ -0,0 +1,88 @@
+from mercurial.node import bin, short
+from mercurial.templatefilters import person
+from mercurial import cmdutil, patch, templater, util, mail
+
+import os
+import json
+import socket
+
+IRKER_HOST = 'localhost'
+IRKER_PORT = 6659
+
+DEFTEMPLATE = '''%(bold)s%(project)s:%(bold)s \
+%(green)s%(author)s%(reset)s \
+%(yellow)s%(branch)s%(reset)s \
+* %(bold)s%(rev)s%(bold)s \
+/ %(files)s%(bold)s:%(bold)s %(logmsg)s \
+%(brown)s%(url)s%(reset)s'''
+
+def getenv(ui, repo):
+    env = {
+        'bold': '\x02',
+        'green': '\x033',
+        'blue': '\x032',
+        'yellow': '\x037',
+        'brown': '\x035',
+        'reset': '\x0F'
+    }
+    env['repo'] = repo
+    env['project'] = ui.config('irker', 'project')
+    if env['project'] is None:
+        raise RuntimeError('missing irker.project config value')
+    env['baseurl'] = ui.config('web', 'baseurl')
+    env['template'] = ui.config('irker', 'template', DEFTEMPLATE)
+    env['channels'] = ui.config('irker', 'channels')
+    if env['channels'] is None:
+        raise RuntimeError('missing irker.channels config value')
+    return env
+
+def getfiles(env, ctx):
+    f = env['repo'].status(ctx.p1().node(), ctx.node())
+    elems = []
+    for path in f[0] + f[1] + f[2]:
+        elems.append(path)
+    pfx = os.path.commonprefix(elems)
+    if len(elems) > 1 and pfx:
+        return pfx + '(' + ' '.join(e[len(pfx):] for e in elems) + ')'
+    return ' '.join(elems)
+
+def generate(env, ctx):
+    n = ctx.node()
+    ns = short(n)
+    d = env.copy()
+    d['branch'] = ctx.branch()
+    d['author'] = person(ctx.user())
+    d['rev'] = '%d:%s' % (ctx.rev(), ns)
+    d['logmsg'] = ctx.description()
+    if env['baseurl']:
+        d['url'] = env['baseurl'].rstrip('/') + '/rev/%s' % ns
+    else:
+        d['url'] = ''
+    d['files'] = getfiles(env, ctx)
+    return json.dumps({
+        'to': env['channels'].split(','),
+        'privmsg': d['template'] % d,
+    })
+
+def hook(ui, repo, hooktype, node=None, url=None, **kwds):
+    def sendmsg(msg):
+        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        try:
+            sock.connect((IRKER_HOST, IRKER_PORT))
+            sock.sendall(msg + "\n")
+        finally:
+            sock.close()
+
+    env = getenv(ui, repo)
+
+    n = bin(node)
+    if hooktype == 'changegroup':
+        start = repo.changelog.rev(n)
+        end = len(repo.changelog)
+        for rev in xrange(start, end):
+            n = repo.changelog.node(rev)
+            ctx = repo.changectx(n)
+            sendmsg(generate(env, ctx))
+    else:
+        ctx = repo.changectx(n)
+        sendmsg(generate(env, ctx))

-- 
Repository URL: http://hg.python.org/hooks


More information about the Python-checkins mailing list