[ 地球流体電脳倶楽部 / cc-env / CVS に関するメモ / SIGEN.htm ]

commit メッセージを euc のみに

以下では、commit メッセージの文字コードをチェックする方法を記す。 RCS ファイルには本体も commit メッセージも両方書き込まれていることから、 この設定と同時にeuc のファイルのみ登録するには の設定もおこなうのを勧める。


  1. 準備1 (CVSROOT 編集のために)
  2. 準備2 (perl モジュール Jcode を利用するために)
  3. 特定の文字コードのログメッセージのみでコミット可能に

準備1 (CVSROOT 編集のために)

ファイルの文字コードを固定するには、 リポジトリ以下の CVSROOT 内を編集する必要がある。 編集のための checkout などの方法については cvs 管理用ディレクトリ CVSROOT の編集 を参照せよ。

準備2 (perl モジュール Jcode を利用するために)

ここで行う方法では, Perl スクリプトを用いてコミットするファイルの 文字コード判定を行っている. Perl スクリプトは Jcode モジュール を使用するため, システムに Jcode モジュールがインストールされている 必要がある. Jcode のページを参照し, cvs リポジトリが置いてあるホストに Jcode をインストールすること.

なお, Debian GNU/Linux の場合は下記のコマンドで Jcode モジュールが インストール可能である.

# apt-get install libjcode-pm-perl

特定の文字コードのログメッセージのみでコミット可能に

msgchecker.pl の追加

フィルタとしてmsgchecker.pl を用いる。このフィルタは引数として文字コード渡すことで、 コミットメッセージをEUC、Shift-JIS、JIS、UTF8のどれかの文字コードに 制限することができる。

#!/usr/bin/perl
#
# msgchecker.pl by Yasuhiro MORIKAWA, 2006

use Jcode;

if ($#ARGV < 1){
    die "Usage: msgchecker.pl [ASCII|euc|sjis|jis|utf8] file\n";
}

$logcode = $ARGV[0];   # 'ASCII', 'euc', 'sjis', 'jis', 'utf8'.
$msg     = $ARGV[1];

if (!$logcode){
    $logcode = 'ASCII';
}

open(MSG, "<$msg")
        || die "$msg: cannot find log message.";

while (<MSG>) {
    undef $code;
    ($code, $nmatch) = getcode(\$_);
    if ($code eq 'binary') {
        die "log message is $code , Please write log message ASCII.\n"
            if ($logcode eq 'ASCII');
        die "log message is $code , Please write log message ASCII or $logcode .\n";
    } elsif ($code eq 'ascii') {
	next;
    } elsif ($code eq $logcode) {
	next;
    } else {
        die "log message is $code , Please write log message ASCII.\n"
            if ($logcode eq 'ASCII');
        die "log message is $code , Please write log message ASCII or $logcode .\n";
    }
}

close(MSG);

exit 0;

この msgchecker.pl を add、commit して CVSROOT 以下に加える。

$ cvs add msgchecker.pl
$ cvs commit -m "log message code checker." msgchecker.pl

checkoutlist の編集

CVSROOT/checkoutlist に以下の一行を追加する。詳細は cvs 管理用ディレクトリ CVSROOT の編集 − checkoutlistを参照のこと。

msgchecker.pl   unable to check out / update msgchecker.pl in CVSROOT

編集が終ったら、いつも通り commit する。

$ cvs commit -m "Add msgchecker.pl" checkoutlist

verifymsg にフィルターを設定

verifymsg に以下のように記述する。

hoge0     perl $CVSROOT/CVSROOT/msgchecker.pl euc %l
DEFAULT   perl $CVSROOT/CVSROOT/msgchecker.pl ASCII %l

これにより、hoge0 では Shift-JIS や JIS コードのコミットメッセージは 拒否される。またそれ以外のプロジェクトでは ASCII 以外のコミットメッセージは 拒否される。 Shift-JIS や JIS コードのメッセージに制限したいの ならば、引数の eucsjisjis に 変更すれば良い。また ASCII のメッセージのみに制限したいならば 引数を ASCII にするとよい。

もしも許可しないコードのコミットメッセージを入力すると 以下のようなメッセージが返る。

=== cd /home/morikawa/hoge0/
=== /usr/bin/cvs commit -m 'テスト' cvs_test.txt

log message is sjis , Please write log message ASCII or euc .
cvs [server aborted]: Message verification failed
=== Exit status: 1

なお、最後の引数は以下の意味を表している。 (これらは省略しても上記の例のように補完されるが、 cvs バージョン 1.12 以降は警告を発せられる。

%l
チェックされるログメッセージが含まれているファイルへのフルパス

詳しくは CVS--Concurrent Versions System v1.12.12C. Reference manual for Administrative files を参照せよ。


Last Updated: 2006/08/29 (森川靖大), Since: 2004/10/02 (森川靖大)