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

Page content

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です。