CVS を使用した Debian パッケージ管理

この短い文書は、パッケージの CVS 管理への変換において簡単な手助けを与えることだけを目的としています。 おそらく、あまり CVS やバージョン管理に詳しくない人以外には興味深いものではないでしょう。 また、/usr/share/doc/cvs-buildpackage 以下に cvs-pkginit というスクリプトがあり (これにはスクリプトと man ページが両方入っています)、この HOWTO 文書の概要を出力します。

例えば、パッケージ foo、バージョン bar1、Debian 改訂 3 を変換するのに

% cvs-pkginit foo bar1 3

を実行して概要をつかんでください。

Oldenburg, 6/2/97                           Joey (joey@debian.org)
                                            / Martin Schulze   /
Mobile,                                     Manoj Srivastava
                                            srivasta@debian.org

注: 以下の説明では、山形括弧 <> の中はその都度変更、 それ以外についてはそのままで入力します。例えば、上流のバージョンが 2.1.82 のパッケージであれば <バージョン> は 2.1.82 を、 upstream_version_<バージョン | tr . _> は upstream_version_2_1_82. の意味になります。

  1. CVS の設定
       $ CVSROOT=/where/your/repository/will/be
       $ export CVSROOT
       $ cvs init
       $ mkdir $CVSROOT/debian
    

    これで、Debian パッケージとそれ以外が今後リポジトリ中で分離されることになります。 他の目的で CVS が必要になることはないと思っても、 後で後悔するよりも、ここでリポジトリを作って分類しておくのが得策です (後からリポジトリに移すのは手間が増えることになります)。

    もし複数の人が、CVS を使うのであればその人たちが 、CVS を使って実際にリポジトリを変更できることを確認しなければなりません。 リポジトリの一部へのアクセスを許可するグループ (または一組のグループ) を選択して権限をセットしてください:

       # chgrp <アーカイブ> $CVSROOT/debian
       # chmod g+ws    $CVSROOT/debian
    

    これで、アーカイブグループのメンバーがリポジトリの 設定を許可されていることを確かめます。次は正しいグループで リポジトリの一部を変更できることを確認する必要があります。

       # mkdir $CVSROOT/debian/<パッケージ1>
       # chgrp <グループ1> $CVSROOT/debian/<パッケージ1>
       # chmod g+ws     $CVSROOT/debian/<パッケージ1>
       # mkdir $CVSROOT/debian/<パッケージ2>
       # chgrp <グループ2> $CVSROOT/debian/<パッケージ2>
       # chmod g+ws     $CVSROOT/debian/<パッケージ2>
    

    一般ユーザで "-d /where/your/repository/will/be" を指定するかプロファイルに書き込んで、CVS リポジトリを公開してください。

       $ CVSROOT=/where/your/repository/will/be
       $ export CVSROOT
    
  2. モジュールの使用
       # cvs checkout CVSROOT
       # cd CVSROOT
       # vi modules
    

    以下において、<パッケージ> は debian/changelog ファイル中と同様にパッケージ名にしてください。

    以下の行を追加してください。先頭行は必須です。 二行目は複製でもかまいません。一目瞭然なものがいいでしょう:

       modules   CVSROOT modules
       <パッケージ> debian/<パッケージ>
    
       # cvs commit -m '一つ目のモジュールを定義'
    
  3. CVS を使う準備

    以下のコマンドでソースツリーを加えます (すでに debian 化が済んで orig.tar.gz ファイルがあるものと仮定しています)。 上流ソースが -ko オプション付き (バイナリファイルに注意してください) でインポートされますがここでは手元の変更は入っていないことに注意してください。 CVS タグ名の決定にはエポックは無視されることに注意してください (これは一般に dpkg が判断するパッケージの順序を変更するのに使用され、 通常 CVS タグとして適切ではありません)。

    CVS に入れようとしている debian 化した開発ソースツリーの場所へ移動してください (これは通常 CVSROOT 以下にありません)。

    繰り返します: 以下で、<パッケージ> は debian/changelog ファイル中と同様にパッケージ名にしてください。

       $ cd /where/your/source/tree/resides/
       $ tar zvfx <パッケージ>_<バージョン>.orig.tar.gz
       $ cd <パッケージ>_<バージョン>.orig
       $ cvs import -ko -m 'そのままのソース' debian/<パッケージ> source-dist upstream_version_<バージョン|tr . _>
    

    ブランチタグの source-dist は好きなように変更してください。 (cvs-buildpackage メンテナは常に上流のタグを使います (余計なことですが ;-)))。

    CVS を root で設定し、グループに書き込み権限を与えていない場合、 root で $CVSROOT/debian/<パッケージ> を作成し、 リポジトリの所有ユーザかグループを特定のグループかユーザに 変更しなければなりません。CVS インポートすると debian/<パッケージ> ディレクトリを作成できないという警告が表示されますが、 これは大丈夫です。

    次の段階はツリー全体をチェックアウトし、変更をすべて組み込むことです。

       $ cd /where/your/source/tree/will/reside
       $ cvs checkout <パッケージ>
    

    これまで CVS を使うことなく debian 化したバージョンを作成した場合、 以下のコマンドを実行して変化を組み込むこともできます。 それから、そのリリースにタグを付けておけば、 後でそれをチェックアウトすることができます。

       $ cd /where/your/source/tree/resides/<パッケージ>-<バージョン>
       $ diff -qrBbw . /where/your/source/tree/will/reside/<パッケージ>/ | grep -v CVS
       $ FILES_CHANGED_LOCALLY="<上の出力>"
       $ tar cf - $FILES_CHANGED_LOCALLY | tar -C /where/your/source/tree/will/reside/<パッケージ> -xvpf -
       $ cd /where/your/source/tree/will/reside/<パッケージ>
    

    debian/rules ファイルを実行可能にしてエクスポートしたときに実行可能になるように、 また、エクスポートしたソースで dpkg-buildpackage を実行して問題がないか確認してください。 一般に、ファイルがすべて正しい権限になっているか、CVS リポジトリに追加する前に確認してください。

       $ cd /where/your/source/tree/will/reside/<パッケージ>
       $ cvs add debian <追加した他のファイルについても同様>
    

    また、リポジトリに入れるべきファイル、特に debian サブディレクトリ中の全ファイルを手作業で追加しなければならないことに 注意してください。さらに、cvs add コマンドは再帰的には働かない、 つまりサブディレクトリについてもすべて手作業で追加しなければならない ことに注意してください。(cd debian; cvs add *)

    良いことに cvs update の実行でディレクトリ中の全ファイルの状態が示されます。

       $ cd /where/your/source/tree/will/reside/<パッケージ>
       $ cvs update
    

    出力はこのようになります:

           cvs update: Updating .
           M Makefile
           cvs update: Updating debian
           A rules
           ? example1
    

    M は修正されていること (格納しなければならない)、 A は追加されていること (格納しなければならない)、 ? は CVS がそのファイルについて情報を持たないこと (多分追加する必要があるのでしょう)、をそれぞれ示します。 足りないものはない、ファイルの権限はすべて想定通り、 だと判断できたら格納の手順に入ります。

       $ cd /where/your/source/tree/will/reside/<パッケージ>
       $ cvs commit -m 'Made all debian changes'
       $ cvs tag debian_version_<バージョン|tr . _>-<debian-revision|tr . _> .
    

    新しいソースツリーがあるディレクトリはバージョン番号を含みません。 これは後で参照する時には全く問題にはなりません。

    代わりに、スクラッチから debian ディレクトリを作成する場合 (簡単になるかもしれません。手作業が増えますが。):

       $ mkdir debian
    

    必要な debian ファイルをすべて作成し、ソース制御に追加してください。

       $ cvs add debian
       $ cd debian
       $ cvs add *
    

    次のチェックインでファイルはすべて含まれます。

       $ cd /where/your/source/tree/will/reside/<パッケージ>
       $ cvs commit -m <メッセージ>
    
  4. リリースの準備

    パッケージをビルドするのに Debian コマンドを実行する前に、 CVS サブディレクトリをすべて除いて、 モジュールをチェックアウトしなければなりません。これは `export' コマンドで実行できますが、 まずすべての変更を格納してリリース番号をつける必要があります。

       $ cvs commit -m <メッセージ>
       $ cvs tag debian_version_<バージョン|tr . _>-<debian-revision|tr . _>
    
  5. リリースの作成

    cvs-buildpackage 機構の使用 (推奨) または手作業でエクスポートを行います。まず、 cvs-buildpackage をドライランで(タグが合っていることを確認して) 次のように実行してテストします (/etc/cvsdeb.conf を設定していることが前提です):

       $ cvs-buildpackage -d -n -rsudo
    

    そして実際に実行します。root になれるのであれば、sudo なしで実行できます。

       $ cvs-buildpackage -rsudo
    

    手作業ですべて行う場合:

    パッケージのチェックアウト

       $ cvs export -d <パッケージ>-<バージョン> -r debian_version_<バージョン|tr . _>-<debian-revision|tr . _> <パッケージ>
    

    これで普通のリリースのエクスポート機構を続けることができます。


    終わりです! おめでとう! ソースツリー上でできる作業がいくらかあります:


  6. ファイルの削除、リネーム

    ファイルを移動する普通の方法は OLD を NEW にコピーし、 それから普通の CVS コマンドでリポジトリから OLD を削除、そして NEW を追加します (OLD 及び NEW はともに相対パス、例えば `foo/bar.c' を含めることができます)。

       $ mv OLD NEW
       $ cvs remove OLD
       $ cvs add NEW
       $ cvs commit -m "OLD から NEW にリネーム" OLD NEW
    

    これは最も簡単なファイルの移動方法で、間違えにくく、 それまでの履歴は保存されます。 ファイルの履歴にアクセスする場合、 履歴のどの部分にアクセスするのかにより、 新旧どちらかの名前を指定しなければならないことに注意してください。 例えば `cvs log OLD' ではリネームまでのログを取得します。

  7. インポートコマンドによるモジュールの更新

    新しいリリースのソースが入手できたら、まず第一に、 リポジトリを設定したときと同様に `import' コマンドによりリポジトリにインポートします。 リリースタグの名前とメッセージが異なるだけです。

       $ cd /where/your/source/tree/will/reside/<new source directory>
       $ cvs import -m 'Import new release' debian/<パッケージ> source-dist upstream_version_<バージョン|tr . _>
    

    ここで、新しい改訂に加えた変更を組み込まなければなりません。 最もよい方法は作業コピーを移動し (旧版の上流ソースに基づいて)、 パッケージの新しいコピーをチェックアウトして上流ソースでの変更を 組み込む方法です。方法を示します:

       $ cd /where/your/source/tree/will/reside
       $ mv <パッケージ> <パッケージ>.old
       $ cvs checkout -jsource-dist:yesterday -jsource-dist <パッケージ>
       $ cd /where/your/source/tree/will/reside/<パッケージ>
    

    上のコマンドは、<パッケージ> の最新版をチェックアウトし、 ベンダブランチ `source-dist' に対して前日以降に加えられた変更を作業コピーにマージします。 マージの際に衝突があった場合は普通の方法で対処します。 それから、変更したファイルを格納します。

    上で提案している日付の使用は、同じ日に同一製品の複数のリリースを インポートすることはないものと仮定しています。 そうでない場合、次のような方法が常に使えます:

       $ cvs checkout -jupstream_version_<oldversion|tr . _> -jupstream_version_<newversion|tr . _> <パッケージ>
    

    この場合、上記の二つのコマンドは等価です。

    ローカルで変更されていないファイルの新しく作成された改訂は head リビジョンになります。

    なので、ファイルがすべて正しく更新されているか確認してください。 特に、debian/changelog ファイルを変更するのを忘れないでください!

    問題なければ、作業ディレクトリの古いバージョンは削除してもかまいません。 削除するディレクトリを絶対に間違えないようにしてください!

       $ rm -rf ../<パッケージ>.old
    

    これで、リリースの準備が整いました。

  8. ソースツリーを削除してディスク容量を空ける

    作業用のソースツリーの削除にあたって、rm -rf ではなく CVS コマンドを使って手元で変更して格納していないものがないか、 確認することを勧めます。

       $ cd /where/your/source/tree/will/reside/
       $ cvs release -d <パッケージ>
    
  9. 用語
       タグ         特定のリビジョンに付ける象徴的な名前
       リポジトリ   ソースファイルのアーカイブ
    
  10. 付録:

    A: CVS タグの慣例

     |=========================================================================================|
     |上流バージョン      | <バージョン>                                                 |
     |Debian 改訂         | <改訂>                                                       |
     |Orig tar ファイル名 | package_<バージョン>.orig.tar.gz                             |
     |Debian パッケージ名 | package_<バージョン>-<改訂>_<アーキテクチャ>.deb |
     |CVS ベンダタグ      | upstream_version_<バージョン  | tr . _>                      |
     |CVS 現行タグ        | debian_version_<改訂 | tr . _>                               |
     |=========================================================================================|
    

    例:

     |======================================================================|
     |                    | 上流ソース             | Debian 独自パッケージ  |
     |======================================================================|
     |上流バージョン      | 2.76                   | 3.38                   |
     |Debian 改訂         | 1.2                    |                        |
     |Orig tar ファイル名 | make_2.76.orig.tar.gz  |                        |
     |Debian パッケージ名 | make_2.76-1.2_i386.deb | kpkg_3.38_i386.deb     |
     |CVS ベンダタグ      | upstream_version_2_76  | upstream_version_3_38  |
     |CVS 現行タグ        | debian_version_2_76-1_2| debian_version_3_38    |
     |======================================================================|
    

    CVS タグ名の決定にあたって、エポック数は無視されることに注意してください (これは一般に dpkg が判断するパッケージの順序を変更するのに使用され、通常 CVS タグとして適切ではありません)。