MercrialのリポジトリのApacheでの公開とTracとの連携

このエントリーをはてなブックマークに追加このエントリのはてなブックマーク数

Kanonでは、自動的にMercurialの設定を行っていますが、Mercurialの設定をまじめにやろうとすると結構面倒です。ここでは、Kanonの実装を例にMercurialのリポジトリをWebで公開する方法とTracとの連携について紹介します。

Kanonを使わないけどTracを使ってMercurialリポジトリを使いたい人の参考になればと思います。

Apacheの設定

まず、Webでリポジトリを公開するためのWSGIファイルを作成します。Kanonでは、/opt/kanon/lib/cgi-bin/hgweb.wsgiに置かれています。

config = "/etc/opt/kanon/hgweb.config"

import os
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
os.environ["HGENCODING"] = "UTF-8"

from mercurial.hgweb import hgweb, hgwebdir, wsgicgi
application = hgwebdir(config)

次にhgwebの設定ファイルを作成します。Kanonでは/etc/opt/kanon/hgweb.configに置かれています。

[web]
allow_archive = gz, zip, bz2
style = coal
allow_push = *
push_ssl = false

[collections]
/var/opt/kanon/hg = /var/opt/kanon/hg

/var/opt/kanon/hgディレクトリに複数のhgリポジトリが配置されるように設定いますので。このディレクトリにMercurailのリポジトリを作成すればリポジトリが見れるようになります。

Apacheに作成した、WSGIを読み込む設定をhttpd.confで行います。

...
WSGIScriptAlias /hg /opt/kanon/lib/cgi-bin/hgweb.wsgi
<Location /hg>
        WSGIApplicationGroup %{GLOBAL}
        AuthType Digest
        AuthName kanon
        AuthUserFile /etc/opt/kanon/kanon_users.htdigest
        Require valid-user
</Location>
...

これで、Apache上でMercurialのリポジトリを中央リポジトリとして見ることができます。

Tracのリポジトリブラウザの設定

次は、Tracのリポジトリブラウザの設定を行ってみましょう。

まず、Mercurialプラグインをインストールします。ルートユーザで次のコマンドを実行してください。

# easy_install http://svn.edgewall.com/repos/trac/plugins/0.12/mercurial-plugin

trac.iniには次の設定を追加します。コンポーネントを有効化し、リポジトリの設定を行います。

[components]
...
tracext.hg.backend.* = enabled
...

[trac]
...
repository_dir = /var/opt/kanon/hg/KanonConductor
repository_sync_per_request = (default)
repository_type = hg
...

これで、TracのリポジトリブラウザでMercurialのリポジトリを見ることができるようになりました。ただし、リポジトリが空の場合、エラーメッセージがでます。エラーが出る場合は、リポジトリに何かコミットしてみてください。

なお、Trac Mercurialプラグインはマルチリポジトリに対応しています。Tracプロジェクトにリポジトリを追加したい場合は、管理画面のリポジトリから行ってください。

Tracのコミットフックの設定

Tracでは、コミット時にrefs #21や、fixed #23と記述することにより、チケットへコミットメッセージを追加したり、コミットによりチケットをクローズすることができます。ここでは、コミットフックの説明をします。

まず、コミットフックを利用するにはtrac.iniに次の設定を記述し、コミットアップデートを有効にします。

[components]
tracopt.ticket.commit_updater.* = enabled

次にコミットフックを設定したいhgリポジトリの.hg/hgrcファイルでコミットフックの設定を行います。hgrcファイルはサーバ上のファイルを直接編集します。

[hooks]
commit = /opt/kanon/bin/trac-commit-hook kanon "(default)" $HG_NODE
incoming = /opt/kanon/bin/trac-commit-hook kanon "(default)" $HG_NODE

上記のコミットフックから呼ばれるスクリプtrac-commit-hookトは次のように記述します。

#!/bin/bash

KANON_TRACPATH=/var/opt/kanon/trac
KANON_HOME=/opt/kanon
export PYTHONPATH=$KANON_HOME/lib/python2.6:$KANON_HOME/lib/python2.6/site-packages
LANG=C

/opt/kanon/bin/trac-admin $KANON_TRACPATH/$1 changeset added "$2" "$3"

ここで、LANG=Cとしないと、日本語が文字化けするので注意してください。

日本語ファイル名を使うときのクライアントの設定

※この設定はクライアント側の設定のため、Kanonでは設定してくれません。各自で設定してください。

Windows環境とLinux環境が混在するような環境では、日本語のファイル名が文字化けします。hg-fixutf8プラグインを利用すると、ファイル名の文字化け問題を解決できます。hg-fixutf8はいくつかフォークが存在しますが、下記のバージョンが一番よくメンテナンスされているようです。

上記のリポジトリからエクステンションを取得、適当なディレクトリにコピーし、.hg/hgrcファイルに次のように記述します。

[extensions]
fixutf8=C:/Progam Files (x86)/Mercurial//hg-fixutf8/fixutf8.py

これで、混在環境で文字化けをしなくなります。なお、win32mbcsエクステンションは無効にしておいてください。Windows環境で日本語ファイル名を利用する場合はwin32mbcsを有効にしておけばよいという記述がWeb上で見受けられますが、win32mbcsを用いた方法では、リポジトリブラウザやhgwebでアクセスしたときにファイル名が文字化けするので注意してください。

マルチリポジトリの扱い

Tracの管理画面からもMercurialリポジトリを追加することができます。追加されたリポジトリへのリンクを貼るには、Wiki注に[バージョン番号/リポジトリ名]と記入します。例えば、KanonConductorというリポジトリ名のリポジトリのチェンジセットへリンクを貼るには次のようにします。

[123/KanonConductor]    (リビジョン番号を利用した場合)
[3d1c15c7cefa/KanonConductor]    (ハッシュを利用した場合)

まとめ

これだけ設定すると、Apache上でのMercurialリポジトリの公開とTracとの連携を行うことができます。色々設定項目がありますが、Kanonはこれらの面倒な設定を自動的に行ってくれます。文字化けを回避するノウハウなどもコンフィギュレーションに組み込まれていますので、試行錯誤して悩むこともなくなると思います。

2 Responses to “MercrialのリポジトリのApacheでの公開とTracとの連携”

  • たけぞう:

    TracとMercurialの連携でこちらの記事を大変参考にさせていただきました。ありがとうございます!

    実際に試してみていくつかハマってしまった点がありますのでコメントさせていただきます。

    まず、hgweb.configですが、先頭に[web]が抜けてないでしょうか?

    あと、これは当たり前すぎて省略されているのかもしれませんが、trac.iniの[components]に tracopt.ticket.commit_updater.* = enabled を書いておかないといけないのも知らなくて少しはまってしまいました。

  • kanon:

    湖面度ありがとうございます。[web]が確かに抜けてました。コピペしたときに先頭一行だけ抜けてしまったのだと思います。commit_updaterも確かにはまりそうですね。

    コメントを受けて記述を修正しておきました。

Leave a Reply

*