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