Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/buildbot/contrib/hg_buildbot.py
diff options
context:
space:
mode:
Diffstat (limited to 'buildbot/contrib/hg_buildbot.py')
-rwxr-xr-xbuildbot/contrib/hg_buildbot.py49
1 files changed, 49 insertions, 0 deletions
diff --git a/buildbot/contrib/hg_buildbot.py b/buildbot/contrib/hg_buildbot.py
new file mode 100755
index 0000000..3be49f6
--- /dev/null
+++ b/buildbot/contrib/hg_buildbot.py
@@ -0,0 +1,49 @@
+#! /usr/bin/python
+
+# This is a script which delivers Change events from Mercurial to the
+# buildmaster each time a changeset is pushed into a repository. Add it to
+# the 'incoming' commit hook on your canonical "central" repository, by
+# putting something like the following in the .hg/hgrc file of that
+# repository:
+#
+# [hooks]
+# incoming.buildbot = /PATH/TO/hg_buildbot.py BUILDMASTER:PORT
+#
+# Note that both Buildbot and Mercurial must be installed on the repository
+# machine.
+
+import os
+import sys
+import commands
+
+from StringIO import StringIO
+from buildbot.scripts import runner
+
+MASTER = sys.argv[1]
+
+CHANGESET_ID = os.environ["HG_NODE"]
+
+# TODO: consider doing 'import mercurial.hg' and extract this information
+# using the native python
+out = commands.getoutput(
+ "hg log -r %s --template '{author}\n{files}\n{desc}'" % CHANGESET_ID)
+
+s = StringIO(out)
+user = s.readline().strip()
+# NOTE: this fail when filenames contain spaces. I cannot find a way to get
+# hg to use some other filename separator.
+files = s.readline().strip().split()
+comments = "".join(s.readlines())
+
+change = {
+ 'master': MASTER,
+ # note: this is more likely to be a full email address, which would make
+ # the left-hand "Changes" column kind of wide. The buildmaster should
+ # probably be improved to display an abbreviation of the username.
+ 'username': user,
+ 'revision': CHANGESET_ID,
+ 'comments': comments,
+ 'files': files,
+}
+
+runner.sendchange(change, True)