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


    Contents


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

1 準備 (CVSROOT 編集のために)

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

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

2.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

2.2 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

2.3 commitinfo にフィルターを設定1

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

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

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

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

3.1 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

3.2 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

3.3 commitinfo にフィルターを設定2

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

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 を参照せよ。

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

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

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

4.1 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

4.2 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

4.3 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 に変換されてリポジトリに格納されるように なる。