%
% DCPAM CVS リポジトリ作成メモ
%
%    履歴  森川 靖大  2004/08/31  作成
%          森川 靖大  2004/09/01  いろいろ書きかけ
%          森川 靖大  2004/09/03  一応完成
%          森川 靖大  2004/09/04  Tips 付記, kanjichecker.pl 修正
%

以下は, DCPAM の CVS リポジトリを作成した際のメモ書きである.

■ 前提

   リポジトリを作成するホストには cvs ソフトウェアが入っている
   必要がある. 

   
■ ポリシー

   ・ DCPAM のリポジトリはホスト www.gfd-dennou.org の
      /GFD_Dennou_Club/ftp/arch/dcpam/cvsroot に作成する

   ・ DCPAM のリポジトリ内のファイルを編集可能なのは,
      www.gfd-dennou.org にアカウントを持ち (ssh で www.gfd-dennou.org
      にログインでき), dcpam グループに入っているユーザのみとする.

   ・ コミット時には dcpam ユーザにメールを送信する.
      - 本来は開発グループの全員にメールを送るべきであろう.
        dcpam ユーザにメールを送るのは, dcpam に送られたメールが
        dcpam グループ全員に送られるような設定が別途なされている
        からである.

   ・ 開発中は内部に大幅な変更が加わり, ディレクトリ構造なども
      どんどん変化することが考えられるため, プロジェクト名として
      始めから「dcpam」を使わず, 「dcpam0」, 「dcpam1」, 「dcpam2」
      を用いる. 大きく変更があり, 以前のものが邪魔になって来たら
      古いプロジェクトは捨て, 新しいプロジェクトを立ち上げてそちらで
      開発をおこなう.
      
   ・ DCPAM のリポジトリ内のテキストデータの日本語文字コードは EUC
      とする. (単にプラットフォームが Linux で, その標準文字コードが
      EUC であるという理由に基づいているのみである).

   ・ 上記と同様に, commit 時のログメッセージに関しても, 英字または
      EUC の日本語のみとする.

■ 参考資料

   以下の作業は概ね以下の資料を参考におこなった.
   もしも作業の際に分からないことがあったり, より詳細なことを
   知りたい場合には参照して頂きたい.

     カール フォーゲル (著), バー モシュ (著), Karl Franz Fogel (原著),
        Moshe Bar (原著), 竹内 里佳 (翻訳), でびあんぐる (翻訳), 2002:
        CVSによるオープンソース開発.
        [Open Source Development with CVS, Second Edition].
        オーム社, ISBN: 4274064735, 380 pp.


■ CVS リポジトリ作成

   ※ 以下のリポジトリ作成に関しては一回こっきりで良いため,
      既に作成済みである場合には下の「■ プロジェクト開始」
      へ行って欲しい.

   DCPAM の CVS リポジトリは www.gfd-dennou.org の
   /GFD_Dennou_Club/ftp/arch/dcpam/cvsroot に作成する.
   そのためにはまず www.gfd-dennou.org へログインする.

     $ ssh www.gfd-dennou.org

   ログインしたら /GFD_Dennou_Club/ftp/arch/dcpam/ まで移動する.

     $ cd /GFD_Dennou_Club/ftp/arch/dcpam/

   ここで cvs コマンドを実行すれば cvsroot を作成可能であるが,
   グループでの開発であることを考え, 作成するファイルのグループが
   dcpam となるように, そしてグループに書き込み権限を与えるように
   グループと環境変数を変更する.

     $ sg dcpam
     $ umask 002

   現在のグループは id コマンドで, umask は umask コマンドで知ることが
   できる. 準備が出来たら以下のコマンドを実行する.

     $ cvs -d /GFD_Dennou_Club/ftp/arch/dcpam/cvsroot init

   これで cvsroot ディレクトリが作成されたはずである.


■ グループ書き込み許可の設定

   上記で umask などの設定をおこなったものの, s ビットを立てるなど,
   パーミッションの設定が必要となる. また cvs init コマンドで
   作成したディレクトリやファイルの中にはグループ書き込み権限が
   無いものもあるので, 以下で設定する.

   □ リポジトリ cvsroot パーミッションの設定

      cvsroot 以下で作成されるファイル, ディレクトリのグループを
      dcpam にするため, cvsroot に s ビットを立て, 書き込み権限を
      与える. 念のためにグループも dcpam に設定する.
   
        $ chmod g+s cvsroot
        $ chmod g+w cvsroot
        $ chgrp dcpam cvsroot
   
   □ 管理用ディレクトリ CVSROOT 内のパーミッションの設定

      cvsroot が作成されれば, そのリポジトリに関する CVS の動作を
      制御する CVSROOT ディレクトリも作成されているはずである.

      このディレクトリ, およびそれ以下の特定のファイルに関して
      グループの変更と書き込み権限変更をおこなう.

      ・ CVSROOT ディレクトリ本体

         グループを dcpam とし, グループに書き込み権限を与える.
         (これは少しアンセキュアな方針かもしれない. よりセキュアな
         方法として, 代表的な管理者 1 人にのみ書き込み権限を与える
         という方針もあり得るだろう).

           $ cd cvsroot
           $ chgrp dcpam CVSROOT
           $ chmod g+s CVSROOT
           $ chmod g+w CVSROOT

      ・ history, val-tags へグループ書き込み権限を与える

         CVSROOT 以下にある history, val-tags にグループ書き込み権限
         を与える. (グループは既に dcpam であると仮定している).

         なお, history とはこのリポジトリ以下のプロジェクトに対して
         行なわれた checkout, commit, rtag, update, release を記録
         しているファイルである. cvs history コマンドで見ることが出来る.
         (動作の詳細は cvs history -x コマンドを参照のこと).
         ここではグループ dcpam で開発することを念頭に置くため,
         グループに書き込み権限を与えておく.

           $ cd CVSROOT
           $ chmod g+w history

         val-tags は検索を高速化するために, 有効なタグ名をキャッシュ
         しているファイルである. DCPAM プロジェクトではタグも使用するので,
         これにもグループ書き込み権限を与える.

           $ chmod g+w val-tags

      
■ プロジェクト開始

   プロジェクトを開始する. そのために, まずは cvsroot を指定する
   環境変数 CVSROOT と www.gfd-dennou.org へのアクセス方法を指定する
   環境変数 CVS_RSH を設定する.
   (これらを指定しなくともコマンドに直接指定する方法もある).

     $ export CVSROOT=:ext:www.gfd-dennou.org:/GFD_Dennou_Club/ftp/arch/dcpam/cvsroot
     $ export CVS_RSH=ssh

   なお, www.gfd-dennou.org 内で作業をおこなう場合には

     $ export CVSROOT=/GFD_Dennou_Club/ftp/arch/dcpam/cvsroot

   のみでも構わない.
  
   次に, プロジェクトとして含むファイル群の位置まで移動する.
   仮に /home/morikawa/dcpam 以下にプロジェクトのソース,
   ドキュメントなど全て含めて置いてあるならば, まず
   そこへ移動する.

     $ cd /home/morikawa/dcpam

   ここで cvs import コマンドを実行するとカレントディレクトリを先頭
   として全てのファイルがインポートされる. 余計なファイルは全て
   消しておくこと. ( .*** ファイルは ls では見えないので ls -a で
   ちゃんと探すこと).

   掃除が終ったらプロジェクトを開始させる.
   開始は以下のコマンドでおこなう.

     $ cvs import -m \
       "DCPAM (Dennou Club Planetary Atmospheric Model) \
        Version 0 (Tentative Version)" dcpam0 dcpam Initial
                        ↑               ↑     ↑    ↑
                      コメント   プロジェクト名 | リリースタグ
                                      ||        |
                                 ディレクトリ名 |
                                               ベンダー

   「No conflicts created by this import」 というような
   メッセージが出れば, インポート成功.

   
■ プロジェクトのパーミッションの確認

   プロジェクトのディレクトリのパーミッションを確認しておく.

     $ ssh www.gfd-dennou.org
     $ cd /GFD_Dennou_Club/ftp/arch/dcpam/cvsroot
     $ ls -l
     drwxrwsr-x    3 morikawa dcpam          53  8月 31 19:40 dcpam0/

   上記のようにグループが dcpam で権限が rws の場合は問題ない.
   もしそうでないのなら, 以下のコマンドでグループとパーミッションを
   変更すること.

     $ chgrp dcpam dcpam0
     $ chmod g+s dcpam0
     $ chmod g+w dcpam0

   なお, もしも dcpam0 が上記のようなパーミッションになっていなかった
   場合, それよりも下層ディレクトリのパーミッションもそれと同様な
   可能性がある. それらに関してもグループとパーミッションを設定すること.

     ※ プロジェクト以下にある「ファイル」に関しては (グループは dcpam
        である必要があるが) パーミッションは -r--r--r--
        で問題ない. cvs コマンドを介せば, 正しく commit, add, remove
        などが可能である.

     
■ コミット時には dcpam ユーザにメールを送信する

   以下では, コミット時にユーザにメールを送信するための設定を記す.

   □ CVSROOT のチェックアウト

      コミット時にメールを送信するためにはリポジトリ以下の
      CVSROOT ディレクトリの loginfo を編集する必要がある.
      直接書き換えることも不可能ではないが, ちゃんとしたお作法として,
      まず CVSROOT をチェックアウトする.
      チェックアウトの方法はその他のプロジェクトと同様である.

        $ export CVSROOT=:ext:www.gfd-dennou.org:/GFD_Dennou_Club/ftp/arch/dcpam/cvsroot
        $ export CVS_RSH=ssh
        $ cd <適当なディレクトリ>
        $ cvs checkout CVSROOT

      すると, CVSROOT ディレクトリが展開される.

   □ cvsform.pl の追加

      あまり難しいことをしなくても, 数行 loginfo に加えるだけでコミッ
      トメールを出すことは可能だが, より見やすいログメッセージを出すべ
      く cvsform.pl を作成する. これは gtool4 開発時に toyoda さんが作
      成した cvsdiff.pl を改造したものである.

      以下に, cvs add した cvsfrom.pl を記しておく. (動作未保証)
      (最新版は CVSROOT をチェックアウトして調べて欲しい).

      ================================================================
      #!/usr/bin/perl
      
      $mailto0 = 'morikawa@gfd-dennou.org';
      $project = 'DCPAM';
      $charcode = 'iso-2022-jp';
      
      # umask 0;
      # open(LOG, ">/tmp/cvsform.tmp");
      
      $mailto = $ARGV[0] || $mailto0;
      $loginfo = $ARGV[1];
      $user = $ENV{'USER'} || $ENV{'LOGNAME'} || $<;
      
      # GMT Time
      ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = gmtime(time);
      $date = sprintf("%04d-%02d-%02dT%02d:%02d-00:00",
                      $year + 1900, $mon + 1, $mday, $hour, $min);
      
      # Local Time (Assume Japan Time)
      ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
      $localdate = sprintf("%04d-%02d-%02dT%02d:%02d+09:00",
                           $year + 1900, $mon + 1, $mday, $hour, $min);
      
      open(MAIL, "|nkf|/usr/lib/sendmail $mailto"); # convert to JIS
      select(MAIL);
      print <<EOF;
      From: $user\@gfd-dennou.org
      To: $mailto
      Subject: dcpam-cvs-commit $date
      Mime-Version: 1.0
      Content-Type: Text/Plain; charset=$charcode
      Content-Transfer-Encoding: 8bit
      
      EOF
      
      @loginfo = split(/\s/, $loginfo);
      $path = shift @loginfo;
      $number = scalar(@loginfo);
      
      if ($loginfo[0] eq '-') {
          @loginfo = ('.,NONE,NONE');
      }
      
      $s = 's' if $number != 1;
      
      print <<EOF;
      At $date ($localdate),
        user $user commited following $number file$s.
      
      EOF
      foreach $hunc (@loginfo) {
          ($fnam, $old, $new) = split(/,/, $hunc);
          print <<EOF;
      $path/$fnam: $old to $new
      EOF
      }
      
      print <<EOF;
      
      EOF
      
      while (<STDIN>) {
          s/\x0D\x0A|\x0D|\x0A/\n/g;  # convert each OS linefeed code to "\n"
          print;
      }
      
      close(MAIL);
      ================================================================

      これを cvs add, cvs commit で CVSROOT に追加する.

        $ cvs add cvsform.pl
        $ cvs commit -m "Format Messages of commit mail." cvsform.pl


   □ CVSROOT 内に cvsform.pl を作成するために

      cvsform.pl を commit したことで, CVSROOT 内に cvsform.pl,v が
      作成されたはずである. しかしこのままでは, CVSROOT 内に 
      cvsform.pl が存在しないので, 本来の役目を果たせない.
      よくよく CVSROOT 内を見ると,

        $ cd cvsroot/CVSROOT
        $ ls -l

        Emptydir/       cvsform.pl,v   loginfo,v  taginfo
        checkoutlist    cvswrappers    modules    taginfo,v
        checkoutlist,v  cvswrappers,v  modules,v  val-tags
        commitinfo      editinfo       notify     verifymsg
        commitinfo,v    editinfo,v     notify,v   verifymsg,v
        config          history        rcsinfo
        config,v        loginfo        rcsinfo,v

      のようにファイルの作業用コピーが RCS リビジョン (****,v) ファイル
      と並んで含まれているのが分かる. CVSROOT という管理ディレクトリの
      特殊機能として, RCS リビジョンを cvs コマンドによって更新すると
      作業用コピーもアップデートされるようになっているのである.

      cvsform.pl もこのようにするには checkoutlist にそのファイルを
      追加すると良い. この場合の更新も, 先と同様, CVSROOT を checkout
      し, その中の checkoutlist を更新し, commit すると良い.

        $ export CVSROOT=:ext:www.gfd-dennou.org:/GFD_Dennou_Club/ftp/arch/dcpam/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 を作成したので, 以下のように
      記述する.

        dcpam0  perl $CVSROOT/CVSROOT/cvsform.pl dcpam@gfd-dennou.org %{sVv}
        DEFAULT perl $CVSROOT/CVSROOT/cvsform.pl dcpam@gfd-dennou.org %{sVv}

      これにより, dcpam0 プロジェクトで行なわれた変更は
      dcpam@gfd-dennou.org 宛てに送られる. また, それ以外のプロジェクト
      を立ち上げた場合も dcpam@gfd-dennou.org に送られる.
      もしも新しくプロジェクトを始めたならば, 同じように記述すると
      良いだろう.

      以上で作業は終了である. 実際のメール配送に関しては dcpam0
      プロジェクト以下のファイルを commit してみて確認して欲しい.


■ バイナリデータの扱い

   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

      以下では, 文字コードのチェック用の Perl スクリプトを作成する.

      以下に, 2004/09/04 現在利用される kanjichecker.pl を記しておく.
      (最新版は CVSROOT をチェックアウトして調べて欲しい).

      ================================================================
      #!/usr/bin/perl
      
      require "jcode.pl";
      $correct_default = 'euc';  # 'euc' or 'sjis' or 'jis'
      
      if ($#ARGV < 2){
          die "Usage: kanjichecker.pl [euc|sjis|jis] dir filename\n";
      }
      
      $current = $ARGV[0] || $current_default;
      $dir     = $ARGV[1];
      $file    = $ARGV[2];
      
      # if file was removed already, check isn't need.
      unless (-f $file) {
          exit 0;
      }
      
      open(FILE, "<$file")
          || die "$file: cannot open for reading.";
      
      while (<FILE>) {
          undef $code;
          $code = &jcode::getcode(\$_);
          if ($code eq 'binary') {
              exit 0;
          } elsif (! $code ) {
              next;
          } elsif ($code eq $current) {
              next;
          } else {
              die "$file include $code, current code is $current.\n";
          }
      }
      
      exit 0;
      ================================================================
   
      これを前回同様 CVSROOT に commit する.
      
        $ cvs add kanjichecker.pl
        $ cvs commit -m "Kanji code checker." kanjichecker.pl

      また, checkoutlist に以下の一行を加え, それもまた commit する.

          kanjichecker.pl   unable to check out / update kanjichecker.pl in CVSROOT

        $ 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/DCPAM/dcpam0/
      === /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


■ ログメッセージの文字コードチェック

   上記の手法だと書き換えられるファイル本体の文字コードのチェックは
   可能だが, ログメッセージの文字コードのチェックが出来ない.
   RCS ファイルには本体もログメッセージも両方書き込まれていることから,
   文字コードは本体と一致させたい. また, リビジョン毎にメッセージの
   文字コードが違うのは気持ち悪いので, それも単一の文字コード
   (ここでは EUC) にする.

   □ ログメッセージ文字コードチェック用 Perl スクリプト msgchecker.pl

      以下では, ログメッセージの文字コードのチェック用の Perl
      スクリプトを作成する.

      以下に, 2004/09/03 現在利用される msgchecker.pl を記しておく.
      (最新版は CVSROOT をチェックアウトして調べて欲しい).

      なお, 上記の 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;
      ================================================================

      これを前回同様 CVSROOT に commit する.
      
        $ cvs add msgchecker.pl
        $ cvs commit -m "log message code checker." msgchecker.pl

      また, checkoutlist に以下の一行を加え, それもまた commit する.

          msgchecker.pl   unable to check out / update msgchecker.pl in CVSROOT

        $ cvs commit -m "Add msgchecker.pl" checkoutlist

   □ verifymsg にフィルターを設定

      verifymsg に以下のように記述する.

        dcpam0    perl $CVSROOT/CVSROOT/msgchecker.pl euc
        DEFAULT   perl $CVSROOT/CVSROOT/msgchecker.pl ASCII


      これにより, dcpam0 プロジェクトに対しては ASCII or euc の
      ログメッセージが許可され, その他のプロジェクトに対しては
      ASCII のみが許可されるようになった.

      もしも sjis や jis コードのログメッセージで commit しようとすると
      以下のようなメッセージが返る.

      === cd /home/morikawa/DCPAM/dcpam0/
      === /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)

        そこらへんの事情に関しては以下を参照のこと
            https://www.cvshome.org/docs/infowrapper.html

   なお, この方法は以下の URL を参照して行なった.

      http://www.mikamama.com/CVSBook/draft2nd/sec6-5.html

      
   □ 文字コード変換用シェルスクリプト cvswrap.sh

      以下では, まず, 文字コードと改行コードを EUC と LF にするための
      シェルスクリプトを作成する.

        ※ 実は改行コードに関しては完全にお節介で, CVS は自動的に
           改行コードを LF に書き換えるようになっている.
           (ただし, 上記のように明示的に改行コードを変換しないように
           する場合は例外である).

      以下に, cvs add した cvswrap.sh を記しておく. (動作未保証)
      (最新版は CVSROOT をチェックアウトして調べて欲しい).

      ================================================================
      #! /bin/sh
      #
      # wrapper nkf filter for cvs-server
      #
      # Usage: cvswrap [--euc-unix|--sjis-windows] infile outfile
      #
      NKF=/usr/bin/nkf
      # Line Terminator: LF(-Lu), CR/LF(-Lw), CR(-Lm)
      # Kanji Code: SJIS(-s), EUC(-e), JIS(-j) including hankaku->zenkaku
      TR=/usr/bin/tr
      # Cntl-Z=\032(0x1a)
      
      if [ ! $3 ] || [ ! -f $2 ] ; then
          echo "Usage: cvswrap [--euc-unix|--sjis-windows] infile outfile"
          exit 1
      fi
      
      opt=$1
      infile=$2
      outfile=$3
      
      if [ ${opt} = "--euc-unix" ] ; then
          ${NKF} -eLu ${infile} | ${TR} -d '\032' > /tmp/unkf-cvs$$
          mv -f /tmp/unkf-cvs$$ ${outfile}
      elif [ ${opt} = "--sjis-windows" ] ; then
          ${NKF} -sLw ${infile} > /tmp/wnkf-cvs$$
          mv -f /tmp/wnkf-cvs$$ ${outfile}
      else
          echo "Usage: cvswrap [--euc-unix|--sjis-windows] infile outfile"
          exit 1
      fi
      
      exit 0
      ================================================================

      これを前回同様 CVSROOT に commit する.
      
        $ cvs add cvswrap.sh
        $ cvs commit -m "Wrapper nkf filter for cvs-server." cvswrap.sh

      また, checkoutlist に以下の一行を加え, それもまた commit する.

          cvswrap.sh        unable to check out / update cvswrap.sh in CVSROOT

        $ cvs commit -m "Add cvswrap.sh" checkoutlist


   □ cvswrappers にフィルターを設定

      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 に変換されてリポジトリに格納されるように
      なる.



%
%  その他, 半端に CVS Tips
%
■ CVS コマンド使い方覚書

   ・ 新規ファイルの追加

        $ cvs add <新規ファイル>
        $ cvs commit -m "コメント" <新規ファイル>
  
   ・ 新規ディレクトリの追加

        $ cvs add <新規ディレクトリ>

   ・ ファイルの削除

        $ rm <削除するファイル>
        $ cvs remove <削除するファイル>
        $ cvs commit -m "コメント" <削除するファイル>

   ・ 削除したファイルの復帰

        $ cvs log <復帰するファイル> |less

      これで, 復帰しようとするファイルの履歴を見てみる.
      そして, 最新版の revision ナンバーがいくつかを調べる.

        $ cvs -Q up -p -r <最新版の一つ前の revision ナンバー> \
                               <復帰するファイル> > <復帰するファイル>

      「最新の revision ナンバー」は消した際のものが当てはまるので,
      指定しても何も帰ってこないので注意.


   ・ タグつけ

        $ cvs -q tag Release-4_1-2003_10_16
                             ↑
                タグ名 (ここでは, <バージョン名>-<日付>としている)

      なお, タグは, 各プログラムにつけられるもので,
      プロジェクトに付くものではないことに注意.


   ・ タグを調べる

      どのようなタグがつけられているかは, 格納されているファイルの
      どれかを log オプションで見ると分かる.
      (タグを付けた際にそのファイルが無かったのなら, そのファイルに
       タグは付かないので注意.)
      
        $ cvs log <適当なファイル>

          RCS file: /GFD_Dennou_Club/ftp/arch/gtool4/cvsroot/gtool4/src/gtool_history.f90,v
          Working file: gtool_history.f90
          head: 1.28
          branch:
          locks: strict
          access list:
          symbolic names:   <== これがタグを示すもの
                  Release-1_0-2003_10_09: 1.28   
                  dc_string-first: 1.6 <─┐↑
                  isovst-last: 1.5   <──タグの数々
                  start: 1.1.1.1  <────┘| 
                  dcstaff: 1.1.1    <────┘
          keyword substitution: kv
                      :



   ・ CVS ディレクトリを作らずに取り出す.
      (開発ディレクトリとしてではなく, プログラムのパッケージとして取り出す)

        ・ リリースタグを用いた方法
        
           $ cvs -q export -r Release-_1-2003_10_16 gt4f90io

        ・ 日付を用いた方法
        
           $ cvs -q export -D "2003-11-11" gt4f90io

           ※ 最新版を取得したいのなら, 「明日」の日付で
              export を行うと良いだろう.

   ※ Emacs から cvs コマンドを直接利用できる pcl-cvs という
      ものもある. メモ書きが
      http://www.ep.sci.hokudai.ac.jp/~morikawa/memo/cvs_emacs.txt
      においてある.


■ コミット後にログメッセージを変更する

   以下のようにバージョンとファイル名を指定して行なう.
   複数ファイルを一度に変更することは不可能である

     $ cvs admin -m 1.4:"Change link about netCDF." install-prepare.htm
     $ cvs admin -m 1.3:"Change link about netCDF." install-prepare_en.html

   ただし, 以下のことに注意すべきである.

     1) この変更に関しては "コミット" ではないので例えコミットメールを
        出すような設定がされていても, 誰にもメールされない.
     2) メッセージに関しては変更履歴が残らないため, 元々のメッセージを
        完全に消去してしまう.

   なるべく変更はおこなわない方が良いが, もしも変更しなければならない
   事情が生じた場合は, プロジェクト全体にメールしてから変更するように
   すべきであろう.

   ◆ 参考文献

      以下の書籍の P156 「コミット後にログメッセージを変更する」

        カール フォーゲル (著), バー モシュ (著), Karl Franz Fogel (原著),
           Moshe Bar (原著), 竹内 里佳 (翻訳), でびあんぐる (翻訳), 2002:
           CVSによるオープンソース開発.
           [Open Source Development with CVS, Second Edition].
           オーム社, ISBN: 4274064735, 380 pp.


■ ディレクトリの改名と移動

   以下の URL からの抜粋
   http://www.linkclub.or.jp/~tumibito/soft-an/cvs/cvs-man/cvs-ja_7.html#SEC74

      ディレクトリの改名と移動の普通の方法は section 通常の改名方法 で
      説明されている ようにその中のそれぞれのファイルを改名もしくは移
      動することです。それか ら section ディレクトリを削除する に説明
      されているように `-P' オプショ ンを付けて取り出します。

      本当にリポジトリの中身を変更してディレクトリを改名したり削除した
      ければ、 次のようにしてください:

         1. ディレクトリを改名する前に、 ディレクトリの作業コピーを取
            り出している全ての人に、 その旨を知らせます。 次のステップ
            に進む前に、彼等全員が変更内容を格納し、 作業コピーを削除
            しなければなりません。

         2. リポジトリ中のディレクトリを改名します。

            $ cd $CVSROOT/parent-dir
            $ mv old-dir new-dir

         3. CVS の管理用ファイルを修正します。 (例えばモジュール名を改
            名する場合等)。

         4. 再び取り出して作業を続けられることを、 全員に知らせます。 

      誰かが作業コピーを消さずに持っていた場合、 彼がリポジトリから消
      されたディレクトリを削除するまで、 彼の発行する CVS コマンドは無
      視されます。

      ディレクトリを移動させるよりは、 ディレクトリ中のファイルを移動
      させる方を推奨します。 ディレクトリを移動させれば、 ディレクトリ
      名に依存している古いリリースを正確に復元する事は、 ほとんど不可
      能になります。