Archive for December, 2011
I’ve been meaning to post this for a little while, but now seems as good a time as any
My little team in the office has expanded since I started as the only developer. With two other devs on board managing the bzr commits has meant a little extra overhead to make sure I know when new revisions have been pushed. Thinking there had to be a better way then getting people to email me when they do a commit and push to the main branch I went digging through the bzr docs.
It turns out I’ve been “doing it wrong™”. The bzr repo was setup so that people could connect to it using sftp as that was a quick easy way to get things rolling when it was needed. Apparently bzr has an inbuilt “smart server” that can run scripts on certain hooks when certain events take place. This looked like the way to go!
First thing was setting up the smart server. I threw Apache onto the dev box, install mod-wsgi (because it’s so much better than mod-python) and started reading through the instructions. About an hour of screaming and poking I got the system running as a smart server, meaning I could push using bzr+http instead of sftp. Now came the difficult part.
It seems that only very specific events can be hooked into on the server side. This wasn’t immediately obvious from the bzr docs, but a little shouting, throwing things at the monitor and emptying nerf after nerf at the keyboard eventually got me to the hook I wanted specifically.
Now I had the ability to hook into things with bzr, but where could I send the events that it was generating? EMail was a bit dull, so I went back to MQTT, with the thought of commits could now light a lamp in the office when they happen The code for the server side bzr plugin is below. You just need to drop it into your .plugins directory for your smart server (ensuring you set this up in you wsgi configuration).
from bzrlib import branch import mosquitto as mqtt import os mqttServerIp = "192.168.0.250" def post_push_hook(push_result): branchFolder = [x for x in str(push_result.branch.__dict__['_base']).replace("//","/").split("/") if x] connectSendDisconnect("new branch revision: "+str(push_result.new_revno),branchFolder) def connectSendDisconnect(msg, branchName): mqttc = mqtt.Mosquitto("bzrlib"+str(os.getpid())) mqttc.connect(mqttServerIp, 1883, 60, True) mqttc.publish("/code/"+branchName, msg, 1, False) mqttc.loop() mqttc.disconnect() branch.Branch.hooks.install_named_hook('post_change_branch_tip', post_push_hook, "My post_push hook")
Magic! Now a message will be sent on the “/code/branchName” topic every time a commit happens Using some borrowed python magic from http://chemicaloliver.net/programming/first-steps-using-python-and-mqtt/ I’ve made it integrate into the default Ubuntu notifications system so a nice little box pops up informing me of a commit and the new revision number of the branch Doubles aces!