Git: post-receive hook for XMPP notifications

By Abhijit Menon-Sen <ams@toroid.org>

2010-05-11

I wrote long ago about the trouble I had with Net::XMPP while setting up a notification hook for Archiveopteryx, but I didn't think anyone would find the script itself particularly interesting. But people have asked me about it, so here it is.

I wrote a Perl script named post-receive-notify-xmpp.pl that sends a message via XMPP (Jabber) every time something is committed to a repository. It depends on the Net::Jabber module (and perhaps also Net::DNS, but see below). You can download and install it directly as a Git hook:

$ cd .git/hooks
$ wget -O post-receive \
    http://toroid.org/misc/post-receive-notify-xmpp.pl
$ chmod +x post-receive

(I tend to just call this from a separate .git/hooks/post-receive script, because I sometimes need to do other things in the hook, like updating mirrors.)

You have to tell the hook whom to send notifications to, and optionally which branches to pay attention to (failing which it pays attention only to master):

$ git config hooks.notify.branches 'master next foo'
$ git config hooks.notify.recipients 'a@example.org b@example.org'

Finally, you have to edit the script to set the correct jid and password to use when sending the notifications, and the name used to identify the repository to the recipients:

my $repo = "foo.git";

my $JID = 'foo@example.org';
my $password = "cd2e1f7d4a8500f394771b620a85aa5e";

If you want, you can also edit the "git log" command in the script to include whatever information you want in each change description (like --diffstat and so on).

That's all there is to it. Let me know if you have any problems getting it to work.

(If you want commit notifications by email instead, look at the post-receive-notify-email script in Git contrib/hooks.)

The old Net::XMPP bug

If the XMPP server you want to connect to in order to send notifications has the same hostname as the jid you want to use, you're fine. In other words, if you want to send a notification as foo@example.org and your XMPP server is reachable at example.org, you're safe from the bug.

If XMPP service for your domain is provided by a different server, i.e. you want to send the notification as foo@example.org, and example.org has SRV records that point you to xmpp.example.net, then you will need to install Net::DNS and patch Net::XMPP (which is a lower-level dependency of the Net::Jabber module) to cope.

See my earlier post for details about the problem and the patch.