=begin
= euc のファイルのみ登録するには
((::))
* 編集者: 森川靖大、石渡正樹
* 最終更新: 2005/11/09 (森川靖大)
#* 最終更新: 2004/10/05 (森川靖大)
* 新規作成: 2004/10/01 (森川靖大)
((::))
((:
:))
((::))
Contents
<<< cvs-eucfile.hindex.rd
((:
:))
((:
:))
以下では、cvs 登録させるファイルの文字コードを特定の日本語文字コード
のみにする方法を記す。
RCS ファイルには本体も commit メッセージも両方書き込まれていることから、
この設定と同時に(())
の設定もおこなうのを勧める。
== 準備 (CVSROOT 編集のために)
ファイルの文字コードを固定するには、
リポジトリ以下の CVSROOT 内を編集する必要がある。
編集のための checkout などの方法については
(())
を参照せよ。
== 方法その1 (石渡スクリプト版)
=== force-euc.pl の追加
フィルタとして((<(({force-euc.pl}))|URL:euc-tools/force-euc.pl>))
を用いる。このフィルタは文字コードを((*EUCのみ*))に制限する。
なおこのフィルタは(())で利用したものと
同じなので、既にそれを利用している場合はこの作業と(())
は必要ない。
#!/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 () {
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})) に以下の一行を追加する。詳細は
(())を参照のこと。
force-euc.pl unable to check out / update force-euc.pl in CVSROOT
編集が終ったら、いつも通り commit する。
$ cvs ci -m "Add force-euc.pl" checkoutlist
=== commitinfo にフィルターを設定1
(({commitinfo})) に以下のように記述する。
DEFAULT perl $CVSROOT/CVSROOT/force-euc.pl
これにより、Shift-JIS や JIS コードのファイルは commit
出来ないようになる。
== 方法その2 (森川スクリプト版)
=== kenjichecker.pl の追加
フィルタとして((<(({kanjichecker.pl}))|URL:euc-tools/kanjichecker.pl>))
を用いる。このフィルタは引数として文字コード渡すことで、
((*EUC、Shift-JIS、JIS*))のどれかに文字コードを制限することができる。
#!/usr/bin/perl
#
# kanjichecker.pl by Morikawa Yasuhiro, 2004
require "jcode.pl";
$correct_default = 'euc'; # 'euc' or 'sjis' or 'jis'
if ($#ARGV < 2){
die "Usage: kanjichecker.pl [euc|sjis|jis] dir filename\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.";
while () {
undef $code;
$code = &jcode::getcode(\$_);
if ($code eq 'binary') {
exit 0;
} elsif (! $code ) {
next;
} elsif ($code eq $current) {
next;
} else {
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
=== checkoutlist の編集2
(({CVSROOT/checkoutlist})) に以下の一行を追加する。詳細は
(())を参照のこと。
kanjichecker.pl unable to check out / update kanjichecker.pl in CVSROOT
編集が終ったら、いつも通り commit する。
$ cvs commit -m "Add kanjichecker.pl" checkoutlist
=== commitinfo にフィルターを設定2
(({commitinfo})) に以下のように記述する。
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
以降は警告を発せられる。
: %r
リポジトリ名 ($CVSROOT のパスの一部)
: %p
リポジトリ内の処理中のディレクトリ名
: %s
コミットされているファイル名のリスト
詳しくは (())
の (())
を参照せよ。
== ファイルの文字コード自動変換
上記では「ファイルの文字コードをチェックして間違っていれば拒否する」と
いう動作設定をおこなったが、以下では「コミットの際にファイルの文字コー
ドを自動変換する」という動作設定をおこなってみる。
しかし、((*2004/10/05現在この方法は利用できない*))ので注意して欲しい
* 理由
* この方法を行なうためには (({CVSROOT/cvswrappers})) にて
(({-t/-f})) といった
フィルタオプションが有効である必要があるのだが、バージョン 1.10
以降、このオプションは使用できなくなっている (いくつかのバグが
あったため、とりあえず使用できなくしたらしい)。よって以降の
手引きは、(({-t/-f})) オプションが利用できるようになった際に行なっ
て欲しい。(T_T)
* そこらへんの事情に関しては以下を参照のこと
* (())
* なお、以下の方法はこの URL を参照して行なった。
* (())
=== 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
=== checkoutlist の編集3
(({CVSROOT/checkoutlist})) に以下の一行を追加する。詳細は
(())を参照のこと。
cvswrap.sh unable to check out / update cvswrap.sh in CVSROOT
編集が終ったら、いつも通り commit する。
$ cvs ci -m "Add cvswrap.sh" checkoutlist
=== cvswrappers にフィルターを設定
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 に変換されてリポジトリに格納されるように
なる。
((:
:))
=end