ソフラボの技術ブログ

仕事で使ったプログラミング、サーバー周りで役に立つこと、Webサービス開発に必要な技術情報、モバイル情報を書いてます。わかりやすく見やすくをモットーにしています。

SVNでコミット時にコメントのチェックをする

SVNにはフック機能があり、コミット前後等で別の処理を実行することができます。

その機能を使用し、コミット前にコメントが入力されているかチェックし、入力されていなければエラーを返しコミットさせない処理をさせる方法を紹介します。


SVNリポジトリを作成した時にhooksというディレクトリが出来上がります。
その中にtmplというファイルがたくさんあり、それがそれぞれのフックのテンプレートになっています。
それを編集することでフック機能を追加できます。


今回はコミット前に処理をさせたいので「pre-commit」を編集します。
実際にフックを有効にするにはテンプレートファイルの拡張子「.tmpl」を削除します。


pre-commit

#!/bin/sh

# LANG設定
export LANG=ja_JP.utf8

# コミット前の引数
REPOS="$1"
TXN="$2"

# svnlookのパス
SVNLOOK=/usr/bin/svnlook

# 空白を除いてコメント取得
COMMENT=`${SVNLOOK} log -t "${TXN}" "${REPOS}" | sed -e "s/\s//g"`

# 指定文字数未満のとき、コミットしない
if [ ${#COMMENT} -le 5 ]; then
    echo "コメントを入力して下さい。" >&2
    exit 1
fi

exit 0

このシェルスクリプトはコミット時にコメントが5文字未満ならエラーを返します。
簡単にコメント未入力を防ぐだけのスクリプトなので、キッチリやりたい方はゴリゴリ処理を書いて下さい。


今回、スクリプトを書いてみましたが、1点かなりハマった部分がありました。
それはsvnlookで全角のコメントを取得すると「あ」の場合「?\227?\129?\130」というふうに文字化けして、文字数が取得できず大変困ったことです。

OSのエンコード設定がおかしいのかと疑ったのですが、そうではなくスクリプト実行時に文字コードがちゃんと設定されていないために文字化けが起こっていたことがわかりました。

文字化けは環境変数LANGに文字コードを設定することで解決しました。


フックの処理はシェルスクリプト以外にPythonRubyなどの他の言語でも記述できるようです。