以下では、commit メッセージの文字コードをチェックする方法を記す。 RCS ファイルには本体も commit メッセージも両方書き込まれていることから、 この設定と同時にeuc のファイルのみ登録するには の設定もおこなうのを勧める。
ファイルの文字コードを固定するには、 リポジトリ以下の CVSROOT 内を編集する必要がある。 編集のための checkout などの方法については cvs 管理用ディレクトリ CVSROOT の編集 を参照せよ。
フィルタとして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
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
に以下のように記述する。
DEFAULT perl $CVSROOT/CVSROOT/force-euc.pl
これにより、コミットメッセージに Shift-JIS や JIS は 入力出来ないようになる。
フィルタとして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
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 コードのメッセージに制限したいの
ならば、引数の euc
を sjis
や jis
に
変更すれば良い。また 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 以降は警告を発せられる。
詳しくは CVS--Concurrent Versions System v1.12.12 の C. Reference manual for Administrative files を参照せよ。