问题描述
是否可以每 x
秒检查一次并确定是否在 github 存储库上创建了新的拉取请求,并对其执行功能(我使用的是 JavaScript 库 @octokit/rest
)?
到目前为止我有
const { Octokit } = require('@octokit/rest');
const octokit = new Octokit({
auth: "REDACTED"
});
var data = (async () => {
var response = await octokit.request('/repos/foo/bar/pulls?state=all');
return response;
})();
以数据作为github api的响应。我如何确定是否创建了一个新的 pr,我想出的最简单的方法是 ofc 实际比较变量 data
的长度,但到目前为止我实际上无法弄清楚如何这样做。>
解决方法
默认情况下,pulls
按 created
排序,因此我们可以检查第 0 个索引的 number
属性是否大于旧的 number
。 (number
就像网站上显示的 #1、#4 等)。在等待新 PR 期间,可能会创建多个 PR,因此我们需要过滤掉 data
,以便我们可以有多个 PR 高于之前的值。
这是基于文档:
- https://octokit.github.io/rest.js/v18#pulls-list
- https://docs.github.com/en/rest/reference/pulls#list-pull-requests
并使用 curl 测试路由
const { Octokit } = require('@octokit/rest');
const octokit = new Octokit({
auth: "REDACTED"
});
const getData = () => octokit.request('/repos/foo/bar/pulls?state=all');
const getLatestPRNumber = (data) => data.length === 0 ? 0 : data[0]["number"];
const getPRsAboveNumber = (data,prNumber) => data.filter(({number}) => number > prNumber)
(async () => {
const data = await getData();
let latestPR = getLatestPRNumber(data);
setInterval(async () => {
const data = await getData();
const firstPRNumber = getLatestPRNumber(data);
if (firstPRNumber > latestPR) {
const newPRs = getPRsAboveNumber(data,latestPR);
console.log(newPRs);
latestPR = firstPRNumber;
}
},1000 * 60); // 1000ms * 60 = 60s
})();
如果做了太多的 PR,那么一些 PR 将无法访问,因为 GitHub API 使用分页
根据文档:
名称 | 输入 | 在 | Desc |
---|---|---|---|
per_page | 整数 | 查询 | 每页结果(最多 100 个)。默认值:30 |
页面 | 整数 | 查询 | 要获取的结果的页码。默认值:1 |