post-commit フックスクリプト

あまり深く考えずに書いたらこうなった。

#!/bin/sh
export LANG=ja_JP.utf-8

REPOS="$1"
REV="$2"

SVN="/opt/CollabNet_Subversion/bin/svn"
NKF="/usr/local/bin/nkf"
SENDMAIL="/usr/sbin/sendmail"

TMPFILE=/tmp/post-commit.$$
BASEPATH="/var/svn-repos/"
BASEURL="http://foo.example.jp/repos"
PREV=`expr ${2} - 1`
REPO=`echo ${REPOS} | sed -e "s#${BASEPATH}##g"`
URL="${BASEURL}/${REPO}"

TO="hiro-ueda@example.jp"
FROM="hiro-ueda@example.jp"

exec 2>&1
exec 1>${TMPFILE}

CleanUp(){
  rm -f ${TMPFILE}
  exit $1
}

trap 'CleanUp' 1 2 3 5 15

echo "From: ${FROM}"
echo "To: ${TO}"
echo 'Subject: =?ISO-2022-JP?B?GyRCJWolXSU4JUglahsoQg==?='
echo " '${REPO}' =?ISO-2022-JP?B?GyRCJCw5OT83JDUkbCReJDckPxsoQg==?="
echo "Content-Type: text/plain; charset=iso-2022-jp"
echo "MIME-Version: 1.0"
echo
echo "リポジトリ ${REPO} が更新され、rev. ${REV} になりました。" | sed -e "s#${BASEPATH}##g"

echo
echo "チェックインのログ:"
${SVN} log -r ${REV} ${URL} | sed -e "s#${BASEURL}##g"

echo
echo "追加(A)・変更(M)・削除(D)されたファイル・ディレクトリ:"
echo "------------------------------------------------------------------------"
${SVN} diff --summarize  -r ${PREV}:${REV} ${URL} | sed -e "s#${BASEURL}/##g"
echo "------------------------------------------------------------------------"

cat ${TMPFILE} | ${NKF} -Wjm0 | ${SENDMAIL} -t -f${FROM}

rm -f ${TMPFILE}

CleanUp 0

post-commit の引数がリポジトリのパスとリビジョン番号だけとは思わなかったなぁ。コミットしたユーザ名くらいは取れるのかと思ったんだが… svn log とかで頑張れば取れなくないけど、そこまでしなくていいか。