mirror of https://github.com/aminya/setup-cpp.git
91 lines
2.1 KiB
TypeScript
91 lines
2.1 KiB
TypeScript
import { Octokit } from "@octokit/rest"
|
|
import { writeFile } from "fs/promises"
|
|
import JsonStringify from "safe-stable-stringify"
|
|
import { compareVersion } from "../setup/version.ts"
|
|
import type { Assets } from "./load-assets.ts"
|
|
|
|
/**
|
|
* Get the list of all releases of a GitHub repository
|
|
* @param owner The owner of the repository
|
|
* @param repo The name of the repository
|
|
* @param prerelease Whether to include prereleases
|
|
*/
|
|
|
|
async function fetchGitHubAssetList(
|
|
owner: string,
|
|
repo: string,
|
|
filterAssets?: (asset: string) => boolean,
|
|
prerelease = false,
|
|
) {
|
|
const octokit = new Octokit({
|
|
auth: process.env.GITHUB_TOKEN,
|
|
})
|
|
|
|
const assets: Assets = {}
|
|
|
|
for (let page = 1; page !== 101; page++) {
|
|
console.log(`Fetching page ${page}`)
|
|
try {
|
|
/* eslint-disable no-await-in-loop */
|
|
const res = await octokit.repos.listReleases({
|
|
owner,
|
|
repo,
|
|
per_page: 100, // maximum supported by GitHub API
|
|
page,
|
|
})
|
|
|
|
if (res.data.length === 0) {
|
|
break
|
|
}
|
|
|
|
for (const release of res.data) {
|
|
if (release.draft) {
|
|
continue
|
|
}
|
|
|
|
if (!prerelease && release.prerelease) {
|
|
continue
|
|
}
|
|
|
|
if (!(release.tag_name in assets)) {
|
|
assets[release.tag_name] = []
|
|
}
|
|
|
|
const assets_ref = assets[release.tag_name]
|
|
|
|
for (const asset of release.assets) {
|
|
if (filterAssets !== undefined && !filterAssets(asset.name)) {
|
|
continue
|
|
}
|
|
assets_ref.push(asset.name)
|
|
}
|
|
}
|
|
} catch (err) {
|
|
console.error(err)
|
|
break
|
|
}
|
|
}
|
|
|
|
return assets
|
|
}
|
|
/**
|
|
* Save the list of all releases of a GitHub repository to a json file
|
|
*/
|
|
|
|
export async function saveGitHubAssetList(
|
|
owner: string,
|
|
repo: string,
|
|
path: string,
|
|
filterAssets?: (asset: string) => boolean,
|
|
) {
|
|
const assets = await fetchGitHubAssetList(owner, repo, filterAssets, false)
|
|
|
|
const jsonStringify = JsonStringify.configure({
|
|
deterministic: compareVersion,
|
|
})
|
|
const data = jsonStringify(assets, null, 2)
|
|
|
|
// write the assets to a json file
|
|
await writeFile(path, data)
|
|
}
|