以前、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 の仕様により、自ホストから直接アクセス可能な場所にリポジトリがある場合は、
というようにコード変換の有無を切り替えて使うこともできる。
能書きはこの程度にしよう。以下が 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日