MercurialでPythonのフックを実行する方法 / PythonからOutputzにPOSTする方法
概要
Mercurialでは、hgコマンドを実行したときに、Pythonの関数を実行することができます。この記事では、hg pushしたときに、Outputzにhg diffの結果をPOSTする方法について説明します。
MercurialのPythonフック
.hg/hgrcで以下のように、[hooks]セクションに"python:"で始まる値を記述すると、hg pushコマンドを実行したとき、リポジトリの内容を送信する前に、Pythonのfoo.bar関数を実行します。
[hooks] preoutgoing=python:foo.bar
"preoutgoing"は、フックを入れる箇所を指定しています。他に何があるかは、参考文献を参照して下さい。
また、hgコマンドを実行したとき、fooモジュールが読み込めるように、PYTHONPATHを設定しておく必要があります。
OutputzへのPOST
Mercurialのフックに、以下のスクリプトのhook関数を指定すれば、カレントディレクトリのoutputz.iniの設定を読み込んで、Outputzにhg diffで出力した文字の文字数を送信します。
from ConfigParser import ConfigParser from subprocess import PIPE, Popen from urllib import urlencode, urlopen def hook(ui, repo, **kwargs): proc = Popen(["hg", "diff"], stdout=PIPE) proc.wait() stdout = proc.stdout.read() size = len(stdout) parser = ConfigParser() parser.read("outputz.ini") key = parser.get("outputz", "key") uri = parser.get("outputz", "uri") params = urlencode({ "key": key, "uri": uri, "size": str(size) }) f = urlopen("http://outputz.com/api/post", params) if f.read() != "ok": raise Exception("can't post to outputz") # vim: tabstop=4 shiftwidth=4 expandtab softtabstop=4
outputz.iniには、以下のように記述します。
[outputz] key=<復活の呪文> uri=<URL>
参考文献
- 10 Handling repository events with hooks (http://hgbook.red-bean.com/hgbookch10.html)