[ 地球流体電脳倶楽部 / cc-env / CVS に関するメモ / SIGEN.htm ]

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

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


  1. 準備1 (CVSROOT 編集のために)
  2. 準備2 (perl モジュール Jcode を利用するために)
  3. 特定の文字コードのファイルのみをコミット可能に
  4. ファイルの文字コード自動変換

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

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

準備2 (perl モジュール Jcode を利用するために)

ここで行う方法では, Perl スクリプトを用いてコミットするファイルの 文字コード判定を行っている. Perl スクリプトは Jcode モジュール を使用するため, システムに Jcode モジュールがインストールされている 必要がある. Jcode のページを参照し, cvs リポジトリが置いてあるホストに Jcode をインストールすること.

なお, Debian GNU/Linux の場合は下記のコマンドで Jcode モジュールが インストール可能である.

# apt-get install libjcode-pm-perl

特定の文字コードのファイルのみをコミット可能に

kenjichecker.pl の追加

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

checkoutlist の編集1

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 にフィルターを設定

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

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

注意 (この方法は現在利用できません)

※ この方法は 2006/08/29 現在、利用不能である。参考のため一応 過去の作業ログを残しておく。※

文字コード自動変換の概要

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

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 の編集2

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: 2008/09/22 (森川靖大), Since: 2004/10/01 (森川靖大)