--- title: パッチの作成 slug: Creating_a_patch tags: - Developing Mozilla translation_of: Mercurial/Using_Mercurial ---
ソースコードを入手し、変更を加え、ビルドし、テストを行ったあとには (さらに可能ならば、あなたのパッチのテストも含む)、それらの変更についてレビューを受け、チェックインしてもらいましょう。そのためには、 パッチファイル または 差分ファイル と呼ばれる変更点を列挙したファイルを作成する必要があります。これは cvs diff または hg diff コマンドで作成することができます。
この記事は CVS について書かれています。Mozilla 2 (つまり 1.9.0 以降のすべて) では、もう一つのソースコントロールシステムである Mercurial に切り替わりました。考え方が同じであっても、特定のコマンドやヒントは適用できません。すべての hg のコマンド一覧とヒントについては Mercurial FAQ#How can I diff and patch files? をご覧ください。
あなたの変更を寄贈したいときは、ソースコードの最新バージョン (CVS HEAD, "trunk" としても知られています。または一部のパッチについては、アクティブなブランチの先端) に対する diff かどうかに注意してください。
最上層の <tt>mozilla/</tt> ディレクトリから <tt>cvs diff</tt> を実行してパッチを生成すると、あなたのパッチを適用する必要のある人々に感謝されるでしょう。 (こうすると、彼らはパッチを見ずに、最上層のディレクトリから <tt>patch -p0 < your_patch </tt> を実行してパッチを適用することができます。) {{ 英語版章題("Creating a diff of a single file") }}
リポジトリ内の現在のファイルに対する一つの差分ファイルを作成するには、次のコマンドを使用します:
$ cvs diff -u8p FILENAME
$ hg diff -p -U 8 FILENAME
このコマンドで、前後 8 行分が追加された、'ユニファイド'フォーマット(<tt>-u</tt>) と呼ばれる差分ファイルを作成することができます。この差分ファイルは、デフォルトで標準出力に出力されます。この出力をリダイレクトするには次のようにします:
$ cvs diff -u8p FILENAME > OUT_FILE
$ hg diff -p -U 8 FILENAME > OUT_FILE
{{ 英語版章題("Creating a diff for multiple files") }}
FILENAME に通常のファイル名の代わりにディレクトリ名を与えると、そのディレクトリのサブディレクトリも同様に、再帰的に検索されます。例えば、
$ cvs diff -u8p mozilla/<残りのパス>/ > OUT_FILE
$ hg diff -p -U 8 mozilla/<残りのパス>/ > OUT_FILE
こうすると、リポジトリ内のバージョンに対して現在のディレクトリとそのサブディレクトリ内のすべてのファイルを比較します。そして、一つに結合され、前後 8 行分が含まれた差分ファイルを OUT_FILE と名付けられたファイルに書き出します。
ソースファイルを開かずにパッチを理解できるようにするには、その前後に十分な行を含めるべきです。 既定のガイドラインでは前後 8 行ですが、パッチを理解するのにさらに必要な場合は、8 よりも大きな数値に置き換えてください。また、前後の行を多く含めるほど、オリジナルのソースに対して作成された差分から大きな違いがあるファイルにパッチを適用することになりやすいので注意してください。
{{ 英語版章題("Including new files in a patch") }}
パッチに新しいファイルを含めるには、<tt>-N</tt> オプションを使用してください。
$ cvs diff -u8pN mozilla/<残りのパス>/ > OUT_FILE
ここでよく起こる問題は、cvs diff コマンドが cvs add されていない新しいファイルを含まず、cvs add がリポジトリへの書き込みアクセスを必要とすることです。
解決法としては、cvsdo ユーティリティ を使用することです。これは、ファイルがリポジトリへ追加されたと cvs に思わせるために <tt>CVS/Entries</tt> を編集します。
$ cvsdo add NEWFILE $ cvs diff -u8pN NEWFILE > OUT_FILE
新しいディレクトリのファイルを含むパッチを生成するのは少々やっかいです。はじめに、新しいディレクトリに含まれていないものすべての diff を生成します:
$ cvsdo add newfiles $ cvs diff -u8pN NEWFILES > OUT_FILE
次に、新しいディレクトリごとに cvsdo add
を実行し、そのディレクトリ内のファイルにも同じようにします。
$ cvsdo add mozilla/<残りのパス>/newdir/ $ cvsdo add mozilla/<残りのパス>/newdir/newfile
そして、新しいディレクトリごとに cvsdo diff
を実行して diff に変更点を追加します。
$ cvsdo diff mozilla/<残りのパス>/newdir/ >> OUT_FILE
{{ 英語版章題("Patches with lots of whitespace changes") }}
パッチの生成時に、<tt>diff</tt> が空白の変更を無視するように指定することができます。これは、if
ステートメント内のコードの字送りのように多くの字下げを変更した場合、特に役立ちます。空白の変更を含まないパッチを作成するには、<tt>-w</tt> フラグを使用してください。次のような場合:
$ cvs diff -u8pN mozilla/<残りのパス>/ > OUTFILE
これをオリジナルのパッチに使用し、次に他のパッチでは、
$ cvs diff -u8pNw mozilla/<残りのパス>/ > OUTFILE-w
このようにする場合は、両方のパッチが該当のバグに添付されているかどうか確認してください (<tt>-w</tt> なしのパッチは、レビュアによる空白の変更が正しく行われているかどうかの確認と、あなたの変更を適用するためにチェックインする人に必要です)。
{{ 英語版章題("Automated review tools") }}
パッチに含まれるエラーを捕捉するための、あなたやレビュアの仕事を少しだけ楽にするツールが利用できます。このツールが役立つでしょう: JST Review Simulacrum
{{ 英語版章題("The next step") }}