我想写一个小脚本,能够使用 eslint 输出评论 GitHub PRs。
问题是 eslint 给出了每个错误的绝对行数。但是 GitHub API 要求相对于差异的行号。
从 GitHub API 文档中可以看到: https://developer.github.com/v3/pulls/comments/#create-a-comment
要在文件的特定行上发表评论,您需要首先确定差异中的位置。GitHub 提供了 application/vnd.github.v3.diff 媒体类型,您可以在先前的请求中使用它来查看拉取请求的差异。需要解释差异以从文件中的行转换为差异中的位置。该位置值是从要评论的文件中第一个 "@@" hunk header 开始向下的行数。
"@@" 行的下一行是位置 1,下一行是位置 2,依此类推。文件的差异位置会随着空白行和额外的 hunks 的行数增加而继续增加,直到到达新的文件为止。
因此,如果我想在上面的图像中添加一个新的行号为 5 的评论,则需要将 12 传递给 API。
我的问题是如何轻松映射 eslint 在其错误消息中提供的新行号与 GitHub API 所需的相对行号之间进行转换
我已经尝试过的方法
我正在使用 parse-diff 将 GitHub API 提供的差异转换为 JSON 对象
[{
"chunks": [{
"content": "@@ -,OLD_TOTAL_LINES +NEW_STARTING_LINE_NUMBER,NEW_TOTAL_LINES @@",
"changes": [
{
"type": STRING("normal"|"add"|"del"),
"normal": BOOLEAN,
"add": BOOLEAN,
"del": BOOLEAN,
"ln1": OLD_LINE_NUMBER,
"ln2": NEW_LINE_NUMBER,
"content": STRING,
"oldStart": NUMBER,
"oldLines": NUMBER,
"newStart": NUMBER,
"newLines": NUMBER
}
}]
}]
我正在思考以下算法:
- 为每个文件创建一个由新的行数组成的数组,从
NEW_STARTING_LINE_NUMBER
到NEW_STARTING_LINE_NUMBER+NEW_TOTAL_LINES
- 从每个数字中减去
newStart
并将其变成另一个数组relativeLineNumbers
- 遍历该数组,并针对每个删除行(
type==='del'
),增加相应的剩余relativeLineNumbers
- 对于另一个块(具有
@@
的行),减少相应的剩余relativeLineNumbers