以下では、cvs 登録させるファイルの文字コードを特定の日本語文字コード のみにする方法を記す。 RCS ファイルには本体も commit メッセージも両方書き込まれていることから、 この設定と同時にcommit メッセージを euc のみに の設定もおこなうのを勧める。
ファイルの文字コードを固定するには、 リポジトリ以下の CVSROOT 内を編集する必要がある。 編集のための checkout などの方法については cvs 管理用ディレクトリ CVSROOT の編集 を参照せよ。
ここで行う方法では, Perl スクリプトを用いてコミットするファイルの 文字コード判定を行っている. Perl スクリプトは Jcode モジュール を使用するため, システムに Jcode モジュールがインストールされている 必要がある. Jcode のページを参照し, cvs リポジトリが置いてあるホストに Jcode をインストールすること.
なお, Debian GNU/Linux の場合は下記のコマンドで Jcode モジュールが インストール可能である.
# apt-get install libjcode-pm-perl
フィルタとしてkanjichecker.pl を用いる。このフィルタは引数として文字コード渡すことで、 EUC、Shift-JIS、JIS、UTF8のどれかに文字コードを制限することができる。
#!/usr/bin/perl use Jcode; $correct_default = 'euc'; # 'euc' or 'sjis' or 'jis' or 'utf8' $jcodecheck_size = 1024; if ($#ARGV < 2){ die "Usage: kanjichecker.pl [euc|sjis|jis|utf8] 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; until (eof(FILE)) { $count++; undef $code; read(FILE, $char, $jcodecheck_size); ($code, $nmatch) = getcode(\$char); if ($count == 1) { exit 0 if ($char =~ /^\x89PNG\r/); # for PNG format image files. exit 0 if ($char =~ /^GIF8[79]a/); # for GIF format image files. exit 0 if ($char =~ /^\xFF\xD8/); # for JPEG format image files. exit 0 if ($char =~ /^\x42\x4D/); # for BMP format image files. exit 0 if ($char =~ /^CDF(\x01|\x02)/); # for NetCDF format data files. } if ($code eq 'binary') { exit 0; } elsif ($code eq 'ascii') { next; } elsif ($code eq $current) { next; } elsif ($code eq '') { next; } else { die "$file include $code, current code is $current.\n"; } } close(FILE); 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 を参照せよ。
※ この方法は 2006/08/29 現在、利用不能である。参考のため一応 過去の作業ログを残しておく。※
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 に変換されてリポジトリに格納されるように なる。