以下では、cvs 登録させるファイルの文字コードを特定の日本語文字コード のみにする方法を記す。 RCS ファイルには本体も commit メッセージも両方書き込まれていることから、 この設定と同時にcommit メッセージを euc のみに の設定もおこなうのを勧める。
ファイルの文字コードを固定するには、 リポジトリ以下の CVSROOT 内を編集する必要がある。 編集のための checkout などの方法については cvs 管理用ディレクトリ CVSROOT の編集 を参照せよ。
フィルタとしてforce-euc.pl
を用いる。このフィルタは文字コードをEUCのみに制限する。
なおこのフィルタはcommit メッセージを 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
commitinfo
に以下のように記述する。
DEFAULT perl $CVSROOT/CVSROOT/force-euc.pl
これにより、Shift-JIS や JIS コードのファイルは commit 出来ないようになる。
フィルタとしてkanjichecker.pl
を用いる。このフィルタは引数として文字コード渡すことで、
EUC、Shift-JIS、JISのどれかに文字コードを制限することができる。
#!/usr/bin/perl require "jcode.pl"; $correct_default = 'euc'; # 'euc' or 'sjis' or 'jis' if ($#ARGV < 2){ die "Usage: kanjichecker.pl [euc|sjis|jis] dir path_to_file\n"; } $current = $ARGV[0] || $current_default; $dir = $ARGV[1]; $file = $ARGV[2]; # if file was removed already, check isn't need. unless (-f $file) { exit 0; } open(FILE, "<$file") || die "$file: cannot open for reading."; $count = 0; while (<FILE>) { $count++; undef $code; $code = &jcode::getcode(\$_); if ($code eq 'binary') { exit 0; } elsif (! $code ) { next; } elsif ($code eq $current) { next; } else { next if ($count == 1 && $_ =~ /^\x89PNG/); # for PNG format image files. die "$file include $code, current code is $current.\n"; } } exit 0;
この kanjichecker.pl
を add、commit して CVSROOT 以下に加える。
$ cvs add kanjichecker.pl $ cvs commit -m "Kanji code checker." kanjichecker.pl
CVSROOT/checkoutlist
に以下の一行を追加する。詳細は
cvs 管理用ディレクトリ CVSROOT の編集 −
checkoutlistを参照のこと。
kanjichecker.pl unable to check out / update kanjichecker.pl in CVSROOT
編集が終ったら、いつも通り commit する。
$ cvs commit -m "Add kanjichecker.pl" checkoutlist
commitinfo
に以下のように記述する。
DEFAULT perl $CVSROOT/CVSROOT/kanjichecker.pl euc %r/%p %s
これにより、Shift-JIS や JIS コードのファイルは commit
出来ないようになる。もしも Shift-JIS や JIS の
ファイルだけ commit したいのならば、引数の euc
を
sjis
や jis
に変更すれば良い。
この例での設定をすると、もしも Shift-JIS や JIS コードのファイルを commit しようとすると以下のようなメッセージが返り、commit を 受け付けない。
=== cd /home/morikawa/hoge0/ === /usr/bin/cvs commit -m 'This is test.' cvs_test.txt cvs_test.txt include sjis, current code is euc. cvs server: Pre-commit check failed cvs [server aborted]: correct above errors first! === Exit status: 1
なお、このリポジトリ内の全てのプロジェクトに対して EUC を強要する場合は 以下のように指定すると良いだろう。
ALL perl $CVSROOT/CVSROOT/kanjichecker.pl euc %r/%p %s
このエントリは、例えば
hoge0 perl $CVSROOT/CVSROOT/kanjichecker.pl jis %r/%p %s hoge1 perl $CVSROOT/CVSROOT/kanjichecker.pl sjis %r/%p %s DEFAULT perl $CVSROOT/CVSROOT/kanjichecker.pl ASCII %r/%p %s ALL perl $CVSROOT/CVSROOT/kanjichecker.pl euc %r/%p %s
のように加えた場合、hoge0 では jis、hoge1 では sjis、それ以外のプロジェクト では ASCII に制限されているが、それら全てのプロジェクトに対して euc を制限するような動作をおこなう。 (つまりこの例のような設定はしてはいけない)。
なお、最後の 2 つの引数はそれぞれ以下の意味を表している。 (これらは省略しても上記の例のように補完されるが、 cvs バージョン 1.12 以降は警告を発せられる。
詳しくは CVS--Concurrent Versions System v1.12.12 の C. Reference manual for Administrative files を参照せよ。
上記では「ファイルの文字コードをチェックして間違っていれば拒否する」と いう動作設定をおこなったが、以下では「コミットの際にファイルの文字コー ドを自動変換する」という動作設定をおこなってみる。
しかし、2004/10/05現在この方法は利用できないので注意して欲しい
CVSROOT/cvswrappers
にて
-t/-f
といった
フィルタオプションが有効である必要があるのだが、バージョン 1.10
以降、このオプションは使用できなくなっている (いくつかのバグが
あったため、とりあえず使用できなくしたらしい)。よって以降の
手引きは、-t/-f
オプションが利用できるようになった際に行なっ
て欲しい。(T_T)文字コード変換用のシェルスクリプトとして cvswrap.sh を用いる。 このシェルスクリプトは文字コードを EUC (または Shift-JIS) に、 改行コードを LF に変換する。
ただし、実は改行コードに関しては完全にお節介で、CVS は自動的に 改行コードを LF に書き換えるようになっている。 (ただし、上記のように明示的に改行コードを変換しないように する場合は例外である)。
#! /bin/sh # # wrapper nkf filter for cvs-server # # Usage: cvswrap [--euc-unix|--sjis-windows] infile outfile # # cvswrap.pl by Morikawa Yasuhiro, 2004 NKF=/usr/bin/nkf # Line Terminator: LF(-Lu), CR/LF(-Lw), CR(-Lm) # Kanji Code: SJIS(-s), EUC(-e), JIS(-j) including hankaku->zenkaku TR=/usr/bin/tr # Cntl-Z=\032(0x1a) if [ ! $3 ] || [ ! -f $2 ] ; then echo "Usage: cvswrap [--euc-unix|--sjis-windows] infile outfile" exit 1 fi opt=$1 infile=$2 outfile=$3 if [ ${opt} = "--euc-unix" ] ; then ${NKF} -eLu ${infile} | ${TR} -d '\032' > /tmp/unkf-cvs$$ mv -f /tmp/unkf-cvs$$ ${outfile} elif [ ${opt} = "--sjis-windows" ] ; then ${NKF} -sLw ${infile} > /tmp/wnkf-cvs$$ mv -f /tmp/wnkf-cvs$$ ${outfile} else echo "Usage: cvswrap [--euc-unix|--sjis-windows] infile outfile" exit 1 fi exit 0
この cvswrap.sh
を add、commit して CVSROOT 以下に加える。
$ cvs add cvswrap.sh $ cvs commit -m "Wrapper nkf filter for cvs-server." cvswrap.sh
CVSROOT/checkoutlist
に以下の一行を追加する。詳細は
cvs 管理用ディレクトリ CVSROOT の編集 −
checkoutlistを参照のこと。
cvswrap.sh unable to check out / update cvswrap.sh in CVSROOT
編集が終ったら、いつも通り commit する。
$ cvs ci -m "Add cvswrap.sh" checkoutlist
cvswrappers に以下のように記述する。
# Convert these Text data to EUC & LF, when they come to repository *.f90 -t 'sh $CVSROOT/CVSROOT/cvswrap.sh --euc-unix %s %s' *.F -t 'sh $CVSROOT/CVSROOT/cvswrap.sh --euc-unix %s %s' *.htm -t 'sh $CVSROOT/CVSROOT/cvswrap.sh --euc-unix %s %s' *.html -t 'sh $CVSROOT/CVSROOT/cvswrap.sh --euc-unix %s %s'
このようにすることで、*.f90、*.F、*.htm、*.html ファイルの 文字コードは EUC & LF に変換されてリポジトリに格納されるように なる。