Запрос на вытягивание Комментарий к обзору неправильная позиция из разницы?

У меня есть веб-перехватчик, который прослушивает все обзоры кода, а затем я получаю комментарии к этому обзору PR, чтобы узнать позицию комментария в diff. Я использую GitHub REST API, но проблема у меня такая же, как и с GraphQL API.

Итак, рабочий процесс:

  1. Получите идентификатор обзора из веб-перехватчика
  2. Получите список комментариев к этому обзору
  3. Для каждого комментария получите блок различий и позицию для поиска отредактированной строки.

Все это работает нормально в 99% случаев. Иногда получаю null в позиции, игнорирую эти комментарии.

Но на этот раз у меня возникла еще одна странная проблема. Обычно позиция относится к индексу строки в diff.

Например, в:

@@ -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.

Проблема в том, что для некоторых комментариев я получаю позицию, которая не может быть внутри diff. В качестве примера см. этот пиар.

Когда я пытаюсь получить позицию комментария в обзоре со следующим запросом:

{
  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.

Редкие достижения на Github ✨
Редкие достижения на Github ✨
Редкая коллекция доступна в профиле на GitHub ✨
3
0
339
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

От Документ с комментариями к Github API:

The position value equals the number of lines down from the first "@@" hunk header in the file you want to add a comment. The line just below the "@@" line is position 1, the next line is position 2, and so on. The position in the diff continues to increase through lines of whitespace and additional hunks until the beginning of a new file.

Здесь diffHunk дает вам текущий блок различий, который не является первым в файле.

Если вы получите полный файл сравнения, он станет более понятным:

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

Комментарий находится в env.js, первый кусок которого начинается в строке 77, ваш комментарий находится в строке 148, а diffHunk в вашем запросе начинается со строки 114.

Я не думаю, что на данный момент возможно запросить полную разницу PR с помощью GraphQL, но вы можете использовать Rest v3, как указано выше.

Привет спасибо за ответ! Как я могу узнать из diffHunk (или комментария), что кусок начинается со строки 77? Более того, в большинстве случаев первая строка в дифференциале равна 1. Я не понимаю.

Kmaschta 29.10.2018 18:01

Вы не можете сказать по diffHunk, вам нужен полный diff, чтобы знать, с какой строки начинается первый кусок файла

Bertrand Martel 29.10.2018 18:05

Это работает в большинстве случаев, потому что в большинстве случаев первый блок для файла является единственным или первым в файле. Это не удается, если у вас есть несколько различий в файле

Bertrand Martel 29.10.2018 18:07

У меня такая же проблема. И я наконец узнал, как определять позицию.

Посмотрим ваш пиар.

https://github.com/Kmaschta/comfygure/pull/1/files?utf8=%E2%9C%93&diff=unified#diff-10b371776dce3b12ed817f3fb8704a7d

В этом файле 2 блока различий.

Позиция начинается с первого ханка.

Строка под первым блоком - это позиция 1.

https://github.com/Kmaschta/comfygure/pull/1/files?utf8=%E2%9C%93&diff=unified#diff-10b371776dce3b12ed817f3fb8704a7dL1

И конец первого ханка - позиция 36.

https://github.com/Kmaschta/comfygure/pull/1/files?utf8=%E2%9C%93&diff=unified#diff-10b371776dce3b12ed817f3fb8704a7dL18

И каким-то образом github добавляет +1 для конца первого фрагмента до начала второго фрагмента. (36 + 1)

Итак, начальная строка второго ломтика - 38.

И у вас есть 34 строки выше вашего комментария во втором фрагменте.

Вот почему ваш комментарий 71.

https://github.com/Kmaschta/comfygure/pull/1/files?utf8=%E2%9C%93&diff=unified#diff-10b371776dce3b12ed817f3fb8704a7dR61

Метод расчета Github таков.

Я считаю, что этот расчет неверен. Но если вы хотите рассчитать, вы можете сделать это по этой методике.

Спасибо за ответ! Вы уверены, что это правильный расчет? Мне трудно это проверить.

Kmaschta 06.11.2018 19:15

Я не пробовал все случаи, но почти во всех случаях этот метод верен, и мне тоже трудно это выяснить. Если вы обнаружите исключительный случай, сообщите мне.

ZENN 07.11.2018 02:34

Другие вопросы по теме