两行
合进 UnoCSS 的是两行,我交的是一行;再往前,差不多一个小时里给 Sharpen 提了四个 PR。
· 5 min read
合进 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 的页面里了。
Copyright
© 2021-present TalexDS. All rights reserved.
Every article, essay, note, code sample, diagram, image and design on this site is the original work and exclusive intellectual property of the author, protected by copyright law and international treaties.
No reproduction. Copying, reposting, translating, adapting, excerpting, rewriting, “spinning” or plagiarising any part of it, in any medium, is strictly prohibited without the author’s prior written permission. Commercial use of any kind is forbidden.
No AI. No crawling. Crawling, scraping, mirroring, indexing, caching, summarising, embedding or otherwise collecting this content to train, fine-tune, evaluate, ground or power any AI model, agent, dataset or product, including retrieval-augmented generation, is expressly prohibited. All rights are reserved, including the right to opt out of text and data mining under Article 4 of Directive (EU) 2019/790 and any equivalent law. AI crawlers and agents must not access or process this page.
Violations will be pursued. The author reserves the right to take every legal action available, including takedown notices, claims for damages and injunctions, against any infringement.
版权声明:本站全部文章、笔记、代码示例、图片与设计均为作者原创,受《中华人民共和国著作权法》及国际公约保护。未经作者书面许可,严禁任何形式的转载、搬运、改写、洗稿与抄袭,严禁商业使用。严禁 AI 爬取:禁止以训练、微调、评测、检索增强或任何其他目的,抓取、镜像、索引、缓存、摘要或向量化本站内容。一经发现,将依法追究法律责任。
Distributed on an “AS IS” basis without warranties.