モデルプロジェクトレポジトリ作成メモ
- 森川 靖大, 石渡正樹, 小高正嗣
- 2005/06/21 (小高正嗣) 最終更新
- 2005/10/10 (森川靖大) dcpam 用に新規作成
前提
- リポジトリを作成するホストには cvs ソフトウェアが入っている必要がある.
管理方針
- モデルプロジェクト(プロジェクト名を PROJECT とする) のリポジトリはホスト www.gfd-dennou.org の /GFD_Dennou_Club/ftp/arch/PROJECT/cvsroot に作成する
- 各プロジェクトのリポジトリ内のファイルを編集可能なのは, www.gfd-dennou.org にアカウントを持ち (ssh で www.gfd-dennou.org にログインでき), PROJECT グループに入っているユーザのみとする.
- コミット時には PROJECT ユーザにメールを送信することが望ましい.
- 設定の詳細については * コミット時に PROJECT ユーザにメールを送信するための設定 を参照.
- リポジトリ内のテキストデータの日本語文字コードは EUC とするのが望ましい.
- これは開発プラットフォームが Linux で, その標準文字コードが EUC であるという理由に基づく.
- 上記と同様に, commit 時のログメッセージに関しても, 英字または EUC の日本語のみとするのが望ましい.
CVS リポジトリ作成
ここでは 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 内のパーミッションの設定
CVSROOT ディレクトリ本体: グループを PROJECT とし, グループに書き込み権限を与える.
$ cd cvsroot $ chgrp PROJECT CVSROOT $ chmod g+s CVSROOT $ chmod g+w CVSROOT
- 注) これは少しアンセキュアな方針かもしれない. よりセキュアな方法として, 代表的な管理者 1 人にのみ書き込み権限を 与えるという方針もあり得るだろう.
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
- 余計なファイルを全て消す ( .??* ファイルは ls では見えないので ls -a でちゃんと探すこと).
掃除が終ったらプロジェクトを開始させる. 開始は以下のコマンドでおこなう.
$ cvs import -m \ "PROJECT (Dennou Club Planetary Atmospheric Model) \ Version 0 (Tentative Version)" hogehoge PROJECT Initial ↑ ↑ ↑ ↑ コメント プロジェクト名 | リリースタグ || | ディレクトリ名 | ベンダー
- 「No conflicts created by this import」 というようなメッセージが出れば, インポート成功.
プロジェクトのパーミッションの確認
プロジェクトのディレクトリのパーミッションを確認しておく.
$ 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
- なお, もしも hogehoge が上記のようなパーミッションになっていなかった場合, それよりも下層ディレクトリのパーミッションもそれと同様な可能性がある. それらに関してもグループとパーミッションを設定すること.
- プロジェクト以下にある「ファイル」に関しては (グループは PROJECT で ある必要があるが) パーミッションは -r--r--r-- で問題ない. cvs コマンドを介せば, 正しく commit, add, remove などが可能である.
コミット時に PROJECT ユーザにメールを送信するための設定
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 -k 'b'
- .GIF -k 'b'
- .jpg -k 'b'
こうすることで, 拡張子が 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 -t 'sh $CVSROOT/CVSROOT/cvswrap.sh --euc-unix %s %s'
- .F -t 'sh $CVSROOT/CVSROOT/cvswrap.sh --euc-unix %s %s'
- .htm -t 'sh $CVSROOT/CVSROOT/cvswrap.sh --euc-unix %s %s'
- .html -t 'sh $CVSROOT/CVSROOT/cvswrap.sh --euc-unix %s %s'
このようにすることで, *.f90, *.F, *.htm, *.html ファイルの 文字コードは EUC & LF に変換されてリポジトリに格納されるようになる.
参考資料
参考文献
カール フォーゲル (著), バー モシュ (著), Karl Franz Fogel (原著), Moshe Bar (原著), 竹内 里佳 (翻訳), でびあんぐる (翻訳), 2002: CVSによるオープンソース開発. [Open Source Development with CVS, Second Edition]. オーム社, ISBN: 4274064735, 380 pp.
- CVS のポリシーや設定, 使い方に関する情報に関しては CVS に関するメモ を参照のこと.