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)"
XCodeについては、AppStoreから最新のXCodeをインストールし、以下のコマンドを実行してください。
sudo xcode-select --switch /Applications/Xcode.app sudo xcodebuild -license
先述のとおり、FirefoxはGitを使っていません。代わりに Mercurial というバージョン管理ツールを使っています。
Mercurial は Python を利用してインストールします。
一応、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のビルドが成功し、起動すると以下のウィンドウが自動で開かれます。
Step3. ソースコードの修正
Firefoxほどの歴史のある大きなプロジェクトとなるとファイル数やコードの行数は非常に多いです。
しかし、プロジェクトの構造はそこまで難しくありません。以下はプロジェクトルートへのリンクです。
fetch
や後述するconsole
のようにブラウザが持つJavaScriptのAPIを修正したり機能追加したりする場合は/dom
というフォルダの中のファイルを修正します。
以下のリンクを開いていただくとどういった機能があるかわかると思います。
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?reviewer
はr=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 に定義されています。
今回実装したBigIntでも次のように %d
と%i
で置換することができます。
console.log('今日の最高気温は%d度で、最低気温は%i度です。', 20n, 9n);
上記のコードの出力は次のとおりです。
今日の最高気温は20度で、最低気温は9度です。
Chromium系のブラウザやSafariでは、上記のようにBigIntを %d
や %i
で置換することができます。
しかし、Firefoxはずっと対応されていませんでした。
ただ、Bugzillaには1年前から登録されています。
これを実装しました。
感想
Mercurial はじめて使ったけど慣れれば問題ありませんでした。ただやはり、GitとGitHubになってくれているほうが慣れているのもあって精神的に楽だったのになーと感じました。
一通りやってみると大した支障はなかったので慣れの問題ですね。
C++を書いたことない人でもなんとなく読めると思うので、それを真似してコードの修正にチャレンジできるとは思いました。
いつかChromiumにもコントリビュートしたいと思います。