ファイヤープロジェクト
Context Switch for CVS
2003-08-25T20:50+09:00   matsu
複数のリポジトリを頻繁に使い分けるとき,いちいちCVSROOTを書き換えたり,書き換えるためのスクリプトを実行するのは面倒くさい.そこで,その辺の作業を簡易にするスクリプトを作成した.
cs4cvsは以下のように実行する.
cs4cvs [ -r コンテキスト名 ]
すると,設定ファイルからCVSROOTとCVS_RSHを設定し,作業ディレクトリのサブディレクトリにいなければ作業ディレクトリに移動する.そして,bashを起動する.-rオプションとその値を指定しない場合は,既定の環境変数の値を使用する.設定ファイルは$HOME/.cs4cvsである.設定ファイルの例を以下に示す.
FP_CVS_RSH=ssh
FP_CVSROOT=~/REPOSITORY
FP_WORK=/home/user/work/
X3Cs_CVS_RSH=ssh
X3Cs_CVSROOT=~/X3CsROOT
X3Cs_CVS_WORK=/home/user/X3Cs/
各行は
コンテキスト名_環境変数=値
となっている.環境変数はCVSROOT,CVS_RSH,CVS_WORKである.前者二つはCVSでおなじみである.CVS_WORKはこのスクリプト用のもので,作業ディレクトリを意味する.CVS_WORKの値は/で終る必要がある.設定ファイルに指定したコンテキスト用のCVSROOT,CVS_RSHの記述がなければ既定の値を使用する(より正確には,指定したコンテキストのための環境変数の設定をしない).設定ファイルに指定したコンテキスト用のCVS_WORKの記述がなければ,CVS_WORKは無視する.あと,$HOMEを参照できないので,CVS_WORKを設定するときは~/などは使用できない.
cs4cvsのソースを以下に示す.
こんなの30分位で書きたいものだが,getoptにハマったりして2時間くらいかかった.
getoptコマンドはgetopt関数(getopt関数についてはfeature/C言語で既に書いた)を使用してgetopt関数と同じようなことをシェルスクリプトで実現する.
getopt optstring parameters
getopt [options] [--] optstring parameters
getopt [options] -o|--options optstring [options] [--] parameters
optstringはオプション文字を意味する.例を以下に示す.
$ getopt ab:c '-ab hoge -c'
 -a -b  hoge -c --
とすれば,オプションはa,b,cであり,オプションbは値を取るということになる.そして解析する与えられたオプションは'-ab hoge -c'である.それらを解析した結果が出力である.この出力は,-abを-a -bなどとバラしてくれるので,シェルスクリプトでは楽に扱える.すなわち,
set -- $(getopt ab:c $*)
とすれば,シェルスクリプトのオプションを,与えられたものからgetoptで解析した結果に置き換えることができる.あとは$1,$2,...としてオプションを参照できる.ソースでは関数optionCheckで
	OPTION=$(getopt r: $*)
	if [ ! $? -eq 0 ]
	then
		printUsage
		exit 1;
	else
		set -- ${OPTION}
	fi
としている.一度OPTIONにgetoptの解析結果を格納して,setする前にgetoptの終了ステータスをチェックしている.
$?は最後に実行されたフォアグラウンドのパイプラインの終了ステータスに展開される
(man bashより).
だから,
set -- $(getopt ab:c $*)
とすると,setの終了ステータスが$?に格納されてしまうので,うまくいかない.
大抵の人は.bashrcや.bash_profileでCVSROOTやCVS_RSHの設定いることだろう.だからこのスクリプトの最後でbashを呼び出す時は,それらを読み込まないようにしなければならない.そこで以下のようにした.
bash --noprofile --norc
CVS_WORKの値は/で終る必要がある.そうしなければ,例えば二つのディレクトリのパス/hogeと/hoge2の区別をつけることができない.該当部分は関数gotoWorkDirである.うまい方法が見付からなかったし,それほど重大ではないので制限とした.
このスクリプトの有用性は...あんまりない.何故ならCVSROOT毎に環境変数を設定する2,3行程度のスクリプトをリポジトリ毎に作成してsourceすればよいからだ...意外と時間かかったのになぁ.
matsu(C)
Since 2002
Mail to matsu