Потяните Запрос Обзор Комментарий Неправильная позиция от diff? - PullRequest
0 голосов
/ 15 октября 2018

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

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

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

Все это прекрасно работает 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.

Проблема в том, что для некоторых комментариев я получаю позицию, которая не может быть внутри различий.В качестве примера см. этот 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 , почему пока нет ответа.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2018

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

Давайте посмотрим ваш PR.

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:

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

0 голосов
/ 21 октября 2018

С Комментарий Github API doc :

Значение позиции равно количеству строк по сравнению с первым заголовком "@@" в файле Вы хотите добавить комментарий.Строка чуть ниже строки @@ - это позиция 1, следующая строка - это позиция 2 и т. Д.Позиция в diff продолжает увеличиваться через строки пробела и дополнительных фрагментов до начала нового файла.

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

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

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, как указано выше

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...