実戦版もMercurialにしようかな

去年の2月あたりに Mercurialむっちゃええやんって思い始めて、細々発生する履歴管理には hg を使っていたが、本気でリポジトリ管理するようなものは依然 svn のままであった。なんか本気で移行するには何か使いづらい予感があったのだが、 やっと払拭できた気がする。個人的に使いづらいと感じた原因は この絵 A Decentralized System にとらわれすぎていたためだと分かった。

確かにこのフローのようにどれを親と決めずにリポジトリ間のやりとりをす るのがDVCSのいいところだが、こういう使い方をしなきゃいけないってわけじゃ ない。個人的な利用形態では今までどおりサーバ上に 中央リポジトリを置いてその他はクライアントとする方が使いやすい。

てことで、これまで CVS や Subversion のリポジトリを置いていたエリアに Mercurial用のトップディレクトリを作って様々な場所での更新を中央経由で やるようにしたら普通に使いやすい。これまでsvnではオフラインでコミット できない不便があって、ついお出かけ先でさぼりがちになったがhgなら 問題なし(と思う:-)。

hg: コミットログ送信

さて、集中リポジトリにすると決めたらこれまでsvnで仕掛けていたような、 コミット時にログメッセージ+差分をメイル送信するフックが欲しい。 あこれ、hgrc(5) に大体載ってるやね。どれを使うかようわからん。

集中リポジトリにpushされたタイミングでそれに含まれる 差分情報すべてを1通のメイルにして送って欲しい。試行錯誤の結果 changegroup がいいみたいだ。

集中リポジトリの .hg/hgrc にこんなん追加。

[hooks]
changegroup.mail = .hg/logsend

右辺に書いたのは適当なファイル名。logsend を こんな感じで作ってみた。

#!/bin/sh
RCPT=送りたい宛先アドレス
MODULE=Subjectに現れるモジュール名

$HG update -C >/dev/null 2>&1

SUBJECT="hg $MODULE repo. update"

$HG log -p -vr $HG_NODE:tip \
 | egrep -v '^(changeset|parent|date):' \
 | sed 's/^description:$/------------------------------------------/' \
 | cat -s | Mail -s "$SUBJECT" $RCPT

同様のことをsvnでやる、つまりリポジトリ側でコミットされたものの 差分を得る、ってのを調べるのに苦労した記憶が。リポジトリのディレクトリ は svn diff 使えなくて(当たり前)、svnlook diff を使わないとダメだった。