Перечислите все неразрешенные комментарии запроса на извлечение

Мы используем клиент @ octokit / rest для получения всех комментариев к запросу на извлечение:

client.pulls.listComments({
    owner,
    repo,
    pull_number: 34,
    per_page: 100
}).then(result => {
    console.log(result.data.length);
    console.log(result.data[0]);
});

Как, если вообще мы можем перечислить только неразрешенные комментарии? Похоже, в данных отсутствует свойство, которое указывает, разрешил ли кто-то комментарий или нет.

3 ответа

Используя GitHub v4 GraphQL API, GraphQL API Explorer (для изучения/создания моего запроса), GitHub CLI (для упрощения вызова GraphQL API) и jq (для фильтрации результатов); Я придумал следующее решение (написанное как скрипт bash для облегчения вызова, но те же принципы будут применяться и при вызове API GraphQL из кода):

      # Usage:
#   Retrieve unresolved review comments
#     ./pr-unresolved-review-comments myorganisation myrepo 1337
#
#   Count of unresolved review comment threads
#     ./pr-unresolved-review-comments myorganisation myrepo 1337 | jq length

OWNER=$1
REPO=$2
PR=$3

gh api graphql -f query="
  query FetchReviewComments {
    repository(owner: \"$OWNER\", name: \"$REPO\") {
      pullRequest(number: $PR) {
        url
        reviewDecision
        reviewThreads(first: 100) {
          edges {
            node {
              isResolved
              isOutdated
              isCollapsed
              comments(first: 100) {
                totalCount
                nodes {
                  author {
                    login
                  }
                  body
                  url
                }
              }
            }
          }
        }
      }
    }
  }
" | jq '.data.repository.pullRequest.reviewThreads.edges | map(select(.node.isResolved == false))'

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

Результат выполнения приведенного выше скрипта будет выглядеть примерно так:

      [
  {
    "node": {
      "isResolved": false,
      "isOutdated": true,
      "isCollapsed": false,
      "comments": {
        "totalCount": 7,
        "nodes": [
          {
            "author": {
              "login": "0xdevalias"
            },
            "body": "This is an unresolved comment that is important!",
            "url": "https://github.com/myorganisation/myrepo/pull/1337#discussion_r559294516"
          },
          ..snip..
        ]
      }
    }
  },
  ..snip..
]

На GitHub.com не все комментарии под запросом на включение имеют resolved/unresolved статус, но только комментарии как часть обзора. И API GitHubs v3, который использует octokit, не предоставляет такого статуса как часть ответа GET на комментарии к обзору, и пример ответа того же:

[
  {
    "url": "https://api.github.com/repos/octocat/Hello-World/pulls/comments/1",
    "id": 10,
    "node_id": "MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDEw",
    "pull_request_review_id": 42,
    "diff_hunk": "@@ -16,33 +16,40 @@ public class Connection : IConnection...",
    "path": "file1.txt",
    "position": 1,
    "original_position": 4,
    "commit_id": "6dcb09b5b57875f334f61aebed695e2e4193db5e",
    "original_commit_id": "9c48853fa3dc5c1c3d6f1f1cd1f2743e72652840",
    "in_reply_to_id": 8,
    "user": {
      "login": "octocat",
      "id": 1,
      "node_id": "MDQ6VXNlcjE=",
      "avatar_url": "https://github.com/images/error/octocat_happy.gif",
      "gravatar_id": "",
      "url": "https://api.github.com/users/octocat",
      "html_url": "https://github.com/octocat",
      "followers_url": "https://api.github.com/users/octocat/followers",
      "following_url": "https://api.github.com/users/octocat/following{/other_user}",
      "gists_url": "https://api.github.com/users/octocat/gists{/gist_id}",
      "starred_url": "https://api.github.com/users/octocat/starred{/owner}{/repo}",
      "subscriptions_url": "https://api.github.com/users/octocat/subscriptions",
      "organizations_url": "https://api.github.com/users/octocat/orgs",
      "repos_url": "https://api.github.com/users/octocat/repos",
      "events_url": "https://api.github.com/users/octocat/events{/privacy}",
      "received_events_url": "https://api.github.com/users/octocat/received_events",
      "type": "User",
      "site_admin": false
    },
    "body": "Great stuff",
    "created_at": "2011-04-14T16:00:49Z",
    "updated_at": "2011-04-14T16:00:49Z",
    "html_url": "https://github.com/octocat/Hello-World/pull/1#discussion-diff-1",
    "pull_request_url": "https://api.github.com/repos/octocat/Hello-World/pulls/1",
    "_links": {
      "self": {
        "href": "https://api.github.com/repos/octocat/Hello-World/pulls/comments/1"
      },
      "html": {
        "href": "https://github.com/octocat/Hello-World/pull/1#discussion-diff-1"
      },
      "pull_request": {
        "href": "https://api.github.com/repos/octocat/Hello-World/pulls/1"
      }
    }
  }
]

По сути, я не думаю, что ваше требование в настоящее время может быть выполнено с помощью API GitHub v3 или Octokit. Вы можете увидеть больше об этом в документации GitHub v3 API

Я могу получить разрешенные/неразрешенные комментарии с помощью list-review-comments-on-a-pull-request.

Пытаться /repos/{owner}/{repo}/pulls/{pull_number}/comments

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