Mozillaのワークフローに則ってFirefoxにプルリクエストを送る手順

Firefoxで発見したバグを報告して修正するためにはかなり複雑な手続きが必要です。
本日（2017/03/08）リリースされたFirefox 52のデベロッパーツールに、細かい修正ポイントを見つけたので、勉強も兼ねてプルリクエストを送ろうと思ったところ、めちゃくちゃ大変でした。

自分が送ったバグ報告：https://bugzilla.mozilla.org/show_bug.cgi?id=1345436
自分が送ったプルリクエスト：https://reviewboard.mozilla.org/r/118186/

せっかくなので、やり方を一通りまとめます。

# 独自システムの全体感

Firefoxは、Mozillaが独自開発したシステムで管理されています。
GitHubは使っていません。GitHubだったらどんなに楽だったことか（切実）。

GitHubとMozillaのシステムを比較すると以下のようになります。
わかりづらいのが、それぞれのアカウントがバラバラだということです（緩くは繋がっていますが……）。

| GitHub           | Mozilla                                          | 
|:-----------------|:-------------------------------------------------|
| Git              | Mercurial (Hg)                                   |
| Code             | [Mercurial](https://hg.mozilla.org/)             |
| Issues           | [Bugzilla](https://bugzilla.mozilla.org/)        |
| Pull requests    | [Review Board](https://reviewboard.mozilla.org/) |

この他に、ソースコードを閲覧だけするための[DXR](https://dxr.mozilla.org/)というものと、CI環境（？）の[Review Board Hg](https://reviewboard-hg.mozilla.org/)というものも存在します。

# ドキュメントについて

とはいえ、MDNのドキュメントを読めば大体書いてあるんじゃないの？と思った方、甘い！
なんとMDNのドキュメントは整備されていません（！）。

一応ページはありますが、内容が古いです。
https://developer.mozilla.org/ja/docs/Mozilla/Developer_Guide/Source_Code

英語版でも最新のドキュメントはMDNにはなく、なんと外部のRead the Docsにまとめられていました。
http://mozilla-version-control-tools.readthedocs.io/en/latest/

基本的には、こちらの MozReview: Mozilla’s Code Review Tool > MozReview User Guide の内容に沿って、進めていけばOKです。

ただしこのドキュメント内のページなのにリンクがない以下のページの設定内容も必須です……。
http://mozilla-version-control-tools.readthedocs.io/en/latest/mozreview/install-mercurial.html


# バグを報告する

### Bugzillaのアカウント登録

まずは、[Bugzilla](https://bugzilla.mozilla.org/)にアカウント登録します。
右上の「New Account」をクリックして、メールアドレスを入力し、メール認証すれば完了です。
ここで登録したメールアドレスがこの後も使われ続けますので、GitHubなどに登録しているメールアドレスにした方が吉かもしれません。

✅ここで登録したメールアドレスは公開されます！

### バグを登録する

アカウント登録してログインすると、メニューの左から2番目に「New」という項目が現れます。
ここをクリックして新しいバグを登録します。

プラットフォーム選択画面が現れるので、どのMozillaプロダクトに関係するバグか選択します。

<img width="936" alt="プラットフォーム選択画面" src="https://qiita-image-store.s3.amazonaws.com/0/70109/eb8366c3-f19d-6cf3-5975-9d383b0fe5ac.png">

次に、バグの概要を一行で書きましょう。タイトルです。

<img width="700" alt="バグの概要" src="https://qiita-image-store.s3.amazonaws.com/0/70109/4a357b7f-d5b3-0551-a02d-d7602ee5a048.png">

既に登録されている、タイトルに関連したバグが検索されます。IDをクリックすると詳細が見れますので、重複した内容になっていないか確認します。
問題なければ「My issue is not listed」をクリックし、さらに詳細を記入します。

<img width="666" alt="バグの詳細を記入" src="https://qiita-image-store.s3.amazonaws.com/0/70109/02403d2f-ac85-7a2e-e81d-51654c84cd22.png">

- Summary：概要
- Product：関係するプロダクト
- Version：関係するバージョン
- What did you do? (steps to reproduce)：どうするとそのバグが起こるか
- What happened? (actual results)：どのようなバグか
- What should have happened? (expected results)：バグが修正された場合どのようになっているべきか
- Attach a file：関連の画像やファイル（任意）
- Security：重大なセキュリティーに関係するバグで、修正されるまでバグの存在自体が非公開になっているべきか
- Additional Details：そのバグはスマートフォンやタブレットで起こるものか

書き終わったら「Submit Bug」をクリックして、バグを登録します。

**ここまででバグの報告は完了です！**


# バグを修正してコミットする

### Review Boardのアカウントを登録する

Bugzillaのアカウントにログインしたまま、[Review Board](https://reviewboard.mozilla.org/)にアクセスして、右上の「Login」というボタンを押しましょう。

Bugzillaのアカウントに紐づく形でアカウントが発行されます。
IDは、メールアドレスの@以前に数字を付け足したようなものになるはずです。

また、BugzillaのAPI keyが必要になるので、そちらも取得します。
設定内にある[API key取得画面](https://bugzilla.mozilla.org/userprefs.cgi?tab=apikey)にて新しいAPI keyを発行します。
API keyの名前は「mercurial」などで大丈夫です。

### ソースコードをダウンロードする

バグを修正する場合は、まずはソースコードをダウンロードしましょう。
ソースコードはGitではなく、Mercurialというバージョン管理システムを使っていますので、適宜Homebrewなどでインストールします。

```bash
$ brew install hg
$ hg clone https://hg.mozilla.org/mozilla-central/
$ cd mozilla-central/
```

ただし「mozilla-central」リポジトリは3.38GBぐらいあるのでダウンロードに時間がかかります。

`hg`コマンドで操作ができます。基本的には`git`と同じような感じです。

`hg log`：恐ろしい量のログなので`hg log -l 3`などのオプションを付けて実行しましょう
`hg status`：`git status`と同じような感じ
`hg diff`：`git diff`と同じような感じ
`hg commit`：`git commit`と同じような感じ

### `hg`を設定する

Mercurial (Hg)をMozilla向けに設定します。
Python 2.7.xがインストールされていればShell Scriptでよしなにやってくれます。
Python 3.x系をpyenvで使っている場合は、作業ディレクトリ内で`pyenv local 2.7.13`とすれば大丈夫でした。

```bash
$ ./mach mercurial-setup
```

実行すると、ホームディレクトリに`.hgrc`が作成されます。これがHgの設定ファイルです。
`vim ~/.hgrc`として、以下の項目を追記しましょう。

```
[bugzilla]
username = me@example.com // Bugzillaのアカウント名（メールアドレス）
apikey = ojQBGzhDmFYRFSX4xWNCSyOEsJKqisU0l0EJqXh6 // BugzillaのAPI key
[mozilla]
ircnick = mynick // 設定しないとCIでエラーになるのでIRCを使っていなくても普段のアカウント名などで設定しましょう
```

最終的には以下のようになるかと思います。

![.hgrc](https://qiita-image-store.s3.amazonaws.com/0/70109/4389819b-4b1c-3bb1-509d-1f498f1979ca.png)

### コミットする

ソースコードの変更が完了したらコミットします。

ただし、気をつけなくてはいけないのは、ひとつのレビュー（Pull request）ごとにひとつのコミットにした方がいいということです。
さらに、各コミット時点で必ず完全な状態で動作することが保証されるべきといわれています。

この辺りに書いてあると思うのですが、間違ってたらごめんさない。
http://mozilla-version-control-tools.readthedocs.io/en/latest/mozreview/commits.html

もし大規模な修正の場合は、分割できるだけ分割したコミット／レビューにするようにということです。これを「Microcommits」と呼ぶそうです。

また、コミットメッセージも「Bug XXX - Message」という形で、頭に「Bug XXX - 」（XXXは登録したバグのID）を付けるというルールがあります。これを満たさないとプッシュ時に弾かれます。

その部分以外は基本的にはGitでのPull requestと同じ流れで、コミットして、プッシュして、リクエストするという形です。

```bash
$ hg status // 必要なファイルだけが変更されているか確認
$ hg diff // 必要な変更だけがされているか確認
$ hg commit // コミットメッセージの入力画面が表示されるまでにかなり時間がかかる
$ hg push review // 「review」というところにプッシュするとCIが働いて自動的にアカウントに紐づいた「Review Board」に登録されます

//レビューを公開していいかなどの質問事項が返ってきますがEnterを押していればOKです
```

[Review Board](https://reviewboard.mozilla.org/)にアクセスして、自分のレビューが登録されたか確認しましょう。
https://reviewboard.mozilla.org/

![レビュー登録完了！](https://qiita-image-store.s3.amazonaws.com/0/70109/770a38b0-34d4-a36d-5ad5-925cb4e71327.png)

**登録されていればPull request完了です！**