PostgreSQLコミュニティへのパッチの投げ方

# はじめに
PostgreSQLコミュニティへの関わり方やPostgreSQLコミュニティでの活動について何度か講演させていただく機会があり、何名かの方から具体的な手順を教えてほしいとの声もいただきました。PostgreSQLコミュニティでは開発にgithub等は使っておらず、コミュニティ内でのコミュニケーションは基本メーリングリストを利用していたり、Commit FestというPostgreSQLコミュニティ独自の営みを通して新しい機能を開発してるなど、など最初は少し難しく感じるかもしれませんので、基本的な手順を紹介したいと思います。
本記事では、以下の手順を紹介してPostgreSQLコミュニティへパッチを出す方法を解説します。

1. 事前準備
    1. メーリングリストへの登録
    2. ソースコードの用意
1. パッチの準備
    1. ソースコードを改変
    2. パッチファイルの作成
1. パッチの投稿
    1. コミュニティへ出すメールの作成
    2. コミュニティへメールを送信
1. (おまけ) Commit Festへの登録方法
2.  URL集

合わせてこちらもお読み下さい。

* [PostgreSQL開発の基本動作まとめ(Qiita)](http://qiita.com/sawada_masahiko/items/2fa99e422ec0eb35245c)
* [PostgreSQLコミュニティに飛び込もう(SlideShare)](https://www.slideshare.net/hadoopxnttdata/patch-review-postgresql-community-nttdata)
* [Submitting a Patch](https://wiki.postgresql.org/wiki/Submitting_a_Patch)

# 1.事前準備
## 1-1. メーリングリストへの登録
PostgreSQLコミュニティにおけるコミュニケーションは基本的にはメーリングリストです。トピック毎にメーリングリストが分かれており、開発に関する議論はすべてpgsql-hackersで行われます。
[こちらのフォーム](https://www.postgresql.org/community/lists/subscribe/)からpgsql-hackersに登録します。

![ML登録フォーム.PNG](https://qiita-image-store.s3.amazonaws.com/0/32869/7f01c2fa-57ec-31c9-5797-da9e1a314c55.png)

## 1-2. ソースコードの用意
PostgreSQLのソースコードはgitで管理されており、リポジトリは`git.postgresql.org/git/postgresql.git`ですので、ここからgit cloneします。git clone完了後はmasterブランチにいることを確認します。masterブランチはPostgreSQLの開発版コードを管理するブランチです。その他の`RELX_Y_STABLE`は各バージョンの安定版ブランチです。

```bash:ソースコードの入手
$ git clone git://git.postgresql.org/git/postgresql.git
$ cd postgresql
$ git branch
* master
```

# 2.パッチの準備
## 2-1. ソースコードを改変
ソースコードを変更します。ソースコードが最新状態でない場合は、`git pull origin master`を実行してから変更を開始します。

## 2-2. パッチファイルの作成
作成した機能は**masterブランチからの差分**をpatchファイルとして保存します。patchファイルの作り方は、git diff、git format-patchなど好きな方法で構いません。例えば以下は、git diffからパッチを作成する例です。

```bash:patchファイルの作成
$ git diff master --stat
 src/backend/commands/vacuumlazy.c |    4 ++--
 1 files changed, 2 insertions(+), 2 deletions(-)
$ git diff master > vacuum_new_feature.patch
```

## 2-3. パッチ提出前のチェック
提出するパッチは最低限以下の項目を満たしているようにしましょう。

* その時のHEADのコードにエラーなくパッチが当たる
* 書いたコードがコーディングスタイルに従っているURL
    * [What's the formatting style used in PostgreSQL source code? ](https://wiki.postgresql.org/wiki/Developer_FAQ#What.27s_the_formatting_style_used_in_PostgreSQL_source_code.3F)
* リグレッションテストがエラーなく終了する

# 3.パッチの投稿
## 3-1. コミュニティへ出すメールの作成
新しい機能を提案する際メールの本文には、以下の内容を入れるようにすると良いと思います。

* どんな機能であるか
    * 機能の使い方、必要であれば内部的な実装や作った機能のアーキテクチャなどを記載します。
* なぜその機能が必要なのか、ユースケースなど
    * ユーザにどのようなメリットが有るか、どういうときに役に立つ機能であるか等をしっかり記載します。
* 性能改善のための機能であれば、そのベンチマーク結果
    * このパッチをコミットするとこんなにPostgreSQLが早くなるぞ！をしっかり示します。

## 3-2. コミュニティへメールを送信
宛先は1-1で登録した開発用メーリングリスト(pgsql-hackers)を指定し、2-2で作成したパッチを添付してメールを送信します。コミュニティメンバからの反応を待ちましょう！

# 4. Commit Festへの登録方法
提案したパッチはCommit Festに登録することができます。Commit Festの説明は[こちら](https://www.slideshare.net/masahikosawada98/oss-postgresql/4)も参考にしてみてください。Commit Festにパッチを登録することで、パッチのステータスを管理することができ、かつ誰にもレビューされないまま埋もれる、といった状況を回避することができます。新機能だけでなく、バグ修正パッチも登録することができるので、PostgreSQLコミュニティに対して出したパッチは漏れ無くCommit Festに登録することをお勧めします。


また、`master`ブランチのHEADは常に変更されるため、しばらくすると提出したパッチがHEAD当たらなくなる可能性があります。Commit Festにパッチを登録するとCommit Fest用のCIが周り、自動的にパッチがHEADにあたるか、そしてリグレッションテストが成功するかをテストしてくれます。状況は[PostgreSQL Patch Tester](http://commitfest.cputube.org/)から確認できますので、定期的に確認しましょう。

## 4-1 PostgreSQLの公式ページでアカウントを作成する。
Commit Festにパッチを登録する際に、アカウントが必要なので[ここ](https://www.postgresql.org/account/signup/)から登録します。ユーザ名、メールアドレス入れるだけなのですぐ登録できます。

## 4-1 Commitfests Appにアクセス
現在開催しているCommit Festは[こちら](https://commitfest.postgresql.org/open)。

![commitfestPNG.PNG](https://qiita-image-store.s3.amazonaws.com/0/32869/0fd0bdf4-e921-501c-7f56-ef996240251b.png)


## 4-2 パッチを登録
1. ページ上部の「New Patch」ボタンをクリック
2. 「Description」、「Topic」、「Specify thread msgid」を埋める
    * 「Description」は、3-2でコミュニティに出したメールのタイトルとかでOKです。
    * 「Topic」は、用意されたカテゴリから選択します。今回は「Miscellaneous」にします。
    * 「Specify thread msgid」は、パッチが添付されているメールを選択します。「Find thread」ボタンをクリックし、メールのタイトルでメールを検索することができるので、見つけたら「Attach thread」ボタンをクリックします。
3. 「Create patch」ボタンをクリック
4. 「Authros」欄に4-1で作成したアカウント名を入れて、自分をパッチの作成者に登録します。

# 5.リンク集
* メーリングリストへの登録
    * https://www.postgresql.org/community/lists/subscribe/
* 公式リポジトリ
    * git://git.postgresql.org/git/postgresql.git
    * (Web版) https://git.postgresql.org/gitweb/
* Commit Fest
    * https://commitfest.postgresql.org/open
* PostgreSQL Patch Tester
    * http://commitfest.cputube.org/
* PostgreSQLコミュニティでの活動関連のスライド、
    * [PostgreSQL開発の基本動作まとめ(Qiita)](http://qiita.com/sawada_masahiko/items/2fa99e422ec0eb35245c)
    * [PostgreSQLコミュニティに飛び込もう(SlideShare)](https://www.slideshare.net/hadoopxnttdata/patch-review-postgresql-community-nttdata)

PostgreSQL 11の開発は始まったばかりです。この機会にぜひPostgreSQLコミュニティに飛び込んでみましょう！
なにか分からないことがありましたら@sawada_masahikoまでご連絡下さい。