搜索

首页  >  问答  >  正文

如何使用 octokit 列出我组织中所有存储库中的开放 PR?

<p>我想用 Javascript 编写一个脚本来查询我的组织中所有存储库中的所有开放 github PR。我可以使用此 URL 在浏览器中执行此操作:<code>https://my.github.server/pulls?q=is%3Aopen+is%3Apr+org%3Amy-org-name</code>。</p> <p>但是使用 octokit,我需要提供要搜索的存储库的名称。看起来 github API 也需要它,但正如我所说,上面的 URL 不提供存储库名称,但它工作得很好。</p> <p>文档中的开头也有 <code>/repos</code> ,而我的上面没有。我在 github API 文档中找不到我正在使用的那个。如果我尝试如上所述 <code>octokit.request( 'GET /pulls?q=...' )</code> ,我会得到 404。</p> <p>我确信有一种方法可以列出存储库并对每个存储库运行上述搜索,但我有数十个存储库,因此这可能会慢得多。有没有办法在一个请求中完成它?</p>
P粉966335669P粉966335669452 天前632

全部回复(2)我来回复

  • P粉107991030

    P粉1079910302023-09-02 16:21:43

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

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

    回复
    0
  • P粉713866425

    P粉7138664252023-09-02 13:30:20

    没有直接的方法可以使用 GitHub 的 API 或 Octokit 在单个请求中获取组织内所有存储库中的所有开放 PR。 Search 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));

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

    回复
    0
  • 取消回复