代码之家  ›  专栏  ›  技术社区  ›  Graeme Perrow

我如何使用octokit列出我组织中所有转发的打开PR?

  •  0
  • Graeme Perrow  · 技术社区  · 3 年前

    我想用Javascript写一个脚本来查询所有打开的github PR 在所有回购中 在我的组织中。我可以在浏览器中使用此URL: https://my.github.server/pulls?q=is%3Aopen+is%3Apr+org%3Amy-org-name

    但是使用 octokit ,我需要提供要搜索的回购的名称。看起来 github API 也需要它,但正如我所说,上面的URL没有提供回购名称,它运行得很好。

    记录在案的 /repos 一开始,我上面没有。我在github API文档中找不到我正在使用的。如果我尝试 octokit.request( 'GET /pulls?q=...' ) 如上所述,我得了404分。

    我相信有一种方法可以列出收回房屋并对每一个进行上面的搜索,但我有几十个收回房屋,所以速度可能会慢得多。有没有一种方法可以在一个请求中完成?

    1 回复  |  直到 3 年前
        1
  •  1
  •   Christian    3 年前

    使用GitHub的API或Octokit,无法直接在一个请求中获取组织内所有存储库中的所有打开PR。搜索API可以搜索PR,但不支持按组织进行筛选。

    您可以获取组织中所有存储库的列表,并使用存储库列表获取每个存储库的所有拉取请求。

    示例:

    const { Octokit } = require("@octokit/core");
    
    const octokit = new Octokit({ auth: `your_auth_token` });
    
    async function fetchAllRepos(org) {
        const repos = [];
        let page = 1;
        while (true) {
            const result = await octokit.request('GET /orgs/{org}/repos', {
                org: org,
                type: 'public',
                per_page: 100,
                page: page
            });
    
            if (result.data.length === 0) break;
            repos.push(...result.data);
            page++;
        }
        return repos;
    }
    
    async function fetchAllPRs(org) {
        const repos = await fetchAllRepos(org);
    
        const prPromises = repos.map(repo =>
            octokit.request('GET /repos/{owner}/{repo}/pulls', {
                owner: org,
                repo: repo.name,
                state: 'open'
            })
        );
    
        const prResults = await Promise.all(prPromises);
        const prs = prResults.flatMap(result => result.data);
        return prs;
    }
    
    fetchAllPRs('my-org-name')
        .then(prs => console.log(prs))
        .catch(err => console.error(err));
    

    不确定在你的情况下这会有多慢。无论如何,我希望这会有所帮助。

        2
  •  1
  •   Lucia    2 年前

    它确实支持按组织过滤。使用:

    await octokit.request("GET /search/issues", {
        q: `is:pr is:open org:ORGANIZATION`,
    });