使用 GitHub 的 GraphQL API,我如何知道谁关闭了问题或拉取请求?

jny*_*len 5 github-api graphql

给定问题或拉取请求编号,我希望使用对GitHub GraphQL API 的单个查询来获取以下信息:

  • 无论是问题还是拉取请求
  • 问题的状态(开放、关闭)或 PR(开放、关闭、合并)
  • 如果问题或 PR 已关闭,由谁关闭以及何时关闭
  • 如果问题或 PR 被合并,谁合并的以及何时合并的

使用以下查询,除了确定关闭了问题或 PR 之外,我可以完成所有这些工作:

{
  repository(owner: "Automattic", name: "wp-calypso") {
    issueOrPullRequest(number: 23226) {
      __typename
      ... on Closable {
        closed
        closedAt
        # TODO: How to get ClosedEvent { actor } ?
      }
      ... on Issue {
        issueState: state
        title
      }
      ... on PullRequest {
        prState: state
        title
        merged
        mergedAt
        mergeCommit {
          committer {
            user {
              login
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用 GitHub 的 GraphQL Explorer 工具运行此查询: https://developer.github.com/v4/explorer/

我可以将问题或 PR 视为 a Closable,但我认为我需要从那里找到ClosedEvent影响该对象的最后一个。这是我还没有弄清楚的部分。

在 GitHub 的 v3 REST API 中,确定所有这些信息可能需要 2 个请求。对于已关闭(未合并)的拉取请求,该closed_by字段仅在请求拉取请求作为问题(通过issuesAPI 调用)时出现。所有其他拉取请求信息都可以通过pullsAPI 调用获得。

rag*_*710 3

获取关闭问题的演员的一种迂回(且丑陋)的方法如下(受此答案启发)。我希望可能有更好的方法,但目前这是一种方法。

诀窍是查询给定时间线中的大量事件(如果您绝对确定某个问题/PR 关闭后没有任何评论,您可以说timeline(last: 1)),找到其中的ClosedEventMergedEvent并提取actor

{
  repository(owner: "Automattic", name: "wp-calypso") {
    issueOrPullRequest(number: 23226) {
      __typename
      ... on Closable {
        closed
        closedAt
      }
      ... on Issue {
        timeline(last: 100) {
          edges {
            node {
              __typename
              ... on ClosedEvent {
                actor{
                  login
                }
              }
            }
          }
        }
      }
      ... on PullRequest {
        timeline(last: 100) {
          edges {
            node {
              __typename
              ... on MergedEvent {
                actor{
                  login
                }
              }
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)