发布于 2026-01-06 0 阅读
0

我对 Firefox 的首次贡献:发现 bug、修复 bug、编写修复程序、创建补丁、提交补丁、代码审查、提交补丁更改、接受并最终发布、结论

我对 Firefox 的首次贡献

发现漏洞

我修复的漏洞

编写修复方案

创建补丁

提交补丁

代码审查

提交补丁更改

接受与着陆

结论

原文发表于我的个人博客

过去几年,我开源了大部分项目,也参与了一些小型项目。不过,我一直想为一个大型的、流行的开源项目做贡献。上个月我终于实现了这个愿望:我向 Mozilla Firefox 的 JavaScript 引擎SpiderMonkey提交了一个补丁,并于 11 月 2 日被接受。

标题

我每天都使用Firefox浏览器。我非常欣赏并认同Mozilla所秉持的隐私保护和开放互联网的价值观和原则。同时,我也对参与此类项目的志愿者们致以崇高的敬意。因此,能够贡献一份力量,我感到非常荣幸!

这篇文章有两个目的:

  • 记录我的经历,希望能激励人们为 Mozilla (或其他大型开源项目)做出贡献。
  • 为那些第一次向 Mozilla 做贡献的人提供指导,因为 Mozilla 的贡献过程相当复杂,我不想让你们重蹈我的覆辙!

发现漏洞

我的补丁修复了这个 bug,它是我在Codetribute上发现的。你可以使用“适合新手入门的 bug”筛选器来查找适合初学者的 bug。Codetribute 只列出 bug,它们实际上都存储在 Mozilla 的 bug 追踪系统BugZilla上。当你找到一个感兴趣的 bug 时,先看看是否有人已经在着手处理它。如果没有,可以添加一条评论,表示你想参与处理。

你需要自行查找相关说明,才能获取源代码、构建项目、运行测试等等。例如,这里是SpiderMonkey 的入门指南。具体步骤会根据你参与的 Firefox 项目/模块而有所不同。

我修复的漏洞

我的贡献在于改进了 JavaScript 解析器报告的错误。幸运的是,我参与开发了 JavaScript 的一项全新特性——数字分隔符。这项特性允许你通过在数字之间添加下划线来提高长数字字面量的可读性。该特性已于 2019 年 10 月底在 Firefox 70 中发布,而我的补丁将在 Firefox 72 中生效。

// Hard to read
let i = 1000000;

// Numeric separators improve readability
let i = 1_000_000;

ES6 规范允许使用单个下划线作为两个数字之间的分隔符。此外,数字字面量不能以下划线结尾。因此,以下代码行是非法的:

let i = 100__0;

let j = 100_;

如果在 Firefox 70 下运行这段代码,两种情况下都会出现相同的错误:

ff70

合情合理,对吧?然而,SpiderMonkey 团队希望针对这些情况显示不同的错误信息。以下是 Firefox Nightly 版本的截图,其中包含了我的补丁:

ff72

这些错误信息具有上下文感知能力,更符合程序员的预期。

编写修复方案

幸好,Mozilla 的Jason Orendorff在 BugZilla 论坛上提供了详细的修复说明。因此,只需要几行 C++ 代码就能解决问题。真的非常简单。

您可以在这里查看补丁

如果您有任何疑问,请在 BugZilla 论坛帖子下留言,或通过 IRC 联系相关团队。Mozilla 社区非常热情友好、乐于助人、知识渊博且耐心十足。请不要犹豫,尽管提问。沟通至关重要。这是我在此过程中学到的最重要的一点。

创建补丁

完成更改、运行测试并准备提交后,即可提交到本地 Mercurial 存储库:

// view the changed files
hg status

// view your changes
hg diff

// stage all of your changes
hg add .

// commit the staged changes
hg commit -m "Bug 1589072 - Improve numeric separators error messages"

提交信息请使用上述格式。其中,数字是缺陷的 ID,后面的信息是缺陷的标题,两者均来自 BugZilla。

提交补丁

这是最难的部分,也是我犯错最多的地方。Mozilla 使用自己的基础设施,因此不像在 GitHub 上提交 Pull Request 那么简单。

首先,您需要提交补丁以供审核。Mozilla 使用Phabricator来完成此操作。要提交补丁,您需要使用名为 Phabricator 的命令行工具moz-phab。请按照此指南设置您的 Phabricator 帐户并进行moz-phab本地安装。

接下来,打开终端并cd进入 Firefox 代码仓库。在这里,您只需运行命令moz-phab,即可将您的更改推送到 Phabricator 并创建一个版本。该版本的链接将显示在您的终端中。

有关使用 Phabricator 的更多信息,请查看此工作流程演练

代码审查

现在,你需要等待团队成员审核你的补丁。他们可能会提出一些修改意见或建议。请根据要求进行必要的修改。再次提醒,如果你有任何疑问,请与团队沟通并获得解答!

提交补丁更改

这里你需要格外小心。你可能会以为只需要运行hg commit两次moz-phab命令就能将更改推送到 Phabricator。但如果你这样做,最终会在 Phabricator 上创建一个全新的版本。我之前就犯过这个错误。

你不应该创建新的提交。相反,应该将更改添加到你原来的提交中。你可以使用以下命令:

hg commit --amend

不要添加-m标志。只需运行上述命令,它会打开文本编辑器,提示你输入提交信息。添加提交信息即可;内容可以与之前相同。在接下来的几行中,添加以下内容:

Differential revision: <link-to-original-phabricator-revision>

// for example:
Differential revision: https://phabricator.services.mozilla.com/D51134

这表示moz-phab此次提交是对您原始补丁的修订。因此,它会将这些更改添加到同一修订版本中。您现在可以在 Phabricator 上查看您的修订版本。

接受与着陆

如果审核者对你的修改感到满意,他/她就会接受你的补丁。接下来,你需要等待有人将你的补丁“合并”(land-to-commit)。我不太确定,但我认为这指的是将你的补丁提交到中央代码库。如果你正在阅读这篇文章,那么你很可能没有提交权限,所以 Mozilla 的一位管理员会帮你完成这项工作。

完成之后,恭喜!你不仅完成了第一个补丁的编写和提交,而且还被接受了!你可以在 Firefox Nightly 版本中查看你的更改。

办公室跳舞gif

结论

我希望这篇文章达到了我的一个目标(或者两个目标都达到了):启发你或帮助你。我享受这个过程,也为我的补丁感到自豪,尽管它很小很简单。我希望今后能定期为 Firefox 做贡献。

我们每天都在使用开源软件,无论我们是否意识到这一点。如果您有时间和技能,请贡献一份力量!回馈社会的感觉非常棒。

今天就到这里,下次再见!

PS:我要感谢我的朋友Jaydeep Borkar,他对spaCy 的贡献启发了我做这件事!

文章来源:https://dev.to/rohit/my-first-contribution-to-firefox-l0p