CVS: UNIX クライアントで sjis ⇔ euc 変換

以前、cvs-ml で、Windows コマンドライン版クライアント cvs に対して、 サーバ側のリポジトリにある EUC のファイルを SJIS に変換して checkout なり update なりを行うようなパッチを公開したことがあった。

相前後して、同じようなポリシーのパッチを公開された方がいた ( CVS の euc / sjis 相互変換モジュール)。 こちらは、半角カナ文字にも対応している。

私はおもにコマンドラインでしか cvs を使っていなかったので、 自分だけで閉じた環境 (UNIX上では EUC でソースファイルを書き、 それを Win に持ってくるときに cvs で変換する) では満足していた。 しかし、会社の同僚たちは、皆、WinCVS のユーザであった。 しかも彼らは、何もパッチの当たっていない生の WinCVS を使っている。 当然、彼らの環境では、EUC で書かれたソースファイルは EUC のままチェックアウトされてしまう。 それを Visual Studio とかで開くと完全に文字化けしており、 コンパイルもエラーになることもしばしばであった。 彼らに合わせるためには、UNIX 上で EUC で書かれたファイルを SJIS に変換してからリポジトリに格納するなど、面倒な作業が必要だった。

そこでちょっと考えたのだが、

ということで、要するに発想の転換である。

昔作ったやつは、pserver や ext でクライアント/サーバ間通信を行うときに 通信用バッファを文字コード変換するやり方だった。 今度もそれと同じやり方にすれば昔のコードを流用できる。 コード変換の方向が逆になるだけだから、修正は簡単。

ということで、次のような仕様になった。

  1. コード変換は、pserver などクライアント/サーバ方式でファイル交換をする場合にのみ行う
  2. コード変換方向は、SJIS (リポジトリ) ⇔ EUC (作業コピー)
  3. 半角カナにも対応する
  4. 念のため、--disable-server を付けて configure する

1 の仕様により、自ホストから直接アクセス可能な場所にリポジトリがある場合は、

というようにコード変換の有無を切り替えて使うこともできる。


能書きはこの程度にしよう。以下が CVS 1.11.6 用のパッチである。

  cvs-1.11.6-sjis-euc-patch.diff

このパッチを適用するには、 ダウンロードリスト から 2182556 cvs-1.11.6.tar.bz2 を選択してダウンロードし、 適当な場所で展開する。

  $ tar xBvf cvs-1.11.6.tar.bz2

次に、src ディレクトリに移り、先ほどの diff ファイルを patch にくわせる。

  $ cd cvs-1.11.6/src
  $ patch < ../../cvs-1.11.6-sjis-euc-patch.diff
  patching file client.c
  patching file commit.c
  patching file import.c
  patching file subr.c
  patching file subr_jconv.c
  patching file subr_jconv.h
  patching file version.c

後は、configure & make するだけ。ここではクライアントとしての動作しか必要ないので、 --disable-server を指定している。

  $ cd ..
  $ ./configure --disable-server
  $ make

物は src/cvs に出来ているので、これを適当なディレクトリに (必要なら jcvs とでも名前をかえて) コピーする。 システムにはじめからインストールされている cvs を上書きしないこと

以下、簡単な使い方 (ここでは jcvs と名前を変えている)

バージョンを確認:
  $ jcvs -v
  Concurrent Versions System (CVS) 1.11.6 (client with sjis/euc conversion 1.1)

まずはログイン:
  $ jcvs -d :pserver:oka@Hoge:/data/cvsroot login
  (パスワード入力)

import してみる:
  $ jcvs -d :pserver:oka@Hoge:/data/cvsroot import Foo oka start
カレントディレクトリのファイルが、EUC ⇒ SJIS 変換されて格納されたはず。

オリジナルの cvs で export してみる:
  $ cd ..
  $ /usr/bin/cvs -d :pserver:oka@Hoge:/data/cvsroot export -Dnow -d Foo_sjis Foo
Foo_sjis の中のファイルは SJIS になっているはず。

jcvs を使って checkout してみる:
  $ rm -rf Foo_sjis
  $ jcvs -d :pserver:oka@Hoge:/data/cvsroot checkout -d Foo_euc Foo
Foo_euc の中のファイルは EUC になっているはず。

commit するときは、リポジトリの指定は不要:
  $ cd Foo_euc
  $ vi foo.cpp
  $ jcvs commit -m "save a modified file" foo.cpp

実際、名前を変えて使用していると、jcvs と打つべきところで cvs とやってしまい、EUC のまま commit してしまったりしたこともあった。 しばらく運用して、とくに支障がないようであれば、/usr/local/bin/cvs あたりにコピーして cvs の名前で使うようにしようかと思っている。


パブリックドメイン

本パッチについて、私は著作権を放棄する。


無保証

当然のことながら、このパッチを適用した結果および 適用して作成されたプログラムを使用した結果について、 私は一切の保証を行わない。


謝辞

半角カナの扱いについては、 CVS の euc / sjis 相互変換モジュール のパッチを参考にさせていただいた。


初出: 2003年6月8日


トップページへ / Last modified: 2003-06-08 11:45:53 JST
Created by OKA Toshiyuki < oka-t@fides.dti.ne.jp >