2009-03-12

Git の commit log を Trac の ticket comment に自動反映させる方法

Trac の SCM に Subversion を使ってる人の多くは、Subversion のコミット・ログを Trac のチケット・コメントに自動反映させる hook を利用していることと思う。

入門Trac with Subversion―Linux/Windows対応

これを、Git でも使えるようにしてみた。

Git Plugin

まず Trac で Git を使うようにするには、GitPlugin for Trac をインストールする必要がある。ここら辺のウェブ・ページを参考にしてインストールされたし。

git-post-receive-hook の入手

Git 用の hook スクリプトを github で公開している。まずは、そちらで最新版を入手されたし。

$ git clone git://github.com/ataka/trac-git-post-receive-hook.git

一応、(2009-03-11 現在の) ソース・コードのコピーも置いておく。

#!/bin/sh

# The original script is available at
#   http://trac-hacks.org/browser/timingandestimationplugin/branches/trac0.11/scripts/git-post-receive
#

#
# An example hook script for the post-receive event
#
# This script is run after receive-pack has accepted a pack and the
# repository has been updated.  It is passed arguments in through stdin
# in the form
#  <oldrev> <newrev> <refname>
# For example:
#  aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master
#
# see contrib/hooks/ for an sample, or uncomment the next line (on debian)
#

TRAC_ENV="/var/trac/YOURPROJECT"
POST_COMMIT="/usr/local/src/Trac-0.11.1.ja1/contrib/trac-post-commit-hook"
LOG="/dev/null"
echo "in git post commit: $TRAC_ENV" | cat >>$LOG

while read oval nval ref ; do
    if expr "$oval" : '0*$' >/dev/null
    then
        git-rev-list --reverse "$nval"
    else
        git-rev-list --reverse "$nval" "^$oval"
    fi | while read com ; do
        echo "posting a comment to trac" | cat >>$LOG
        echo "  *** $com"
        AUTHOR="$(git-rev-list -n 1 $com --pretty=format:%an | sed '1d')" \
        MSG="$(git-rev-list -n 1 $com --pretty=medium | sed '1,3d;s:^   ::')"
        echo "author ... $AUTHOR"
        echo "msg ... $MSG"
        sleep 0.1
        sudo -u www-data $POST_COMMIT \
            -p "$TRAC_ENV" \
            -r "$com" \
            -u "$AUTHOR" \
            -m "$MSG" \
        echo "DONE posting a comment to trac" | cat >>$LOG
    done
done

echo "Done with trac commit hook: $TRAC_ENV" | cat >>$LOG
exit 0

設定

git-post-receive-hook を手に入れたら、それをリモートの git リポジトリーの hook ディレクトリーに入れてやる。ここでは、リモート・リポジトリーが /git/foo.git にあるとして話を進めませう。

$ chmod +x git-post-receive-hook
$ cp -p git-post-receive-hook /git/foo.git/hooks

次に、git-post-receive-hook で Trac の設定を行なう。具体的には、TRAC_ENV に trac project への path を、POST_COMMIT に trac-post-commit-hook への path を指定する。例えば、Trac Project を /trac/foo に置いていて、Trac を Ubuntu のパッケージからインストールしている場合は、次のように編集する。

TRAC_ENV="/trac/foo"
POST_COMMIT="/usr/local/src/Trac-0.11.1.ja1/contrib/trac-post-commit-hook"

最後に、/git/foo.git/hooks/post-receive.sample を post-receive に名前を変更して、git-post-receive-hook を呼び出すようにする。

$ cd /git/foo.git/hooks
$ cat post-receive.sample
#!/bin/sh

/git/foo.git/hooks/git-post-receive-hook
$ mv post-receive.sample post-receive

post-commit じゃなくて、post-receive を使うことに注意。

設定は以上で終了。あとは、Subversion と同じやうにログが書くだけ。ローカル・リポジトリーからリモート・リポジトリーに git-push したタイミングで、Trac のチケットにログが反映されるようになる。

No comments:

Post a Comment