Mercurial 共同管理リポジトリ

Webサーバ上のコンテンツを Mercurial で共同管理する場合の話。

たとえば、Webサーバで公開すべきドキュメントを /var/htdocs に置き、それを共同管理する必要があるとき。 サーバー上のリポジトリに更新を送り込んだら、サーバ上の ワーキングコピーもupdateして公開としたい。さあどうするのがよいか。

複数人のコミッター認める方法 にあるように、SSHでWebコンテンツ所有者アカウントを作り、 そこの authorized_keys に各コミッタの鍵を登録しておく。 このユーザを publish としよう。MercurialをインストールしたWebサーバ でこんな感じ。

sudo -u publis -H -s
mkdir /var/htdocs/contents
初期コンテンツを作る。続いてリポジトリ初期化。
hg init; hg ci -A -m init

これを各コミッタがクローンして各自いじくる。

hg clone ssh://server//var/htdocs/contents

さて、共同管理の場合以下の2点が欲しい。

  1. 各コミッタが更新をpushした場合にサーバ上の ワーキングコピーもupdateしたい

  2. だれかがpushしたらコミッタ全員にログを送りたい

どちらもサーバ上のリポジトリの .hg/hgrc 内にhookを書く。hookの走るタイミングとしては changegroup でよいだろう。

[hooks]
changegroup.update	= hg up
changegroup.notify	= .hg/hglogsend

ドットの後ろの単語は何でもよい。hgrc(5)参照。 changegroup.notify 通知メイルを送るもの。 hglogsend は勝手に自分でスクリプトを作る。たとえばこう。

#!/bin/sh
PATH=/usr/local/bin:$PATH; export PATH
host=`hostname`
repdir=`pwd`
rep=`basename $repdir`
sj="Commit-Log of $rep"
rcpt=up-log@$host
LC_CTYPE=ja_JP.eucJP \
hg log -p -vr $HG_NODE:tip \
 | egrep -v '^(changeset|parent|date):' \
 | sed 's/^description:$/---------------------------------------------/' \
 | cat -s | nkf -j \
 | if [ -n "$HG_NODE" ]; then
     Mail -s "$sj" $rcpt
   else
     cat
   fi

変数は適宜設定のこと。この例ではコミット通知の送信先をサーバホストの up-log というアドレスにしている。