CVSNTによるドライブ名を含むリポジトリパスに,LinuxのCVSコマンドからアクセスする方法

1.背景

CVSサーバにCVSNTを使った場合,リポジトリパスが以下のようにドライブ名を含む場合がある.
 D:/cvshome

Linux標準のCVSコマンドで,このようなリポジトリパスへ接続しようとすると, 以下のようにエラーになる.

$ export CVSROOT=:pserver:kamoi@cvsserver:D:/cvshome
$ cvs login
cvs login: CVSROOT may only specify a positive, non-zero, integer port (not `D:').
cvs login: Perhaps you entered a relative pathname?
cvs [login aborted]: Bad CVSROOT: `:pserver:kamoi@cvsserver:D:/cvshome'.
eclipseでも,WinCVSでもうまくいくのに,何故だ...

それでCVSのソースを見たところ,CVSコマンドではリポジトリパスが必ず「/」で始まると想定しているようで, 今回のようにドライブ名から始まるものは扱えないようだ.

そこで仕方がないので,CVSを改造することにした.

今回のCVS改造を適用したことで何か不具合が起こっても,私は責任は取れませんのでご了承ください.

2.改造の内容

最新のCVSのソースを, http://www.ring.gr.jp/pub/misc/cvs/source/stable/ からダウンロードした. 今回使ったのは,
  • cvs-1.11.22.tar.gz

である.

手がかりとして以下のエラーメッセージ

 CVSROOT may only specify a positive

でソース内をgrepしたところ,root.cでCVSROOTの解析処理を行っていた.ここを改造した.

以下がそのパッチである.

root.c-1.11.22_patch

473a474,475
> 	    error (0, 0,
> ":(gserver|kserver|pserver):[[user][:password]@]host[:[port]]://drivename:/path"); /* 2007.04.28 kamoi */
522a525,529
> 		    if (*q == ':') /* 2007.04.28 kamoi */
> 		    {
> 		    	*q = '\0';
> 		    	break;
> 		    }
553a561,564
> 	if (*(cvsroot_copy + 1) == '/') /* 2007.04.28 kamoi */
> 	{
> 		cvsroot_copy += 2;
> 	}

root.c-1.11.22_patch へのリンク

これにより,CVSROOTに従来の

:(gserver|kserver|pserver):[[user][:password]@]host[:[port]]/path
という形式に加えて,
:(gserver|kserver|pserver):[[user][:password]@]host[:[port]]://drivename:/path
というドライブ名を含む形式も使えるようになった.

3.改造版の使い方

http://www.ring.gr.jp/pub/misc/cvs/source/stable/1.11.22/ から
  • cvs-1.11.22.tar.gz

をダウンロードし,今回のパッチを用意して,以下のように実行すればよい.

tar zxf cvs-1.11.22.tar.gz
cd cvs-1.11.22/src
patch root.c root.c-1.11.22_patch ←今回作成したパッチ
cd ..
./configure
make
make install ←これはrootで実行

4.使用例

例えば以下のような状態なら,
項目
CVSサーバのホスト名cvsserver
接続方式pserver
CVSへのログインユーザ名kamoi
リポジトリーパスD:/cvshome

$ export CVSROOT=:pserver:kamoi@cvsserver://D:/cvshome
$ cvs login
という感じで使える.


© 2024 KMIソフトウェア