ここでは www.gfd-dennou.org の /GFD_Dennou_Club/ftp/arch/PROJECT/ 以下に レポジトリを作成する場合を例にとる.
まず www.gfd-dennou.org へログインする.
$ ssh www.gfd-dennou.org
ログインしたら /GFD_Dennou_Club/ftp/arch/PROJECT/ まで移動する.
$ cd /GFD_Dennou_Club/ftp/arch/PROJECT/
開発グループメンバーに書き込み権限を与えるように, グループと環境変数を変更する.
$ sg PROJECT $ umask 002
ちなみに, 現在のグループは id コマンドで, umask は umask コマンドで 知ることができる.
準備が出来たら以下のコマンドを実行する. これで cvsroot ディレクトリが作成される.
$ cvs -d /GFD_Dennou_Club/ftp/arch/PROJECT/cvsroot init
上記の umask 設定に加え, s ビットを立てるなどのパーミッションの設定が 必要となる. また cvs init コマンドで作成したディレクトリやファイルの中 にはグループ書き込み権限が無いものもあるので, 以下のように再設定する.
リポジトリ cvsroot パーミッションの設定
cvsroot 以下に作成されるファイル, ディレクトリのグループを PROJECT に するため, cvsroot に s ビットを立て, 書き込み権限を与える. 念のためにグループも PROJECT に設定する.
$ chmod g+s cvsroot $ chmod g+w cvsroot $ chgrp PROJECT cvsroot
CVSROOT ディレクトリ本体: グループを PROJECT とし, グループに書き込み権限を与える.
$ cd cvsroot $ chgrp PROJECT CVSROOT $ chmod g+s CVSROOT $ chmod g+w CVSROOT
history, val-tags ファイル: CVSROOT 以下にある history, val-tags にグループ書き込み権限を与える.
$ cd CVSROOT $ chmod g+w history $ chmod g+w val-tags
history とはこのリポジトリ以下のプロジェクトに対して行なわれた checkout, commit, rtag, update, release を記録しているファイルである. cvs history コマンドで見ることが出来る (動作の詳細は cvs history -x コマンドを参照のこと).
ここではグループ PROJECT で開発することを念頭に置くため, グループに書き込み権限を与えておく.
val-tags は検索を高速化するために, 有効なタグ名をキャッシュしている ファイルである.
PROJECT プロジェクトではタグも使用するので, これにもグループ書き込み 権限を与える.
リモートホストで作業する場合, cvsroot を指定する環境変数 CVSROOT と www.gfd-dennou.org へのアクセス方法を指定する環境変数 CVS_RSH を設定する.
$ export CVSROOT=:ext:www.gfd-dennou.org:/GFD_Dennou_Club/ftp/arch/PROJECT/cvsroot $ export CVS_RSH=ssh
www.gfd-dennou.org 内で作業をおこなう場合には, 以下のみでも構わない.
$ export CVSROOT=/GFD_Dennou_Club/ftp/arch/PROJECT/cvsroot
次に, プロジェクトとして含むファイル群の位置まで移動する. ここでは /home/morikawa/PROJECT 以下にプロジェクトのソースが展開されているとする.
$ cd /home/morikawa/PROJECT
掃除が終ったらプロジェクトを開始させる. 開始は以下のコマンドでおこなう.
$ cvs import -m \
"PROJECT (Dennou Club Planetary Atmospheric Model) \
Version 0 (Tentative Version)" hogehoge PROJECT Initial
↑ ↑ ↑ ↑
コメント プロジェクト名 | リリースタグ
|| |
ディレクトリ名 |
ベンダープロジェクトのディレクトリのパーミッションを確認しておく.
$ ssh www.gfd-dennou.org $ cd /GFD_Dennou_Club/ftp/arch/PROJECT/cvsroot $ ls -l drwxrwsr-x 3 morikawa PROJECT 53 8月 31 19:40 PROJECT/
上記のようにグループが PROJECT で権限が rws の場合は問題ない. もしそうでないのなら, 以下のコマンドでグループとパーミッションを 変更すること.
$ chgrp PROJECT hogehoge $ chmod g+s hogehoge $ chmod g+w hogehoge
CVSROOT のチェックアウト
コミット時にメールを送信するためにはリポジトリ以下の CVSROOT ディレ クトリ内のファイルを編集する必要がある. そのためまず CVSROOT をチェッ クアウトする.
$ export CVSROOT=:ext:www.gfd-dennou.org:/GFD_Dennou_Club/ftp/arch/PROJECT/cvsroot $ export CVS_RSH=ssh $ cd <適当なディレクトリ> $ cvs checkout CVSROOT
これで CVSROOT ディレクトリが展開される.
cvsform.pl の追加
上記の cvsform.pl をダウンロードし, 適宜設定($mailto0, $project の変数等) を書き換える.
$mailto0 = 'morikawa(at)gfd-dennou.org'; $project = 'PROJECT';
cvsform.pl を編集した後に cvs add, cvs commit で CVSROOT に追加する.
$ cvs add cvsform.pl $ cvs commit -m "Format Messages of commit mail." cvsform.pl
checkoutlist の編集
checkoutlist に cvsform.pl のエントリを追加する. まず CVSROOT を checkout し, その中の checkoutlist を編集する.
$ export CVSROOT=:ext:www.gfd-dennou.org:/GFD_Dennou_Club/ftp/arch/PROJECT/cvsroot $ export CVS_RSH=ssh $ cd <ローカルの適当なディレクトリ> $ cvs checkout CVSROOT $ cd CVSROOT $ emacs checkoutlist
以下の一行を追加する
cvsform.pl unable to check out / update cvsform.pl in CVSROOT
行頭はファイル名, 空白を挟んだ後半がチェックアウトできない場合に 表示されるエラーメッセージである. 編集が終ったら commit する
$ cvs ci -m "Add cvsform.pl" checkoutlist
こうすることで, commit が完了されると共に, メッセージ
cvs server: Rebuilding administrative file database
にもあるように, CVSROOT 以下のファイルがリビルドされ, cvsform.pl,v から cvsform.pl が作成される. 今後, cvsform.pl を commit する毎に, CVSROOT 以下の cvsform.pl も更新される.
loginfo の編集 (プロジェクトと宛先の設定)
最後に loginfo を編集する. ここに, 各々のプロジェクト名と宛先を設定 する. cvsform.pl を作成したので, 以下のように記述する.
hogehoge perl $CVSROOT/CVSROOT/cvsform.pl PROJECT(at)gfd-dennou.org %{sVv}
DEFAULT perl $CVSROOT/CVSROOT/cvsform.pl PROJECT(at)gfd-dennou.org %{sVv}
これにより, hogehoge プロジェクトで行なわれた変更は PROJECT(at)gfd-dennou.org 宛てに送られる. また, それ以外のプロジェクト を立ち上げた場合も 2 行目の設定により PROJECT(at)gfd-dennou.org に送られる.
もしも新しくプロジェクトを始めたならば, 同じように記述すると良い.
CVS は $Revision$ などというような特殊な文字列を $Revision: 1.3 $ のよ うに置き換えたり, 改行コードを LF 形式に置き換えたりするようになってい る.
これは便利な機能の1つなのだが, バイナリデータなどで偶然こういった文字 列と認識されて置き換えられると, 結果的にデータが壊れてしまう. そのため, ある拡張子のデータに関してはバイナリデータと取り扱うようにする. これに は CVSROOT 以下のcvswrappers に以下のような記述を加えると良い.
こうすることで, 拡張子が gif, GIF, jpg のものに関してはバイナリデータ と扱われ, 文字列の置換が行なわれなくなる(これは開発者個々人が cvs add する際に -kb オプションを付けるのと同じ効果を発揮する.)
上記の管理方針で「日本語文字コードは EUC」としていたが, 各ユーザ の開発環境を完全に EUC にすることは難しいため, Shift-JIS などで commit されてしまう可能性がある. よって, EUC 以外の日本語文字コードを含むデー タは, commit されないように設定する. 改行コードは CVS の仕様で自動的に UNIX 形式 (LF 形式) に変換されるので, ここでは気にしないことにする.
文字コードチェック用 Perl スクリプト kanjichecker.pl の追加
上記スクリプトを取得し, CVSROOT に commit する.
$ cvs add kanjichecker.pl $ cvs commit -m "Kanji code checker." kanjichecker.pl
また, checkoutlist に以下の一行を加える.
kanjichecker.pl unable to check out / update kanjichecker.pl in CVSROOT
checklist もまた commit する.
$ cvs commit -m "Add kanjichecker.pl" checkoutlist
commitinfo にフィルターを設定
commitinfo に以下のように記述する.
ALL perl $CVSROOT/CVSROOT/kanjichecker.pl euc
これにより, Shift-JIS や JIS コードのファイルは commit 出来なくなる. もしも sjis や jis コードのファイルを commit しようとすると 以下のようなメッセージが返る.
=== cd /home/morikawa/PROJECT/hogehoge/ === /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 に設定する.
ログメッセージ文字コードチェック用 Perl スクリプト msgchecker.pl の追加
上記スクリプトを取得した後, kanjichecker.pl を以下のように変更する.
1) 2 つ目の引数をファイル名として取る 2) バイナリファイルに対してはエラーを返す 3) ASCII 文字のみ (一切日本語を入れてはダメ) 制限が可能
修正後のソースは以下の通り
#!/usr/bin/perl
require "jcode.pl";
if ($#ARGV < 1){
die "Usage: msgchecker.pl [ASCII|euc|sjis|jis] file\n";
}
$logcode = $ARGV[0]; # 'ASCII', 'euc', 'sjis', 'jis'.
$msg = $ARGV[1];
if (!$logcode){
$logcode = 'ASCII';
}
open(MSG, "<$msg")
|| die "$msg: cannot find log message.";
while (<MSG>) {
undef $code;
$code = &jcode::getcode(\$_);
if ($code eq 'binary') {
die "log message is $code , Please write log message ASCII.\n"
if ($logcode eq 'ASCII');
die "log message is $code , Please write log message ASCII or $logcode .\n";
} elsif (! $code ) {
next;
} elsif ($code eq $logcode) {
next;
} else {
die "log message is $code , Please write log message ASCII.\n"
if ($logcode eq 'ASCII');
die "log message is $code , Please write log message ASCII or $logcode .\n";
}
}
close(MSG);
exit 0;修正した kanjichecker.pl を CVSROOT に commit する.
$ cvs add msgchecker.pl $ cvs commit -m "log message code checker." msgchecker.pl
また, checkoutlist に以下の一行を加える.
msgchecker.pl unable to check out / update msgchecker.pl in CVSROOT
checkoutlist もまた commit する.
$ cvs commit -m "Add msgchecker.pl" checkoutlist
verifymsg にフィルターを設定
verifymsg に以下のように記述する.
hogehoge perl $CVSROOT/CVSROOT/msgchecker.pl euc DEFAULT perl $CVSROOT/CVSROOT/msgchecker.pl ASCII
これにより, hogehoge プロジェクトに対しては ASCII or euc のログメッ セージが許可され, その他のプロジェクトに対しては ASCII のみが許可さ れるようになった. もしも sjis や jis コードのログメッセージで commit しようとすると以 下のようなメッセージが返る.
=== cd /home/morikawa/PROJECT/hogehoge/ === /usr/bin/cvs commit -m 'テスト' cvs_test.txt log message is sjis , Please write log message ASCII or euc . cvs [server aborted]: Message verification failed === Exit status: 1
上記ポリシーで「日本語文字コードは EUC」としていたが, 各ユーザの開発環 境を完全に EUC にすることは難しい, よってテキストデータに関しては, 自 動的に EUC に置換するようにしてしまう.
※ 注意!!! ※ この方法を行なうためには CVSROOT/cvswrappers にて -t/-f といった フィルタオプションが有効である必要があるのだが, バージョン 1.10 以降, このオプションは使用できなくなっている (いくつかのバグが あったため, とりあえず使用できなくしたらしい). よって以降の 手引きは, -t/-f オプションが利用できるようになった際に行なって 欲しい... (T_T) そこらへんの事情に関しては ((<URL:https://www.cvshome.org/docs/infowrapper.html>)) を参照のこと. なお, この方法に関しては ((<URL:http://www.mikamama.com/CVSBook/draft2nd/sec6-5.html>)) を参照した.
文字コード変換用シェルスクリプト cvswrap.sh の追加
文字コードと改行コードを EUC と LF にするためのシェルスクリプト cvswrap.sh をダウンロードし, CVSROOT に commit する.
$ cvs add cvswrap.sh $ cvs commit -m "Wrapper nkf filter for cvs-server." cvswrap.sh
また, checkoutlist に以下の一行を加える
cvswrap.sh unable to check out / update cvswrap.sh in CVSROOT
checkoutlist もまた commit する.
$ cvs commit -m "Add cvswrap.sh" checkoutlist
cvswrappers にフィルターを設定
EUC に変換するファイルを cvswrappers に 以下のように記述する.
このようにすることで, *.f90, *.F, *.htm, *.html ファイルの 文字コードは EUC & LF に変換されてリポジトリに格納されるようになる.
参考文献
カール フォーゲル (著), バー モシュ (著), Karl Franz Fogel (原著), Moshe Bar (原著), 竹内 里佳 (翻訳), でびあんぐる (翻訳), 2002: CVSによるオープンソース開発. [Open Source Development with CVS, Second Edition]. オーム社, ISBN: 4274064735, 380 pp.