commit メッセージを euc のみに

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



準備 (CVSROOT 編集のために)

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

方法その1 (石渡スクリプト版)

force-euc.pl の追加

フィルタとしてforce-euc.pl を用いる。このフィルタは文字コードをEUCのみ許容する。 なおこのフィルタはeuc のファイルのみ登録するには ─ 方法その1 石渡スクリプト版で利用したものと 同じなので、既にそれを利用している場合はこの作業とcheckoutlist の編集1 は必要ない。

#!/usr/bin/perl
#
# force-euc.pl by Ishiwatari Masaki, 2004
#   original is forcesjis.pl by TOYODA Eizi, ????


$BinaryPattern = '\.(BMP|CHM|CUR|DAT|DLL|DOC|EXE|GIF|ICO|JPG|LIB|PNG|WAV)$';

for $arg (@ARGV) {
	if (-d $arg) {
	#	chdir($arg) || warn("cannot chdir to $arg ($!)\n");
		next;
	}
	if ($arg =~ m/$BinaryPattern/i) {
		warn("filename $arg seems to be binary: check skipped\n");
		next;
	}
	open(FILE, $arg) || (warn("cannot open $arg ($!)\n"), next);
	$ARGV = $arg;
	while (<FILE>) {
		for ($i = 0; $i < length($_); $i++) {
			$c = substr($_, $i, 1);
			if ($c =~ /[\t\n\r\x20-\x7E\xA1-\xFE]/) {
				next;
			}
			&barf('Broken EUC', $_);
		}
	}
}
exit 0;

sub barf {
	print STDERR "$ARGV: " if $ARGV ne '-';
	warn @_, ". Only EUC-JP or ASCII allowed.\n";
	exit 1;
}

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

$ cvs add force-euc.pl
$ cvs commit -m "Force to change Kanji code to EUC." force-euc.pl

checkoutlist の編集1

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

force-euc.pl        unable to check out / update force-euc.pl in CVSROOT

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

$ cvs ci -m "Add force-euc.pl" checkoutlist

verifymsg にフィルターを設定1

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

DEFAULT perl $CVSROOT/CVSROOT/force-euc.pl

これにより、コミットメッセージに Shift-JIS や JIS は 入力出来ないようになる。

方法その2 (森川スクリプト版)

msgchecker.pl の追加

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

#!/usr/bin/perl
#
# msgchecker.pl by Morikawa Yasuhiro, 2004

require "jcode.pl";

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

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

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

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

while (<MSG>) {
    undef $code;
    $code = &jcode::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 ) {
	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 の編集2

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 にフィルターを設定2

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: 2005/11/09, Since: 2004/10/02