4

如何从 github API V3 获取给定拉取请求的项目和链接问题?pulls端点不提供关于它们中的任何一个的信息。在 github 的 pull requests 部分的侧边栏中有ProjectsLinked issues提到。但我找不到通过 API 调用获取此信息的方法。

侧边栏截图供参考

我想找出合并成功时拉取请求关闭的问题。

4

3 回答 3

5

要获取带有链接到特定拉取请求的卡片的项目,您可以使用Github GraphQL API使用此有效负载:

{
  repository(owner: "twbs", name: "bootstrap") {
    pullRequest(number: 30342) {
      projectCards {
        nodes {
          project {
            name
          }
        }
      }
    }
  }
}

但对于链接的问题,我认为 API 尚不可用。如果 repo 是公开的,你仍然可以从github.com 抓取列表。以下脚本使用获取问题 URL 列表:

import requests
from bs4 import BeautifulSoup
import re

repo = "twbs/bootstrap"
pr = "30342"

r = requests.get(f"https://github.com/{repo}/pull/{pr}")
soup = BeautifulSoup(r.text, 'html.parser')
issueForm = soup.find("form", { "aria-label": re.compile('Link issues')})

print([ i["href"] for i in issueForm.find_all("a")])
于 2020-03-20T19:29:20.147 回答
0

理论上,以下查询应返回问题的链接拉取请求编号。但是,它现在返回一条提示内部错误的错误消息。我在 github 上开了一张票。

(项目 kode-konveyor/TaskMarket,第 121 期)

{
  repository(owner: "kode-konveyor", name: "TaskMarket") {
    issue(number: 121) {
      id
      number
      title
      timelineItems {
        __typename
        ... on IssueTimelineItemsConnection {
          nodes {
            __typename
            ... on ConnectedEvent {
              source {
                __typename
                ... on PullRequest {
                  number
                }
              }
              subject {
                __typename
                ... on PullRequest {
                  number
                }
              }
            }
          }
        }
      }
    }
  }
}
于 2020-05-10T17:07:02.870 回答
0

(在此处发布此内容,以防其他人希望将问题与拉取请求相关联)

没有直接的方法可以获取链接到拉取请求的问题列表。

但是每个拉取请求都包含一个事件时间线,其中一个事件是链接问题时。使用事件的时间线,我能够编写一个 GitHub APIv4 API 请求和一些 javascript 来获取链接到 PR 的问题:

首先,这是 GraphQL 查询:

{
  resource(url: "https://github.com/Org/Project/pull/1234") {
    ... on PullRequest {
      timelineItems(itemTypes: [CONNECTED_EVENT, DISCONNECTED_EVENT], first: 100) {
        nodes {
          ... on ConnectedEvent {
            id
            subject {
              ... on Issue {
                number
              }
            }
          }
          ... on DisconnectedEvent {
            id
            subject {
              ... on Issue {
                number
              }
            }
          }
        }
      }
    }
  }
}

如果您在 GitHub GraphQL Explorer ( https://developer.github.com/v4/explorer/ ) 中运行它,您将看到问题与拉取请求连接和断开连接的所有事件。

使用该查询,我将响应传递给我为 nodejs 应用程序编写的此代码,然后确定哪个问题仍链接到拉取请求

const issues = {};
resource.timelineItems.nodes.map(node => {
    if (issues.hasOwnProperty(node.subject.number)) {
        issues[node.subject.number]++;
    } else {
        issues[node.subject.number] = 1;
    }
});
const linkedIssues = [];
for (const [issue, count] of Object.entries(issues)) {
    if (count % 2 != 0) {
        linkedIssues.push(issue);
    }
}
console.log(issues);

console.log(linkedIssues);

这里的逻辑如下:

  1. 获取 CONNECTED_EVENT 和 DISCONNECTED_EVENT 类型的 Pull Request 上的所有事件列表

  2. 创建一个地图,以问题编号为关键字,并记录问题连接和断开连接的次数

  3. 从该映射中,查找具有奇数计数的键,因为这些是已连接的事件,但没有相应的 DISCONNECTED 事件。

这不是一个超级优雅的解决方案,但它解决了我所需要的,即找到那些链接的问题。

希望这可以帮助其他人 

于 2020-05-21T17:37:43.067 回答