trac-post-commit-hookをDreamHostで使う

SVNのログでチケットの操作ができるとっても便利なtrac-post-commit-hookですが、DreamHostで使うには難がありました。
最大の難点は post-commit が dhapacheというユーザーで実行されるということで、これが数々の問題を引き起こします。
色々と実験して解決策を見つけたのでポストします。
なお、解決策は SQLite を使っている場合と MySQL を使っている場合で異なります。

SQLite と MySQL の共通 post-commit

コミット後にスクリプトを実行するため、/home/***/svn/projectid/hooks に post-commit という名前のファイルを作成します。
このファイルがコミット後に実行されるわけですが、dhapache によって実行されるため環境変数の再設定が必要になります。
それなので、.bash_profile などから必要な変数をコピーします。
そして、trac のソースの contrib ディレクトリから trac-post-commit-hook を post-commit と同じディレクトリにコピーします。
さらにsvn_commit_jp.mdから svnlog2utf8 を取得してパスの通るところに置いて実行権を与えます。

post-commitの例(パスなどは適宜変えてください):

#!/bin/sh

HOME='/home/***'
export PYTHONPATH="$HOME/local/lib/python: $HOME/local/lib/python/site-packages"
export LD_LIBRARY_PATH="$HOME/local/lib"
export PYTHON_EGG_CACHE="$HOME/tmp"
export PATH="$HOME/local/bin:$PATH"

REPOS="$1"
REV="$2"

LOG=`svnlook log -r $REV $REPOS | svnlog2utf8`
AUTHOR=`svnlook author -r $REV $REPOS | svnlog2utf8`
TRAC_ENV="$HOME/trac_sites/projectid/"
TRAC_URL="http://trac.example.com/projectid/"

python $REPOS/hooks/trac-post-commit-hook \
-p "$TRAC_ENV" \
-r "$REV" \
-u "$AUTHOR" \
-m "$LOG" \
-s "$TRAC_URL"

SQLiteの場合

SQLiteの場合は dhapache が trac のディレクトリの /db/trac.db(デフォルト) へアクセスする権限を持っていないため、エラーになります。
この場合は trac.db に「chmod o+rw」するしか方法がないと思います。書き込み権限を与えるのはやだなと思うときはMySQLの移行も考えてください(MySQLへのパスワードも dhapache が読み取れる必要があるので同じっていえば同じですが)。

MySQLの場合

MySQLの場合は、上で設定した「PYTHON_EGG_CACHE」の値が dhapache が書き込みできるディレクトリを指定していて、trac.ini を読み込めればOKです。

SQLite から MySQLへの移行

SQLite から MySQLへの移行は SqliteToPgScript を使うと便利です。
SqliteToPgScript でMySQLインポートしたら、trac.ini の database の指定を「mysql://user:password@host/database」のようにすればOKです。