euc のファイルのみ登録するには

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



準備 (CVSROOT 編集のために)

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

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

force-euc.pl の追加

フィルタとして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

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

commitinfo にフィルターを設定1

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

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

これにより、Shift-JIS や JIS コードのファイルは commit 出来ないようになる。

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

kenjichecker.pl の追加

フィルタとして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 (<FILE>) {
    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 に以下の一行を追加する。詳細は cvs 管理用ディレクトリ CVSROOT の編集 − checkoutlistを参照のこと。

kanjichecker.pl   unable to check out / update kanjichecker.pl in CVSROOT

編集が終ったら、いつも通り commit する。

$ cvs commit -m "Add kanjichecker.pl" checkoutlist

commitinfo にフィルターを設定2

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

DEFAULT       perl $CVSROOT/CVSROOT/kanjichecker.pl euc %r/%p %s

これにより、Shift-JIS や JIS コードのファイルは commit 出来ないようになる。もしも Shift-JIS や JIS の ファイルだけ commit したいのならば、引数の eucsjisjis に変更すれば良い。

この例での設定をすると、もしも 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
コミットされているファイル名のリスト

詳しくは CVS--Concurrent Versions System v1.12.12C. Reference manual for Administrative files を参照せよ。

ファイルの文字コード自動変換

上記では「ファイルの文字コードをチェックして間違っていれば拒否する」と いう動作設定をおこなったが、以下では「コミットの際にファイルの文字コー ドを自動変換する」という動作設定をおこなってみる。

しかし、2004/10/05現在この方法は利用できないので注意して欲しい

cvswrap.sh の追加

文字コード変換用のシェルスクリプトとして 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 に以下の一行を追加する。詳細は cvs 管理用ディレクトリ 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 に変換されてリポジトリに格納されるように なる。


Last Updated: 2005/11/09, Since: 2004/10/01