2013年6月4日火曜日

パッチを投稿しよう!

オープンソースをダウンロードしてきて、動かしたり、改造したりしているうちに、
バグ修正や、新機能などをコミュニティへフィードバックしたくなってくるかもしれません。

自分は、最近 U-Boot によくパッチを投稿しています。

以下は、U-Boot にパッチを送り始めた時に自分がやった時の一連の流れをまとめておきます。
U-Boot は基本的に、Linux Kernel と同じ開発スタイルを踏襲しているので、それなりに参考になるかと。

ML に参加する


たいていは、パッチはメーリングリストに投稿するようになっていると思います。
なので、まずはメーリングリストを購読します。
やり方は、開発のコミュニティのページに書いてあります。

git send-email を使えるようにする


これについては、前回、git send-email でまとめておきました。

投稿用のパッチを作る


パッチの作り方は、コミュニティのページに説明があると思います。
ログの入れ方とか、いろいろと取り決めがあるので、じっくり読みます。

Linux Kernel を始め、いくつかのコミュニティでは sign-off という制度があります。
sign-off とは、このパッチはオープンソースとして提供しても大丈夫なものですよ、ということを私が証明します、という意味だと、自分なりに理解しています。

自分が一から書いたパッチであれば当然問題はないです。
パッチの中に、別の GPL のコードを含んでいても問題はないです。
一方、GPL とは相容れないライセンスのコードを含んでいたら、NGです。

コミット時に

$ git commit -s

のようにすれば、ログに Signed-off-by: ~ という行が追加されます。

パッチ生成時に

$ git format-patch -s

のようにしてもいいですが、忘れないように commit 時にやっておくのがいいように思います。

パッチ送る


前回 はとりあえず練習で自分宛に送りましたが、いよいよ今度は本物のメーリングリストに送ります。
初めてパッチを送信する時は、結構ドキドキするものです。

毎回送信先のアドレスを聞いてこないように

$ git config sendemail.to mailing-list

の設定をします。プロジェクトごとに送信先が違うはずなので、--global オプションは付けません。そうすると、この設定はリポジトリごとの .git/config に書き込まれます。

git send-email で送ります。

初回の投稿の場合、 Message-ID to be used as In-Reply-To for the first email?
については、そのまま [Return] でよいです。

自分のパッチが受け付けられたことを確認する


送信するのが初めての場合、すぐにメーリングリストに配信されずに

Your message to <...> awaits moderator approval

みたいな返信が来ることがあります。

一瞬、なんじゃこりゃ?みたいに思うかもしれませんが、心配いりません。

たぶん、スパム対策のために、初めて投稿してくる人に対しては、まともな内容かどうか審査があるんだと思います。
問題なければ、数時間後にはメーリングリストに配信されてくると思います。

2回目からは、すぐにメーリングリストに配信されると思います。

パッチのステータス管理に Patchwork http://patchwork.ozlabs.org/ というシステムを使っているプロジェクトもあります。
自分のパッチもステータス New として登録されていることを確認します。

レビューに対し、返答する


自分のパッチに対し、フィードバックしてくれる人があるかもしれません。
これに対しては、 git send-email ではなくて、普段使っているメーラーで、ごく普通に返信します。

修正版のパッチを再投稿する


投稿したパッチがそのまま Accepted になれば万々歳です。
Rejected になれば、基本的にはそこで終わりです。
Changes Requested になった場合は、指摘された部分を修正することで、Accepted になる可能性が高いです。

この場合、元のスレッドに対して修正版のパッチを返信するのではありません。
(Changes Requested になれば、そのスレッドは基本的に終わりです。)

新しいパッチファイルを作り直し、投稿します。

修正をしたら、

$ git commit --amend

でコミットを作り直します。

そして、今度はVersion 2のパッチであることがわかるようにタイトルに入れます。
以下のようにすれば git がやってくれます。

$ git format-patch --subject-prefix="PATCH v2" HEAD^

さらに、前回のパッチからどこが変わったのかをパッチの中に書き込みます。

$ nano 0001-blabla-blablabla


Signed-off-by: ~ の直後に

---

という行があって、この直後にコメントを入れることができます。
これは git のコミットログには反映されません。
例えば、以下のような感じです。

Signed-off-by: Masahiro Yamada <abc@xyz.com>
---

Changes for v2:
   - Fix hogehoge

git send-email で送りますが、今度は
Message-ID to be used as In-Reply-To for the first email?
のところに、前回のバージョンのパッチの Message-ID(前回のメールのヘッダを見れば書いてある)を入力します。
これによって、スレッドで関連付けられます。

0 件のコメント:

コメントを投稿