3

すべてのコード レビューをリッスンする Webhook があり、差分内のコメントの位置を取得するために、この PR レビューのコメントをフェッチします。GitHub REST API を使用していますが、問題は GraphQL API と同じです。

したがって、ワークフローは次のとおりです。

  1. Webhook からレビュー ID を取得する
  2. そのレビューのコメント リストを取得する
  3. コメントごとに、差分ハンクと編集された行を見つける位置を取得します

これらはすべて、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 フォーラムに投稿しました。

4

2 に答える 2

3

Github API コメント docから:

位置の値は、コメントを追加するファイルの最初の "@@" ハンク ヘッダーから下の行数と同じです。「@@」行のすぐ下の行が位置 1、次の行が位置 2 などです。diff 内の位置は、空白の行と追加のハンクによって、新しいファイルの先頭まで増加し続けます。

ここでdiffHunkは、ファイルの最初に必要ではない現在の差分ハンクを示します

完全な差分ファイルを取得すると、より明確になります。

curl "https://api.github.com/repos/Kmaschta/comfygure/pulls/1" \
     -H "Accept: application/vnd.github.v3.diff"

コメントはenv.js最初のハンクが 77 行目から始まり、コメントは 148 行目にありdiffHunk、リクエストは 114 行目から始まります

現時点では GraphQL を使用して完全な PR 差分をリクエストすることはできないと思いますが、上記のように Rest v3 を使用できます

于 2018-10-21T01:10:37.817 に答える