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 というアドレスにしている。