すべてのコード レビューをリッスンする Webhook があり、差分内のコメントの位置を取得するために、この PR レビューのコメントをフェッチします。GitHub REST API を使用していますが、問題は GraphQL API と同じです。
したがって、ワークフローは次のとおりです。
- Webhook からレビュー ID を取得する
- そのレビューのコメント リストを取得する
- コメントごとに、差分ハンクと編集された行を見つける位置を取得します
これらはすべて、99% の確率で正常に機能します。時々私null
はその立場になり、これらのコメントを無視します。
しかし、今回は別の奇妙な問題が発生します。通常、位置は差分の行のインデックスを参照します。
たとえば、次のようになります。
@@ -1 +1,3 @@
-# sedy-test
\\ No newline at end of file
+# sedy-test
+
+This repository is used to test [sedy](https://github.com/marmelab/sedy).
位置が 3 の場合、編集された行は+# sedy-test
です。
問題は、一部のコメントでは、差分内に配置できない位置を取得することです。例として、この PRを参照してください。
次のリクエストでレビューのコメント位置を取得しようとすると:
{
repository(owner: "Kmaschta", name: "comfygure") {
pullRequest(number: 1) {
reviews(last: 1) {
edges {
node {
state
comments(first: 1) {
edges {
node {
bodyText
authorAssociation
position
originalPosition
diffHunk
}
}
}
}
}
}
}
}
}
応答は次のとおりです。
{
"data": {
"repository": {
"pullRequest": {
"reviews": {
"edges": [
{
"node": {
"state": "COMMENTED",
"comments": {
"edges": [
{
"node": {
"bodyText": "s/fot/for/",
"authorAssociation": "OWNER",
"position": 71,
"originalPosition": 71,
"diffHunk": "@@ -24,31 +34,39 @@ const ls = (ui, modules) => function* () {\n };\n \n const add = (ui, modules, options) => function* () {\n- const { red, bold } = ui.colors;\n+ const { red, bold, green } = ui.colors;\n \n if (!options.length) {\n ui.error(`${red('No environment specified.')}`);\n- help(ui, 1);\n }\n \n if (options.length > 1) {\n ui.error(`${red('Invalid environment format. The environment name should be one word.')}`);\n- help(ui, 1);\n+ }\n+\n+ if (options.length !== 1) {\n+ ui.print(`${bold('SYNOPSIS')}\n+ ${bold('comfy')} env add <environment>\n+\n+Type ${green('comfy env --help')} for details`);\n+\n+ return ui.exit(0);\n }\n \n const project = yield modules.project.retrieveFromConfig();\n const environment = yield modules.environment.add(project, options[0]);\n- const addCommand = `comfy add ${environment.name}`;\n+ const addCommand = `comfy setall ${environment.name}`;\n \n- ui.print(`${bold('Cool!')} Your new environment \"${bold(environment.name)}\" was successfully saved.`);\n- ui.print(`You can now add a configuration, try ${bold(addCommand)}`);\n+ ui.print(`${bold(green('Environment successfully created'))}`);\n+ ui.print(`You can now set a configuration fot this environment using ${bold(addCommand)}`);"
}
}
]
}
}
}
]
}
}
}
}
}
位置は 71 ですが、差分には 40 行以上含まれていません。
では、GitHub API の場合はバグでしょうか、それとも位置フィールドのポイントがわかりませんでしたか?
注:同じ質問を GitHub フォーラムに投稿しました。