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

#github #github-api #octokit #octokit-js

#github #github-api #octokit #octokit-js

Вопрос:

Мы используем клиент @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]);
});
 

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

Комментарии:

1. Возможно, вы можете получать обзоры в PR, используя это , а затем для каждого ожидающего рассмотрения получать комментарии, используя это . Еще не тестировал это.

2. Чтобы получить ожидающие рассмотрения, я думаю, вы можете проверить наличие state PR as CHANGES_REQUESTED . Опять не реализовано полностью.

3. @DivyaMamgai state то, что вы упомянули, относится к PR. Что нужно OP, так это состояние комментариев к обзору PR.

4. @MadhuBhat Да, это правильно. Это просто предположение, что если конкретный запрос на проверку все еще включен CHANGES_REQUESTED , то некоторые комментарии к этому конкретному обзору все еще не разрешены.

5. @DivyaMamgai но даже если все комментарии запроса на проверку разрешены, состояние PR по-прежнему остается as CHANGES_REQUESTED . Изменяется только то, что оно одобрено или отклонено. Но в любом случае, OP требует перечислять комментарии на основе статуса, а не если они присутствуют или нет.

Ответ №1:

На GitHub.com , не все комментарии в запросе на извлечение имеют resolved/unresolved статус, а только комментарии как часть проверки. И API v3 от GitHubs, который использует 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. Вы можете увидеть больше об этом в документации API GitHub v3

Комментарии:

1. Я тоже так думаю. Возможно, мне придется проделать изрядную программную работу, чтобы отфильтровать разрешенные комментарии.

Ответ №2:

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

 # 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..
]
 

Чтобы перечислить неразрешенные комментарии ко всем открытым ссылкам на репозиторий, вместо этого можно использовать этот скрипт:

 # Usage:
#   Retrieve all unresolved review comments for a repo
#     ./pr-unresolved-review-comments myorganisation myrepo

OWNER=$1
REPO=$2

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

 

Ответ №3:

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

Попробуйте /repos/{owner}/{repo}/pulls/{pull_number}/comments 👍

Комментарии:

1. Какое поле вы используете, чтобы определить, были ли комментарии разрешены / неразрешены с помощью этого метода?