Trac0.12とsvnの連携

なんかTracは0.12から外部リポジトリ連携の方法を変えたらしく、いい感じの日本語ドキュメントがなかったので、簡単に書いてみる。

svn-trac連携方法は trac 0.12 から方法が変わり、trac-post-commit-hook プラグインが使用できなくなりました。
代わりに、TracCoreに組み込まれているCommitTicketUpdater, CommitticketReferenceMacroを使用します。

簡単な構造

SVNからは、コミット後(post-commit hook)に、Tracに対して「コミットあったよー。」という連携をします。(trac-adminによるchangeset連携)
Tracは、連携を受けると、対応するsvnを確認して前述のプラグインを走らせることで、必要な対応を行います。
ここで、コメント内容(tracプラグイン用のコマンド:refsとか)はTracsvnを参照して理解するので、先にTracsvnリポジトリを登録しておく必要があります。
つまり、対応する手順としてはこんな感じになります。

  1. Tracに(svn)リポジトリを登録
  2. svnのhookポイントを利用し、コミット後にTracへ連携(このとき、リポジトリ名とリビジョン番号を連携する)
  3. Tracは連携を受けて、対応するリポジトリ名のリポジトリのリビジョン番号を検索し、そのコメント内に書かれているコマンド(refsとか)を判断して実行

以下、それぞれの具体的な内容を書きます。

詳細手順メモ

  1. Tracに(svn)リポジトリを登録
    1. Tracのインタフェースに管理者でログイン
    2. 管理>リポジトリ を選択
    3. リポジトリの追加で、名前と種別、配置されているディレクトリ(もしくは他サーバの場合は参照URL)を記述。ここでは名前を「repo」とする。
  2. svnのhookポイントを利用し、コミット後にTracへ連携(このとき、リポジトリ名とリビジョン番号を連携する)
    1. svnリポジトリ配下にある hooks フォルダ配下に、後で書いてあるような内容の post-commit というファイルを置く。ただし、ENVはTracのホームディレクトリ(下にVERSIONファイルがあるところ)、"repo"は 1. で登録したリポジトリの名前(tracが解釈できるもの)である必要がある

3.Tracは連携を受けて、対応するリポジトリ名のリポジトリのリビジョン番号を検索し、そのコメント内に書かれているコマンド(refsとか)を判断して実行

    1. TracWebインタフェースに管理者でログインする。
    2. 管理>プラグインTrac x.x.x を開く
    3. 下の方の tracopt.ticket.commit_updater.* にある、CommitTicketReferenceMacro, CommitTicketUpdater にチェックを入れ、「変更を適用」

post-commitはこんな感じ。

REPOS="$1"
REV="$2"
ENV="/home/tracuser/cloud_ph1"
trac-admin $ENV changeset added "repo" $REV

おまけのおまけ:closeの停止とresolved対応

デフォルトでは上記プラグインが持っている機能は

  • チケットにリポジトリのコメントを連携する
  • チケットをクローズする

ですが、今回対応したケースでは、チケットクローズはマネージャがしたいので、勝手にクローズされては困ったりしました。そうじゃなくてステータスをresolvedにはしたい。困った困った。
ということで、プラグイン書き換えました。

vi /usr/local/lib/python2.6/dist-packages/Trac-0.12.2.ja1-py2.6.egg/tracopt/ticket/commit_updater.py

  def cmd_close(self, ticket, changeset, perm):
    if not self.check_perms or 'TICKET_MODIFY' in perm:
      ticket['status'] = 'resolved'         <== ここ
      if not ticket['owner']:
        ticket['owner'] = changeset.author

これでステータス変更対象が close じゃなくて resolved になりました。
あと、デフォルトではこのチケットステータス変更用のコマンドが「close」とかで気持ち悪いので、trac.iniにこんな感じで追加。

commit_ticket_update_commands.close = resolved resolve solve fix fixed fixes

関数名も変数名も close で多少気持ち悪いけど、Core ライブラリを必要以上にいじるのも気が引けるし、こんなもんでしょ。