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点が欲しい。
各コミッタが更新をpushした場合にサーバ上の ワーキングコピーもupdateしたい
だれかが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 というアドレスにしている。