モデルプロジェクトレポジトリ作成メモ

  • 森川 靖大, 石渡正樹, 小高正嗣
    • 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 ユーザにメールを送信することが望ましい.
  • リポジトリ内のテキストデータの日本語文字コードは 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 &lt; 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, "&lt;$msg")
           || die "$msg: cannot find log message.";
    
    while (&lt;MSG&gt;) {
        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 に関するメモ を参照のこと.