別にしんどくないブログ

技術のことや読書メモを書いています

Firefoxにコミットしたので手順のメモ

Firefoxロゴ

Firefoxへのコミットをやってみました。
ドキュメントは整備されていてわかりやすいですが、日本語の良い記事がなかったので手順をメモしておきたいと思います。

コミットまでの手順

具体的な手順については以下のリンク先に書かれています。

firefox-source-docs.mozilla.org

コードの修正をする前の準備としてツールのインストールやソースコードのダウンロードをしなければいけません。

準備についてもドキュメントが用意されています。

firefox-source-docs.mozilla.org

Step1. 必要なソフトウェアのインストール

macOSの場合は次のツールをインストールしなければいけません。

Homebrewのインストールについてはトップページに記載されている次のコマンドを実行してください。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

brew.sh

XCodeについては、AppStoreから最新のXCodeをインストールし、以下のコマンドを実行してください。

sudo xcode-select --switch /Applications/Xcode.app
sudo xcodebuild -license

先述のとおり、FirefoxはGitを使っていません。代わりに Mercurial というバージョン管理ツールを使っています。

www.mercurial-scm.org

MercurialPython を利用してインストールします。
一応、Mercurial の代わりに Git を使うこともできます。

echo 'export PATH="'"$(python3 -m site --user-base)"'/bin:$PATH"' >> ~/.zshenv
python3 -m pip install --user mercurial==6.1.4

インストールが完了したら次のコマンドを実行して Mercurial がインストールされていることを確認してください。

hg version

Step2. ソースコードの取得とビルド

Mercurial のインストールが完了すると、Firefoxソースコードの取得が可能になります。

以下のコマンドを実行してください。

curl https://hg.mozilla.org/mozilla-central/raw-file/default/python/mozboot/bin/bootstrap.py -O
python3 bootstrap.py

ソースコードの取得が完了したら、以下のコマンドを実行してFirefoxをローカルでビルドして実行してみましょう。

cd mozilla-unified
hg up -C central
./mach build
./mach run

Firefoxのビルドが成功し、起動すると以下のウィンドウが自動で開かれます。

ローカルのFirefoxの起動

Step3. ソースコードの修正

Firefoxほどの歴史のある大きなプロジェクトとなるとファイル数やコードの行数は非常に多いです。
しかし、プロジェクトの構造はそこまで難しくありません。以下はプロジェクトルートへのリンクです。

hg.mozilla.org

fetchや後述するconsoleのようにブラウザが持つJavaScriptAPIを修正したり機能追加したりする場合は/domというフォルダの中のファイルを修正します。 以下のリンクを開いていただくとどういった機能があるかわかると思います。

hg.mozilla.org

Step4. テストの追加と実行

修正したコードのテストコードも忘れずに修正しましょう。ただ、テストコードはどこにあるかわかりづらいので、パッチを送ったあとにBugzillaで聞いてみるとメンテナーの方が教えてくれると思います。
私もコードレビュー時にテストコードを書くファイルを間違えていると指摘いただいたので、素直に聞くとよさそうです。

テストの追加や修正がなくても、既存の機能に影響がないかテストを実行しましょう。
テストはディレクトリ単位で実行することができます。

$ ./mach test dom/serviceworkers

すべてのテストを実行するのはローカルマシンでは時間がかかるのでリモートのCIサーバを使います。
以下のコマンドを実行すると修正したコードに影響のありそうな箇所のテストを自動で検出してCIサーバ上で実行します。

$ ./mach try auto

Step5. Lintを実行する

修正が終わったらLintを実行してコードの書き方に問題ないか検証しましょう。
./mach lintコマンドを使います。たとえば、dom/consoleディレクトリを検証したい場合は以下のコマンドを実行します。

$ ./mach lint dom/console

eslint --fix のように自動修正するオプションも備えています。

$ ./mach lint dom/console --fix

Step6. コミットする

コミットの方法は以下のリンク先でも説明されています。

firefox-source-docs.mozilla.org

# Mercurial
$ hg commit

# Git
$ git commit

コミットメッセージには気をつけましょう。次のフォーマットに従わなければいけません。

Bug xxxx - Short description of your change. r?reviewer

Optionally, a longer description of the change.

xxxxはBugzillaで管理されているチケットの番号です。
Short description of your change.のところは簡単なコミットメッセージを入力します。
r?reviewerr=nchevobbe,smaug,devtools-reviewersのようにレビュアーを指定します。レビュアーの指定は過去のコミット履歴などを参考に設定してください。
Optionally, a longer description of the change. には何か補足したい説明があれば記載してください。

参考までに私のコミットメッセージは以下のリンク先から見れます。

phabricator.services.mozilla.com

Step7. コミットしたパッチの提出

いわゆるGitでいうPushをします。
パッチを提出するには moz-phab というツールを利用します。
以下のコマンドを実行してインストールしてください。

$ ./mach install-moz-phab

あとは以下のコマンドを実行します。

$ moz-phab

パッチを送信するとPhabricator上にGitHubで言うところのPull Requestのようなものが作成されます。
以下は例です。

phabricator.services.mozilla.com

ここでレビュアーとやりとりをします。

Step8. パッチの修正

レビュアーからの指摘の修正など一度提出したパッチを修正する場合は--amendでコミットを上書きします。

# Or, if you need to pass arguments, e.g., changing the commit message:
$ hg commit --amend

# Git
$ git commit --amend

このとき、--amend -mを使ってコミットメッセージを修正してはいけません。

パッチの再提出は前述で説明したとおりです。

あとはレビュアーから承認をもらってマージされるまで繰り返します。

何をコミットしたのか

BigIntのFormat Specifierの実装をしました。

phabricator.services.mozilla.com

Format Specifierというのは console.log で任意のデータを文字列中に差し込みたいときに %d%s を文字列中に書いておくことで、それらが指定したデータと置換される機能です。

たとえば、次のようなコードであれば、

console.log('今日の最高気温は%d度です。', 20);

これの結果は、次のようになり %d が指定した数値 20 に置き換わっていることがわかります。

今日の最高気温は20度です。

Format Specifierの仕様については whatwg/console に定義されています。

console.spec.whatwg.org

今回実装したBigIntでも次のように %d%i で置換することができます。

console.log('今日の最高気温は%d度で、最低気温は%i度です。', 20n, 9n);

上記のコードの出力は次のとおりです。

今日の最高気温は20度で、最低気温は9度です。

Chromium系のブラウザやSafariでは、上記のようにBigIntを %d%i で置換することができます。

しかし、Firefoxはずっと対応されていませんでした。

ただ、Bugzillaには1年前から登録されています。

bugzilla.mozilla.org

これを実装しました。

感想

Mercurial はじめて使ったけど慣れれば問題ありませんでした。ただやはり、GitとGitHubになってくれているほうが慣れているのもあって精神的に楽だったのになーと感じました。
一通りやってみると大した支障はなかったので慣れの問題ですね。
C++を書いたことない人でもなんとなく読めると思うので、それを真似してコードの修正にチャレンジできるとは思いました。
いつかChromiumにもコントリビュートしたいと思います。