今天想基于前两天有用户提交的 PR 做一下 iredis 的 TLS feature,然后突然发现 iredis 的 master 分支不能 build 了。fail 的 action
错误也非常莫名其妙,我什么时候就拿 None 和 String 比较了呢?
主要是前两天用户提交的 PR 完全 pass 了我才 merge 的呀,怎么 merge 到 master 之后就不行了呢?
隐约感觉是有什么依赖 broke 了,如果直接 diff 之前安装的依赖可能定位会快一些(这就是为啥我每次会在 CI 里面先打一行 pip list
的原因!)但是这次我想直接去找找是什么问题,闲着也是闲着。
那就直接先从出错误的 poetry 入手,我直接在它的代码里面加入了很多 print(Python 的优势,直接改安装的包就行)。然后不断缩小范围,发现 poetry-core 的代码中,有一个 copy.copy
,copy 之后的内容和之前的不一样:
于是开始研究这个 copy 的对象有啥特殊的,发现是 tomlkit 里面的一个对象。不是一个简单的 list。
然后跳到 tomlkit 里面去看这个对象,发现是一个自定义的 list,代码有一些长,花了一些时间读明白之后发现,它解析之后为了保持格式问题,会加一个 Null
的 dummy 对象占位。本来这个 dummy 不会在 value 里面的,但是一经过 copy 的时候,__init__
并没有过滤掉 Null,就导致这个 None
被加进去了。
提交了一个 PR 修复:https://github.com/sdispater/tomlkit/pull/221
这都不是重点,重点是,这个 bug 不是很好触发:
- 需要使用
copy.copy
,除了 copy 我想不到其他的场景会出现这个问题,而 poetry 正好用到了,并且 copy 的是 classifier; - 需要在 toml 的被 copy 的 list 里面有一些 Comment,而我的 iredis 里面,我之前为了给自己备忘去哪里找 classifier 列表正好写了一行 comment;
这些还不是重点,重点是我去看了一下这个仓库,发现代码的问题是在两天前引入的,而两天内正好让我给触发了。
这些依然不是重点,重点是,这段代码的作者,居然正是我的明哥(@frostming)!!!