MercurialでPythonのフックを実行する方法 / PythonからOutputzにPOSTする方法

概要

Mercurialでは、hgコマンドを実行したときに、Pythonの関数を実行することができます。この記事では、hg pushしたときに、Outputzにhg diffの結果をPOSTする方法について説明します。

MercurialPythonフック

.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>

参考文献

  1. 10 Handling repository events with hooks (http://hgbook.red-bean.com/hgbookch10.html)