svn-buildpackage - Debian パッケージを Subversionで管理する Eduard Bloch 岩井 英隆 $LastChangedDate: 2003-12-07 22:22:34 +0100 (Sun, 07 Dec 2003) $ svn-buildpackage, all associated scripts and programs, this manual, and all build scripts are Copyright © 2003 Eduard Bloch.

詳細は を見てください。 導入 目的

この簡潔な文書は、パッケージを Subversion 管理に変更するときの簡単なヘルプ を目指しています。主に Subversion や CVS 管理に詳しくない開発者で、 従来のツール (dpkg-dev, devscripts) を使ってパッケージを管理していたのを、 バージョンコントロールシステムである Subversion に変更したい人達を 対象にしています。 特徴

svn-buildpackage や他のスクリプトは、下に挙げたことを実行するために作られました。

Debian パッケージをリビジョンコントール下に置く。つまり、 異なるバージョンのファイルを Subversion リポジトリに格納する svn コマンドを使って簡単に時間を戻れるようにする 過去のバージョンを取り戻せるようにする 上流のソースのバージョンに改変された Debian のバージョンを追随させる 新しい上流のバージョンを簡単にインストールし、(uupdate プログラムのように) 必要ならば Debian 用の変更をマージする 真っさらな環境で自動的にパッケージをビルドし、コミットされてない変更を 通知する 最終ビルド時に要求に応じてバージョンタグを作成し、 必要ならば changelog を更新する 複数の Debian 開発者が同じプロジェクトで共同作業するのを可能にする リポジトリのレイアウトを自動設定し、Subversion の使い方を 良く知らない人々にも使いやすくする (たいてい svn の add, rm と mv しか必要ではない) Debian 特有の変更のみをリポジトリに格納し、ビルド領域で 上流のソースにマージできるようにする (これは dpatch や dbs のような ビルドシステムを上手く補完する) 望むなら、上流の tarball をリポジトリの中に置くこともできる 概要

現在 svn-buildpackage で提供されるスクリプトは 3 つあります: svn-inject: 既存の Debian パッケージを Subversion リポジトリに 挿入し、必要ならリポジトリのレイアウトも設定する svn-buildpackage: Subversion リポジトリから、ビルドを開始するのに 関係のあるディレクトリの中身を真っさらな環境にエクスポートし、そこで パッケージをビルドする svn-upgrade: uupdateに似ていて、trunk を新しい上流のバージョン にアップグレードし、Debian 特有の変更を保存しマージする 一般的なリポジトリのレイアウト

パッケージを (好みによっては複数の) リポジトリに格納する方法はいくつかあります。 svn-buildpackage は通常 に書かれているのと同様のディレクトリ構造を想定しています。それは次のような ものです: packageA/ trunk/ branches/ branches/upstream tags/ projectB/ trunk/ branches/ branches/developerFoo tags/ 上の packageA は典型的な、上流のあるソースパッケージで、 projectB は developerFoo が彼の実験のために作った枝のある Debian ネイ ティブパッケージです。Subversionの枝を使うにあたっての詳細は を見てください。

また、タグが CVS とは全く異なる働きをすることにも注意してください。Subversion はファイルに関連付けられたマジックタグを維持しません。代りに、ファイルの 状態と移動を追跡します。従って、何かにタグを付けることは、あるバージョンの ファイルの集合のコピーを (ハードディスクの容量が十分ならリポジトリ内に) 作ることを 意味します。従って、パッケージのソースの Debian の枝は trunk/ に格納され、 幹のツリーを tags/DEBIAN-REVISION にコピー (ミラー) することでタグ付けされます。 同じことが、upstream release の際にも起こります。加えて、一番新しい上流バージョンは branches/upstream/current にミラーされます。何回かパッケージをアップグレードすると、 ディレクトリツリーはこんな感じになるでしょう: # svn ls -R file:///home/user/svn-repo/dev/translucency branches/ branches/upstream/ branches/upstream/0.5.9/ branches/upstream/0.5.9/AUTHORS branches/upstream/0.5.9/COPYING ... branches/upstream/0.6.0/ branches/upstream/0.6.0/AUTHORS branches/upstream/0.6.0/COPYING ... branches/upstream/current/ branches/upstream/current/AUTHORS branches/upstream/current/COPYING ... same stuff as in 0.6.0 ... tags/ tags/0.5.9-1/ ... tags/0.5.9-1/debian/ tags/0.5.9-1/debian/README.Debian ... tags/0.6.0-1/ tags/0.6.0-1/AUTHORS ... tags/0.6.0-1/debian/ tags/0.6.0-1/debian/README.Debian tags/0.6.0-1/debian/changelog ... trunk/ trunk/AUTHORS trunk/COPYING ... trunk where 0.6.0-2 is beeing prepared ...

svn-buildpackage は で提案されているような 2 つ目のリポジトリのレイアウトもサポートしています。 しかし、svn-inject は上に述べられたようなレイアウトを好みます。 svn-buildpackage と svn-upgrade は両方とも、ツリーのレイアウトと パッケージのファイルを自動検出できるようにすべきでしょう。

一般には、この例に従う必要はなく、幹、枝、タグのディレクトリを好きな場所に 置くことができます。しかし svn-buildpackage や他のスクリプトはファイルを 自動的に配置してはくれないので、作業しているディレクトリの .svn/deb-layout を編集してパスを設定する必要があります。 自動検出がどのように働くかの詳細は古いと、 を見てください。 はじめよう

svn-buildpackage をインストールしたときに依存関係でインストールされる パッケージの他に、ssh とお決まりのツールチェインである dpkg-devbuild-essential、そしてこれらのパッケージ が一緒にシステムに引っ張ってくる全てのパッケージをインストールする必要があるでしょう。 基本的な svn の使いかた

svn-buildpackage スクリプトで svn を使い始めるために、ほんのわずかのコマンド しか必要としません。もしより多くのことを学びたいなら、 を読んでください。最も使われるコマンドは: add -- 新しいファイルをリビジョンコントロールに入れる rm -- リポジトリからファイルを取り除く mv -- ファイルを移動して、リビジョンコントロールシステムにそのことを知らせる commit -- 変更をリポジトリにコミットする resolved -- svn に衝突を解決したことを知らせる diff -- ファイルのリビジョンナンバーや日付で指定された 2 つのバージョンの "diff -u" を作成する。出力については、diff --helpを参照のこと cat -r Revision -- いくつか前のリビジョンを見るのに便利 もし CVS に精通しているなら、なにが必要かは大体分かるでしょう。 Subversion リポジトリを作成する

メインの Subversion リポジトリは、 svnadmin create repo-directory で簡単に作れます。私達の例では、名前を svn-deb-repo として /home/user 以下に置きました。

もしたった 1 つのリポジトリで、多くのパッケージを管理するつもりで、 なおかつそのリポジトリが上流の tarball も格納しているなら、 容量に沢山の空きがあるパフォーマンスの良い (特にディスクアクセス時間の短い) ハードディスクに リポジトリを置くことを考えてください。なぜなら時間が経てばリポジトリは肥大化し、 ファイルシステムは断片化されるだろうからです。 複数の開発者で使う

リポジトリにローカルにアクセスできる開発者は、共通のグループを使うことで リポジトリを共有することができます。そうするためには、新しいグループを 作成して、全ての開発者を加えてください。 "chgrp -R sharedGroup repdir ; chmod -R g+s repdir" を 共有するグループとリポジトリのディレクトリに対して実行してください。これで、 このリポジトリへローカルにアクセスすることで、設定された適切なグループで 開発者がファイルを作成できるでしょう。しかし、開発者は svn を使う前に ("0022" のように) 自由な umask を設定する必要があります。もし 誰かがそうすることを拒んだとしても、まだ野蛮な解法があります: post-commit スクリプトでパーミッションを直すのです。

そうするためには、リポジトリのディレクトリに hooks/post-commit を作成して、下のようなシェルスクリプトのコードを追加してください。 そのディレクトリには、他にも参考になるようなスクリプトの例があります。 #!/bin/sh # POST-COMMIT HOOK # The following corrects the permissions of the repository files REPOS="$1" REV="$2" chgrp -R sharedGroup $REPOS chown -R g+r $REPOS chown -R g+w $REPOS sharedGroup をあなたのグループで置換して、終わったらスクリプトを 実行可能にしてください。 SVN over SSH

Subversion を ssh 越しに走らせるためには、基本的にターゲットとするシステムに シェルアクセスと、上に述べられたように作られた subversion のリポジトリが 必要となります。リポジトリはリモートのシステムのユーザからアクセスできる ように設定されている必要があります。

クライアントシステムでのあなたのユーザ名が、サーバ側のそれと同じだと過程すると 、それほど設定することはありません。ただこのマニュアルに示されている全ての例で、 プロトコルの指定を file:// から svn+ssh://server-hostname に 変えるだけです。

もしローカルのユーザ名がリモート側のそれと異なる場合は、ssh を 正しいユーザ名で使うように設定する必要があります。そうするためには、 ~/.subversion/config を編集して [tunnels] セクション を加えて、その後に通信の定義を加えてください。例:

# ssh トンネルコマンドによる個人用の subversion の設定 [tunnels] # svn.d.o 上の SSH アカウント。 # 圧縮は ssh の設定で有効化されている deb = fsh -l blade # NQ イントラネット開発の SSH アカウント nq = ssh -C -l zomb 上に示したような方法で、新しく定義したトンネルを使用できますが、 svn+sshsvn+tunnelname と読み換えてください。最終的な URL は svn+deb://svn.debian.org/svn/myproject/ourpackage/trunk のようになります。 匿名アクセス

Subversion の文書に書いてあるように、svnserver プログラムを使うことで 外部に匿名 (読み取り専用の) アクセスを提供することができます。

別の方法は Apache2 で HTTP/WebDAV を使う方法です。そのような設定の詳細は で見つけることができます。 はそこで ホスティングされているプロジェクトのうち、選ばれたプロジェクトへの 匿名アクセスを提供しているサイトの例です。 Debian パッケージをインポートする

既存のソースパッケージからインポートする

svn-inject ユーティリティは既にパッケージ化されたソースパッケージを リポジトリの新しいサブディレクトリにインポートし、必要なリポジトリのレイアウトを 作成するためのものです。通常、2 つの引数を取ります。パッケージの .dsc ファイルと Subversion リポジトリの base URL です。 svn-inject translucency_*dsc file:///tmp/z cp /tmp/translucency_0.6.0.orig.tar.gz /tmp/tarballs || true mkdir -p translucency/branches/upstream tar -z -x -f /tmp/translucency_0.6.0.orig.tar.gz mv * current svn -q import -m"Installing original source version" translucency file:///tmp/z/translucency svn -m Tagging upstream source version copy file:///tmp/z/translucency/branches/ upstream/current file:///tmp/z/translucency/branches/upstream/0.6.0 -q svn -m Forking to Trunk copy file:///tmp/z/translucency/branches/upstream/current file:///tmp/z/translucency/trunk -q dpkg-source -x /tmp/translucency_0.6.0-1.dsc dpkg-source: extracting translucency in translucency-0.6.0 svn_load_dirs file:///tmp/z/translucency/trunk . * ... Running /usr/bin/svn propset svn:executable initscript Running /usr/bin/svn propset svn:executable debian/rules Running /usr/bin/svn propset svn:executable mounttest.sh Running /usr/bin/svn propset svn:executable mount.translucency Running /usr/bin/svn propget svn:eol-style base.h Running /usr/bin/svn propget svn:eol-style Makefile Running /usr/bin/svn propget svn:eol-style translucency.8 Running /usr/bin/svn commit -m Load translucency-0.6.0 into translucency/trunk. Running /usr/bin/svn update Cleaning up /tmp/svn_load_dirs_jD7OenzVjI Storing trunk copy in /tmp/translucency. svn co file:///tmp/z/translucency/trunk /tmp/translucency -q svn propset svn:executable 1 debian/rules -q svn -m"Fixing debian/rules permissions" commit debian -q Done! Removing tempdir. Your working directory is /tmp/translucency - have fun!

URL を省略した場合は、svn-inject は現在のディレクトリの URL を base URL として使おうとします。しかし私はこれに頼らないでしょう。 ビルド時の動的マージ

svn-buildpackage の特徴は、mergeWithUpstream-mode と呼ばれます。多くのプロジェクトでは、上流のソース全体をリビジョンコントロールの管理下に置きたいわけではないでしょう。例えば、必要となるディスク容量や処理時間が膨大になってしまうからです。ときに、debian/ ディレクトリとほかの少数のファイルだけをリビジョンコントロール管理下に置けば十分なこともあります。

ビルドする前にリポジトリからソースをエクスポートして上流のソースに加えるという のは時間もかかるし、煩わしい仕事です。しかし、svn-buildpackage ツールはこの仕事を自動化します: 特別なフラグが検出されると、これらのツールはいわゆる mergeWithUpstream-mode に切り替わります。svn-buildpackage はビルド時に幹と 上流のソースをマージし、svn-upgrade はこの場合変更されたファイルを アップデートするだけです。

ソースパッケージを初めてインポートする際に、この機能を有効にするためには、 ただ svn-inject-o スイッチ付きで呼べば、ソースを mergeWithUpstream-mode で用意してくれます。ファイルを Debian 用に改変し mergeWithUpstream を適切に設定します。

しかし、もしパッケージを挿入したあとに、mergeWithUpstream-mode に変更 することに決めた場合はどうでしょう。これを成し遂げるためには、リポジトリ 全体をチェックアウトし、Debian パッケージで変更されないファイルを、上流のソースと、 Debian の枝の両方から削除し (svn rm)、trunk ディレクトリの mergeWithUpstream プロパティを svn propset mergeWithUpstream 1 で設定します。 共通のタスク

チェックアウト

svn-inject はあなたに代わって初回のチェックアウトを行います。 もし別のワーキングコピーが必要なら、 svn co protocol://repository-base-url/yourpackage を実行してください。 パッケージのビルド

幹のディレクトリに移動して svn-buildpackage -us -uc -rfakeroot を実行してください。 上のオプションがわかるでしょうか -- それらは直接ビルドコマンド (デフォルトでは dpkg-buildpackage) に渡されます。通常、ビルドは別のディレクトリで行われます (cp -laのような方法でソースをエクスポートします)。もしできあがった パッケージを上のディレクトリに置きたいなら、--svn-move オプションを 使ってください。ビルド後に Lintian を実行したい場合は、--svn-lintian オプションを使用してください。オプションの詳細は、マニュアルページ () に書かれています。 ソースの扱い

何かを加えたり変更したりすると必ず、dpkg-buildpackage は (--svn-ignore スイッチを使わない限り) 疑わしいファイルがきれいな状態になるまで先へ進ませてくれません。 に述べられているコマンドを使用して、 新しいファイルを登録して (または古いファイルを移動したり削除したりして) 変更をリポジトリにコミットしてください。 新しい上流バージョンの扱い

通常、新しい上流バージョンへのアップグレードは 2 つのステップからなります: 上流の枝の current 枝が新しい上流パッケージのソースに アップグレードされます (古いバージョンはリポジトリ内の branches/upstream/oldVersion に残されます)。 trunk/ ディレクトリと upstream バージョンの違いをマージすることで、 trunk/ のバージョンがアップグレードされます。 svn-upgrade スクリプト (以前は svn-uupdate) はあなたの代わりに この両方を実行し、新しい changelog のエントリを作成します。最初のステップは サードパーティースクリプト (svn_load_dirs、ドキュメントは Subversion book をみてください) によって内部で実行され、2 つ目のステップは svn のマージコマンドで達成されます。 (trunk/ のチェックアウトで生成された) ローカルの作業ディレクトリで svn-upgrade を実行してください。

svn-upgrade を実行したあとは、いくつかのファイルが衝突した状態に なっているかもしれません。これはあなたが上流パッケージのあるファイルに変更 を加えた場合に、今度は上流が同じ場所に似たようなことをして、svn merge が混乱したときに普通に起こります。

svn-upgrade がファイルが衝突したことについて不平を言う場合は、 手動で修正してください。終ったら、svn resolved コマンドを使って それらがクリーンであると印をつけ、svn commit でリポジトリを アップデートしてください。 リビジョンを閉じる

パッケージの新しいバージョンをアップロードする準備ができて、すべてが うまくビルドされ、changelog が整理されパッケージがテストされたら、 最後のビルドを行い、最終的なバージョンのタグ付けをしましょう。 そうするためには、--svn-tag スイッチを付ければ、 パッケージがビルドされたあとに (上で延べたように trunk/ ディレクトリのコピーを作ることで) タグ付けされます。 コマンドリファレンス

svn-inject

名前

svn-inject - Debian のソースパッケージを Subversion リポジトリに入れる 書式

svn-inject [ options ] <package>.dsc オプション

-h このメッセージを出力する

-v 詳細モードにする

-l レイアウトタイプ。1 (デフォルト) は package/{trunk,tags,branches,...} 式を意味して、2 は {trunk,tags,branches,...}/package 式を意味する。 2 はまだ実装されていない。

-t ローカルマシン上で .orig.tar.gz が格納されている場所を指定する

-c number 作業が終ったあと、何もチェックアウトしない (0)、幹のディレクトリをチェックアウト (1)、 すべてをチェックアウト (2) する

-o .diff ファイルで実際に触れられているファイルだけをリビジョンコントロール 下に置く。この場合、svn-inject は debian/merge-with-upstream ファイルを 作成する

svn-inject は Debian-SVN リポジトリ (trunk/tags/branch を格納している) のコアディレクトリから実行されることを想定しているのに注意してください。 -i を付けて実行することで、デフォルトのツリーを作らせることが できます。 svn-buildpackage

名前

svn-buildpackage - SVN リポジトリから Debian パッケージをビルドする 書式

svn-buildpackage [ OPTIONS ... ] [ OPTIONS for dpkg-buildpackage ] 説明

SVN リポジトリから Debian パッケージをビルドする。ソースコードリポジトリは svn-inject で作成されたフォーマットである必要がある。そしてこのスクリプトは 作業ディレクトリ (trunk/package) から実行される必要がある。

-h , --help ヘルプメッセージを出力する

--svn-dont-clean debian/rules cleanを実行しない (デフォルト: 一番最初に clean が実行される)

--svn-dont-purge ビルドが終了したときにビルドディレクトリを削除しない (デフォルト: ビルドが成功すると一掃される)

--svn-no-links ファイルのリンクを使わない (デフォルト: 可能な限りリンクが使用される)

--svn-ignore-new svn が衝突したり新しい/変更されたファイルがある場合に停止しない

--svn-verbose より詳細に出力する

--svn-tag 最終ビルド: タグ付けをし、エクスポートし、真っさらな状態から ビルドして新しい changelog エントリを作成する。

--svn-lintian ビルド終了後にビルド領域で lintian を実行する

--svn-pkg PACKAGE TOPDIR から実行される場合に、パッケージ名を指定する

もし debian/ が Debian ソースの唯一のディレクトリか、または debian/merge-with-upstream ファイルが見つかった場合は、 svn-buildpackage は \&.orig.tar.gz を最初に展開してから Debian ファイルを足す。 設定ファイル

svn-buildpackage の動作は ~/.svn-buildpackage.conf を 使って変えることができる。文書ディレクトリに文書化された例がある。 svn-upgrade

名前

svn-upgrade - 新しい上流リビジョンにソースパッケージをアップグレードする 書式

svn-upgrade newtarball [ OPTIONS ... ] 説明

svn-upgrade は Subversion リポジトリの Debian パッケージのソースを 改変し、新しい上流リリースにアップグレードします。リポジトリの ファイルシステムツリーは svn-inject て作成されたフォーマットで ある必要があります。

-V , --version STRING 異なる上流バージョン文字列を強制する

-P , --packagename STRING 異なるパッケージ名を強制する

-v , --verbose 出力をより詳細にする

Tarball は gzip か bzip2 で圧縮されている必要があります。 より詳しい文書 色々なリンク

Subversion Homepage: The Subversion Book: or Subversion vs. CVS and others: 著作権表示

このプログラムはフリーソフトウェアです。あなたは、Free Software Foundation が公表した GNU 一般公有使用許諾の第二版あるいはそれ以降のい ずれかの版の条件に基づいて、本プログラムの再配付および変更を行うことが可能 です。

本プログラムはその有用性が期待されて配付されるものですが、 市場性や特 定の目的への適合性に関する暗黙の保証も含め、 いかなる保証も行ないませ ん。 詳細については GNU 一般公有使用許諾書をお読みください。

GNU 一般公有使用許諾の写しは、Debian GNU/Linux ディストリビューションの や、WWW 上では にあります。また Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA へ手紙 (英語) で依頼し入手することもできます。