Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

List all unresolved pull request comments

We are using the @octokit/rest client to fetch all of the comments on a pull request:

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

How if at all can we list only the unresolved comments? There does not appear to be a property in the data that indicates whether someone has resolved the comment or not.

like image 475
Shaun Luttin Avatar asked Jul 23 '26 07:07

Shaun Luttin


2 Answers

Using GitHub's v4 GraphQL API, the GraphQL API Explorer (to explore/build my query), the GitHub CLI (to simplify calling the GraphQL API), and jq (to filter the results); I came up with the following solution (written as a bash script to ease calling, but the same principles would apply if calling the GraphQL API from code as well):

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

gh api graphql -f owner="$1" -f repo="$2" -F pr="$3" -f query='
  query FetchReviewComments($owner: String!, $repo: String!, $pr: Int!) {
    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))'

The specific fields that you include as part of the GraphQL query are customisable, but this seemed to give me what I needed.

The output of running the above script will look something like the following:

[
  {
    "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..
]

To list unresolved comments against all open PRs for a repo, this script can be used instead:

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

gh api graphql -f owner="$1" -f repo="$2" -f query='
  query FetchReviewComments($owner: String!, $repo: String!) {
    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))'

like image 115
Glenn 'devalias' Grant Avatar answered Jul 24 '26 20:07

Glenn 'devalias' Grant


On GitHub.com, not all comments under a pull request have the resolved/unresolved status, but only the comments as part of a review. And GitHubs's v3 API, which octokit uses, doesn't provide any such status as part of the response of GET on comments of a review, and a sample response of the same is :

    [
      {
        "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"
          }
        }
      }
    ]

So essentially, I don't think your requirement can currently be served by GitHub's v3 API or Octokit. You can see more about it on GitHub v3 API's documentation

like image 39
Madhu Bhat Avatar answered Jul 24 '26 20:07

Madhu Bhat



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!