合进 UnoCSS 的那个 PR 是两行,我交上去的是一行。

翻回 PR 的页面去看,我写的是 if ( !loader ) continue;,括号里有空格,后面有分号,continue 挂在同一行。合进去的是 if (!loader),下一行单独一个 continue。空格没了,分号没了,continue 另起一行,所以一行变成了两行,逻辑一个字没动。

括号里的空格和同一行的 continue,大概是我的老习惯。TalexFrame 的 PluginScanner 里有一行 if( !adapter.shouldAccess(...) ) continue;,和这一行是同一个模子。

八天

UnoCSS 现在有一万八千多个 star,我在别人的公开仓库里被合并过的 PR,一万星以上的只有它这一个。

这个 PR 是 2023 年 6 月 30 号下午 4 点开的。当时我在 electron-vite 的模板里加 UnoCSS,一启动就报错。PR 里我写的是「I don't know what the problem exactly is」,不知道具体是什么问题,但把 undefined 的 loader 跳过去就能跑,对别的功能也没影响。我觉得这是整个 PR 里最老实的一句。

改的地方叫 combineLoaders,一个把几个加载函数排成队、谁先给出结果就用谁的函数,我只是在循环里加了一个判断。那一行应该是在 GitHub 网页上直接改的,提交者一栏写的是 GitHub,所以大概没经过编辑器,更没有 lint。

PR 开出来的六天前,6 月 24 号,我 fork 了 mica-electron,一个给 Electron 应用加 Windows 11 云母效果的工具。PR 里没提它,只是日期挨着。

7 月 2 号中午,一位维护者问我能不能给一个最小的复现仓库。这条我没有回复,整个 PR 里我一条回复都没有。7 月 8 号晚上 11 点 04 分 50 秒,另一位维护者在那一行上留了一条 suggestion,4 秒后自己把它提交了,又过 11 秒合并了。

整个 PR 的对话只有三条,一条是机器人的部署预览,剩下两条是维护者的,没有一条在讨论那个 undefined 是怎么来的。两行的守卫,错也错不到哪去,合进去也许是这个原因。

一小时

我最早被合并的外部 PR 是 2022 年 1 月 28 号在 Sharpen 里,一个 C++ 写的网络库。中午 12 点 27 分,维护者开了一个 issue,标题是 A bug in FindInsertGourp,要加的代码直接贴在里面。25 分钟后,我的第一个 PR 把它抄了进去,加了 6 行,其中两行是空行。标题照着 issue 的来,前面加了个 Fix,连 issue 标题里 Group 拼成 Gourp 的笔误也带过来了。71 秒后合并。

这个 PR 下面只有一条评论,是我的账号发的,内容是 QQ 邮箱的假期自动回复:你好,我最近正在休假中。那是合并后 31 秒。大概是 GitHub 的通知邮件被自动回复了一遍,回信又被当成了评论。

后面三个才算我自己的。第二个把标题改对了,正文写 Fix naming error,删掉上一个留下的两个空行,再给 const 版本的同名函数补上同样的判断;第三个给两个版本都加了一个条件;第四个标题是 Make sure change is correct,只是把测试里两行 Put 的顺序换了一下,23 秒就合了。差不多一个小时里开了四个 PR,一共加了 13 行,删了 5 行,后三个下面一条评论也没有。

我大概是把 PR 当提交在用,发现不对就再开一个。同样是别人的仓库,Sharpen 的第一个 PR 等了 71 秒,UnoCSS 这个等了八天。

2021

2021 年 10 月 6 号,我给 TouchQ 写了贡献指南,补充说明有两条。第一条:交上来的文件格式要正确,能通过 yarn lint。第二条:commit message 要符合 前缀<区域>: 具体更新,不符合的,哪怕 PR 很重要,也会 squash 而不是 merge,这会影响提交数。

轮到我给别人交 PR,这两条倒是都落在了我自己头上。代码被人重排了一遍,大概就是没过 lint。标题 fix(icons): ... 和我那条语法是同一个结构,只是尖括号换成了圆括号,合进去时只在后面多了个 PR 号。至于 squash,前后二十分钟里合进 main 的另外几个 PR,也都是一个提交,标题后面跟着 PR 号,应该是这个仓库平常的做法,不是只对我。main 上留下的是一个提交,作者是我,改动是两行。我写的那一行,只剩在 PR 的页面里了。