mirror of https://github.com/aminya/setup-cpp
fix: match assets via keywords
This commit is contained in:
parent
d0c5d225d2
commit
22bfbec1e0
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -13,7 +13,7 @@ import { addUpdateAlternativesToRc, installAptPack } from "setup-apt"
|
|||
import { installBrewPack } from "setup-brew"
|
||||
import { rcOptions } from "../cli-options.js"
|
||||
import { setupMacOSSDK } from "../macos-sdk/macos-sdk.js"
|
||||
import { loadGitHubAssetList, matchAsset } from "../utils/asset/load-assets.js"
|
||||
import { loadAssetList, matchAsset } from "../utils/asset/load-assets.js"
|
||||
import { hasDnf } from "../utils/env/hasDnf.js"
|
||||
import { isArch } from "../utils/env/isArch.js"
|
||||
import { isUbuntu } from "../utils/env/isUbuntu.js"
|
||||
|
@ -29,18 +29,22 @@ const dirname = typeof __dirname === "string" ? __dirname : path.dirname(fileURL
|
|||
async function getGccPackageInfo(version: string, platform: NodeJS.Platform, arch: string): Promise<PackageInfo> {
|
||||
switch (platform) {
|
||||
case "win32": {
|
||||
const mingwAssets = await loadGitHubAssetList(
|
||||
const mingwAssets = await loadAssetList(
|
||||
join(dirname, "github_brechtsanders_winlibs_mingw.json"),
|
||||
)
|
||||
|
||||
const mingwArchMap = {
|
||||
x64: "x86_64",
|
||||
ia32: "i386",
|
||||
} as Record<string, string | undefined>
|
||||
|
||||
const asset = matchAsset(
|
||||
mingwAssets,
|
||||
{
|
||||
version,
|
||||
arch: arch === "x64"
|
||||
? "x86_64"
|
||||
: arch === "ia32"
|
||||
? "i386"
|
||||
: arch,
|
||||
keywords: [
|
||||
mingwArchMap[arch] ?? arch,
|
||||
],
|
||||
},
|
||||
)
|
||||
|
||||
|
|
|
@ -69,7 +69,7 @@ async function fetchIndexFile(version: string, url: string, htmlDownloadDir: str
|
|||
retry: {
|
||||
delay: 100,
|
||||
maxRetries: 3,
|
||||
}
|
||||
},
|
||||
},
|
||||
)
|
||||
dl.on("start", () => {
|
||||
|
|
|
@ -1,26 +1,29 @@
|
|||
import { readFile } from "fs/promises"
|
||||
|
||||
/**
|
||||
* The list of assets of a GitHub release
|
||||
* The list of assets
|
||||
* @key tag The tag of the release
|
||||
* @value assets The names of the assets of the release
|
||||
*/
|
||||
export type Assets = Record<string, string[]>
|
||||
|
||||
export async function loadGitHubAssetList(path: string): Promise<Assets> {
|
||||
/**
|
||||
* Load the list of assets from a json file
|
||||
*/
|
||||
export async function loadAssetList(path: string): Promise<Assets> {
|
||||
const data = await readFile(path, "utf-8")
|
||||
return JSON.parse(data)
|
||||
}
|
||||
|
||||
type MatchAssetOpts = {
|
||||
version: string
|
||||
arch?: string
|
||||
keywords?: string[]
|
||||
filterTag?: (version: string) => boolean
|
||||
filterName?: (asset: string) => boolean
|
||||
}
|
||||
|
||||
/**
|
||||
* Match the asset that matches the version and arch
|
||||
* Match the asset that matches the version and given keywords
|
||||
*/
|
||||
export function matchAsset(
|
||||
assets: Assets,
|
||||
|
@ -60,21 +63,23 @@ export function matchAsset(
|
|||
}
|
||||
|
||||
if (matchedNames.length === 0) {
|
||||
throw new Error(`no asset found for version ${opts.version} and arch ${opts.arch}`)
|
||||
throw new Error(`no asset found for version ${opts.version}`)
|
||||
}
|
||||
|
||||
// use the first asset if the arch is not specified
|
||||
if (opts.arch === undefined) {
|
||||
if (opts.keywords?.length === 0) {
|
||||
return { tag, name: matchedNames[0] }
|
||||
}
|
||||
|
||||
// find the asset that matches the arch
|
||||
// find the first asset that matches the keywords
|
||||
for (const name of matchedNames) {
|
||||
// search each asset name for the arch
|
||||
if (name.includes(opts.arch)) {
|
||||
if (opts.keywords!.every((keyword) => name.includes(keyword))) {
|
||||
return { tag, name }
|
||||
}
|
||||
}
|
||||
|
||||
throw new Error(`arch ${opts.arch} could not be found among ${JSON.stringify(matchedNames)}`)
|
||||
throw new Error(
|
||||
`Could not find a matching asset for version ${opts.version} and keywords ${JSON.stringify(opts.keywords)} among ${
|
||||
JSON.stringify(matchedNames)
|
||||
}`,
|
||||
)
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue