Join MDN and developers like you at Mozilla's View Source conference, 12-14 September in Berlin, Germany. Learn more at https://viewsourceconf.org

パッチの作成

 

ソースコードを入手し、変更を加え、ビルドし、テストを行ったあとには (さらに可能ならば、あなたのパッチのテストも含む)、それらの変更についてレビューを受け、チェックインしてもらいましょう。そのためには、 パッチファイル または 差分ファイル と呼ばれる変更点を列挙したファイルを作成する必要があります。これは 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> を実行してパッチを適用することができます。)

単一ファイルの差分を作成する

リポジトリ内の現在のファイルに対する一つの差分ファイルを作成するには、次のコマンドを使用します:

$ 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

複数ファイルの差分を作成する

FILENAME に通常のファイル名の代わりにディレクトリ名を与えると、そのディレクトリのサブディレクトリも同様に、再帰的に検索されます。例えば、

$ cvs diff -u8p mozilla/<残りのパス>/ > OUT_FILE
$ hg diff -p -U 8 mozilla/<残りのパス>/ > OUT_FILE

こうすると、リポジトリ内のバージョンに対して現在のディレクトリとそのサブディレクトリ内のすべてのファイルを比較します。そして、一つに結合され、前後 8 行分が含まれた差分ファイルを OUT_FILE と名付けられたファイルに書き出します。

ソースファイルを開かずにパッチを理解できるようにするには、その前後に十分な行を含めるべきです。 既定のガイドラインでは前後 8 行ですが、パッチを理解するのにさらに必要な場合は、8 よりも大きな数値に置き換えてください。また、前後の行を多く含めるほど、オリジナルのソースに対して作成された差分から大きな違いがあるファイルにパッチを適用することになりやすいので注意してください。

パッチに新しいファイルを含める

パッチに新しいファイルを含めるには、<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

多くの空白を変更したパッチ

パッチの生成時に、<tt>diff</tt> が空白の変更を無視するように指定することができます。これは、if ステートメント内のコードの字送りのように多くの字下げを変更した場合、特に役立ちます。空白の変更を含まないパッチを作成するには、<tt>-w</tt> フラグを使用してください。次のような場合:

$ cvs diff -u8pN mozilla/<残りのパス>/ > OUTFILE

これをオリジナルのパッチに使用し、次に他のパッチでは、

$ cvs diff -u8pNw mozilla/<残りのパス>/ > OUTFILE-w

このようにする場合は、両方のパッチが該当のバグに添付されているかどうか確認してください (<tt>-w</tt> なしのパッチは、レビュアによる空白の変更が正しく行われているかどうかの確認と、あなたの変更を適用するためにチェックインする人に必要です)。

自動レビューツール

パッチに含まれるエラーを捕捉するための、あなたやレビュアの仕事を少しだけ楽にするツールが利用できます。このツールが役立つでしょう: JST Review Simulacrum

次のステップ

Getting your patch in the tree

ドキュメントのタグと貢献者

タグ: 
 このページの貢献者: tregagnon, Marsf, Mgjbot, Yukichi
 最終更新者: tregagnon,