Title: commit メッセージを euc のみに


    Contents


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

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

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

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

2.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

2.2 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

2.3 verifymsg にフィルターを設定1

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

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

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

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

3.1 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

3.2 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

3.3 verifymsg にフィルターを設定2

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 を参照せよ。