サーバはCentOS 5.8です。Mercurialは2.2.2を使います。
まずは下準備で、Mercurialをインストールします。yum install mercurialでインストールできるバージョンは古いので、easy_installを使います。
# yum install gcc python python-devel python-setuptools
# easy_install mercurial
PythonとMercurialがインストールされているか確認します。以下のコマンドで何もエラーがでなければOKです。
# python
>>> import mercurial
>>> [Crtl+D]
Mercurialのリポジトリからhgweb.cgiを探します。自分の環境ではMercurialをeasy_installでインストールしたのでhgweb.cgiが入っていませんでした。
なので、リポジトリから落としてきます。
http://selenic.com/hg/file/85a358df5bbb/hgweb.cgi
以前は複数のリポジトリを公開するためには、hgwebdir.cgiというファイルを使うことになっていましたが、統合されたようで、hgweb.cgiでどちらもできるようになっています。
下記の日本語訳のページは、情報が古いので注意してください。
JapaneseCGI_Install – Mercurial
英語ページを参照するのが正しいです。
PublishingRepositories – Mercurial
Apache用にwwwユーザを作ってあるので、/home/www/hgweb.cgiに設置しました。hgweb.cgiを開いて、configの行を変更します。
config = "/home/www/hgweb.config"
hgweb.cgiには実行権限を付けておきます。
# chmod u+x /home/www/hgweb.cgi
同じディレクトリにhgweb.configを作成します。
[web]
encoding = UTF-8
[paths]
test = /var/lib/hg/test
リポジトリのパスは/var/lib/hg以下に設置することにしました。ドキュメントでは/home/user/hgの下に置くことになっています。
# mkdir /var/lib/hg
# chown www:www /var/lib/hg
# su www
$ cd /var/lib/hg
$ mkdir test
$ cd ./test
$ hg init
wwwユーザがhgを使えるようにしておきます。/home/www/に.hgrcを作成してユーザ情報を書き込みます。
$ vi ~/.hgrc
[ui]
username = webadmin <webadmin@sample.com>
で、/var/lib/hg/testに適当にファイルを作ってコミットします。コミットがひとつもないと、Webからアクセスできません。
$ touch index.html
$ hg add index.html
$ hg commit -m "first commit"
次にApacheの設定です。ScriptAliasをVirtualHostの中にでも書いておきます。
ScriptAlias /hg "/home/www/hgweb.cgi"
ここまでできたら、Apacheを再起動します。
これで、http://repository.sample.com/hg/testのようにアクセスできます。ブラウザでも、hg cloneコマンドでも可能です。
リポジトリを追加するときは、/var/lib/hg以下にディレクトリを新規作成して、そのディレクトリでhg initを実行、/home/www/hgweb.configに追記の手順です。
次に認証を追加します。Apacheの設定ファイルの、先ほどのScriptAliasの下にLocationディレクティブを追加します。
<Location /hg>
AuthType Basic
AuthName "Mercurial repositories"
AuthUserFile /home/www/hg/hgusers
AuthGroupFile /home/www/hg/hggroups
Require valid-user
</Location>
ユーザとグループで管理できるようにしました。(グループ作りましたけど意味はなかったです)
# su www
$ mkdir ~/hg
$ cd ~/hg
$ htpasswd -c ./hgusers user1
同じ場所にhggroupsファイルも作成してグループを定義します。svnのdavのようにここでリポジトリのアクセス権限を設定したりすることはできません。
グループの書き方はこちらを参照のこと。
ユーザー認証によるアクセス制限(ベーシック認証編)(2/2)
webからのpushができるようにします。/home/www/.hgrcにセクションを追加します。
この設定は各リポジトリの.hg/hgrcに書いても大丈夫のようです。そうすれば、レポジトリごとに制御できます。
問題はグループごとにアクセスできるリポジトリを制御することなのですが、これは簡単にはできないようです。
ユーザごとには読み込み制御が可能です。allow_readを使います。
この場合は、/var/lib/hg/test/.hg/hgrc(なければ作成)にwebセクションを書きます。
これで大丈夫です。トップページのリストにも、allow_readに含まれていないユーザはリポジトリが表示されません。allow_readは書かなければallow_read=*としたことと同じになります。他にもdeny_readが使えます。
参考
configuration – Mercurial set per user rights – Server Fault
それと、httpsを使わない場合はpush_ssl = falseをhgweb.configのwebセクションに書いておく必要があります。httpsでアクセスさせる場合はそのままでOKです。