Wie liste ich mit Octokit offene PRs in allen Repositorys meiner Organisation auf?
P粉966335669
P粉966335669 2023-09-01 19:54:24
0
2
656
<p>Ich möchte ein Skript in Javascript schreiben, um alle offenen Github-PRs in allen Repositorys meiner Organisation abzufragen. Ich kann es im Browser mit dieser URL tun: <code>https://my.github.server/pulls?q=is%3Aopen+is%3Apr+org%3Amy-org-name</code> </p> <p>Bei Verwendung von Octokit muss ich jedoch den Namen des zu durchsuchenden Repositorys angeben. Es sieht so aus, als ob die Github-API dies ebenfalls erfordert, aber wie gesagt, die obige URL liefert nicht den Repository-Namen, aber es funktioniert einwandfrei. </p> <p>Das Dokument hat auch <code>/repos</code> am Anfang, aber in meinem Dokument ist es oben nicht enthalten. Ich kann die von mir verwendete Version nicht in der Github-API-Dokumentation finden. Wenn ich <code>octokit.request( 'GET /pulls?q=...' )</code> versuche, erhalte ich eine 404. </p> <p>Ich bin mir sicher, dass es eine Möglichkeit gibt, die Repositorys aufzulisten und die obige Suche für jedes einzelne auszuführen, aber ich habe Dutzende von Repositorys, daher wird dies wahrscheinlich viel langsamer sein. Gibt es eine Möglichkeit, dies in einer Anfrage zu tun? </p>
P粉966335669
P粉966335669

Antworte allen(2)
P粉107991030

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

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

没有直接的方法可以使用 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));

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

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage