Go to the first, previous, next, last section, table of contents.


パッチの作成と使用の助言

パッチを作成したり使用したりするときは,常識を考慮してください.例えば, プログラム管理者にバグフィックスを送るとき,すべての主張をカバーする分か りにくい一つの大きなパッチの代わりに,一つの主張ごとに独立な小さなパッチ を複数送ってください.

ソフトウエアパッケージの更新でパッチを配布しようとする場合,それ以外に覚 えておくべきことは以下のとおりです.

パッチを生成するための助言

パッケージの古いバージョンを新しいバージョンに変更するパッチを作成するた め,最初に古いバージョンと新しいバージョンのコピーを隣接するサブディレク トリに作成してください.二つのバージョンを@command{tar}アーカイブに格納 するのが一般的です.

パッチを生成するために,oldnewをそれぞれ古いものと新しいも のがあるディレクトリにして,コマンド`diff -Naur old new'を使用してください.名前のoldnewにスラッシュを含 めるべきではありません.@option{-N}オプションで,ファイルを作成したり削 除したりします.@option{-a}で,テキストファイル以外も更新するパッチにな ります.@option{-u}で,タイムスタンプと周りの文が十分にり役に立つパッチ を生成します.そして,@option{-r}でパッチはサブディレクトリも更新します. 以下はコマンド例で,Bourneシェルの構文を使用しています.

diff -Naur gcc-3.0.3 gcc-3.0.4

受けとる人にパッチの適用方法を伝えてください.これには使用する作業用ディ レクトリと,使用する@command{patch}のオプションも含めるべきです.受け手 が行なうように手順をテストし,オリジナルファイルにパッチを適用してくださ い.

パッチを生成するときの一般的な誤解を避ける方法は,See section 一般的な誤解を避ける.

パッチを使用するための助言

パッチの作成者は,受け手にパッチの適用方法を伝えているはずなので,パッチ の使用者の第一の規則は,パッチで提供される説明に従うことです.

GNU @command{diff}では,任意の長い行を持つファイルと不完全な行で終 るファイルを解析することが可能です.しかし,@command{patch}の古いバージョ ンでは,そのようなファイルにパッチを当てることは不可能です.そのようなパッ チの適用時に問題がある場合,最近のバージョンのGNU @command{patch}に 更新してみてください.

一般的な誤解を避ける

複数のファイルのパッチを生成しているとき,@command{diff}はスラッシュの無 いディレクトリ名に適用します.こうすることで,パッチの利用者が @option{-pnumber}を指定しているとき混乱が少なくなり,それは,この オプションで古いものと新しいもののファイル名でスラッシュの数が異なる場合, びっくりするような結果になるためです.例えば,以下のようなヘッダを持つパッ チを送らないでください.

diff -Naur v2.0.29/prog/README prog/README
--- v2.0.29/prog/README	2002-03-10 23:30:39.942229878 -0800
+++ prog/README	2002-03-17 20:49:32.442260588 -0800

その理由は,二つのファイル名のスラッシュの数が異なっていて,異なるバージョ ンの@command{patch}では,ファイル名が異なっていると解釈するためです.混 乱を避けるため,その代わりに以下のような出力を送ってください.

diff -Naur v2.0.29/prog/README v2.0.30/prog/README
--- v2.0.29/prog/README	2002-03-10 23:30:39.942229878 -0800
+++ v2.0.30/prog/README	2002-03-17 20:49:32.442260588 -0800

周りの文を使用した差分のヘッダや`Index:'行で,正しくファイル名を指 定していることを確かめてください.既にパッチを当てたかどうか不思議に思う ので,リバースパッチを送らないように注意してください.

`README.orig'`README~'のようなバックアップファイル名と比較し ているパッチは,@command{patch}が本当のファイルの代わりにバックアップファ イルにパッチを当てようとして混乱するので,そのようなパッチを送ることを避 けてください.その代わりに,異なるディレクトリ,例えば`old/README'`new/README'のように,同じベースファイル名で比較したパッチを送っ てください.

以前に送られた他のパッチを実際に適用している人を保護するために,パッチファ イルの最初のパッチに,パッチレベルやバージョンナンバーが含まれている `patchlevel.h'`version.c'のような名前でファイルを更新させる ことが可能です.入力ファイルに間違ったバージョンナンバーが含まれている場 合,@command{patch}はすぐに文句をいいます.

この問題を避けるより明確な方法は,パッチの前に`Prereq:'行を書くこと です.パッチファイルに前置されるテキストに`Prereq:'で始まる行が含ま れている場合,@command{patch}はその行の次の単語(通常はバージョンナンバー) を受けとり,次の入力ファイルに空白や改行が前後にある単語が含まれているか どうか調査します.そうでない場合は,@command{patch}は処理する前に確認す るためのプロンプトを出します.これで間違った順序でパッチを偶然にも適用す ることが難しくなります.

より小さいパッチを生成する

パッチを生成する最も単純な方法は`diff -Naur'を使用することですが (see section パッチを生成するための助言),パッチを作成する前にファイルの名前を 変更したり削除したりすることで,パッチの大きさを小さくすることも可能かも しれません.古いバージョンのパッケージに新しいバージョンにはないファイル が含まれている場合や,二つのバージョン間で名前が変更されている場合,パッ チを適用する前に,古いバージョンのディレクトリでユーザが実行する @command{rm}と@command{mv}のリストを作成してください.そしてこれらのコマ ンドをスクラッチのディレクトリで実行してください.

他のファイルから容易に再構成可能だという理由から(例えば,`TAGS'と @command{yacc}と@command{makeinfo}からの出力),パッチを含める必要がない ファイルが存在する場合,@command{diff}に@option{-x pattern}オプショ ン(see section ディレクトリの比較)で得られるパッチを実行してください.パッ チ利用者がビルドするツールが無いため,パッチで派生ファイルを編集したくな い場合,パッチ利用者のタイムスタンプで@command{make}が混乱しないように, 派生ファイルのパッチがそれに依存するファイルにパッチを当てないことを確か めてください.

さて,`diff -Naur'を使用してパッチを作成することが可能です.スクラッ チディレクトリを最初に,新しいディレクトリを二番目に指定していることを確 かめてください.

パッチの最初に,パッチを適用する前にユーザに@command{rm}と@command{mv}コ マンドを実行するように伝えるメモを書いてください.やっと,スクラッチディ レクトリを削除できます.

周りの文の使用をより小さくすることでパッチの大きさを小さくすることも可能 ですが,パッチが入力行に正確にマッチしないとき,適切な処理を行なうため, @command{patch}は通常,最低二行必要だということを覚えておいてください.


Go to the first, previous, next, last section, table of contents.