setup-cpp
Version:
Install all the tools required for building and testing C++/C projects.
118 lines • 14.8 kB
JavaScript
import { info } from "ci-log";
import escapeRegex from "escape-string-regexp";
import { execa } from "execa";
import { getAptEnv } from "./apt-env.js";
import { getApt } from "./get-apt.js";
import { isAptPackInstalled } from "./is-installed.js";
import { updateAptReposMemoized, updatedRepos } from "./update.js";
/**
* The type of apt package to install
*/
export var AptPackageType;
(function (AptPackageType) {
AptPackageType[AptPackageType["NameDashVersion"] = 0] = "NameDashVersion";
AptPackageType[AptPackageType["NameEqualsVersion"] = 1] = "NameEqualsVersion";
AptPackageType[AptPackageType["Name"] = 2] = "Name";
AptPackageType[AptPackageType["None"] = 3] = "None";
})(AptPackageType || (AptPackageType = {}));
/**
* Filter out the packages that are already installed and qualify the packages into a full package name/version
*/
export async function filterAndQualifyAptPackages(packages, apt = getApt()) {
return (await Promise.all(packages.map((pack) => qualifiedNeededAptPackage(pack, apt))))
.filter((pack) => pack !== undefined);
}
/**
* Qualify the package into full package name/version.
* If the package is not installed, return the full package name/version.
* If the package is already installed, return undefined
*/
export async function qualifiedNeededAptPackage(pack, apt = getApt()) {
// Qualify the package into full package name/version
const qualified = await getAptArg(apt, pack);
// filter out the package that are already installed
return (await isAptPackInstalled(qualified)) ? undefined : qualified;
}
async function aptPackageType(apt, name, version, fallBackToLatest) {
const hasVersion = version !== undefined && version !== "";
const canFallBackToLatest = !hasVersion || fallBackToLatest;
if (hasVersion) {
// check if apt-get search can find the version
if (await aptCacheSearchHasPackage(apt, name, version)) {
return AptPackageType.NameDashVersion;
}
// check if apt-get show can find the version
if (await aptCacheShowHasPackage(apt, `${name}=${version}`)) {
return AptPackageType.NameEqualsVersion;
}
}
const logFallback = () => {
if (hasVersion && fallBackToLatest) {
info(`Could not find package ${name} ${version}. Falling back to latest version.`);
}
};
if (canFallBackToLatest && await aptCacheShowHasPackage(apt, name)) {
// if the version is undefined or empty, return the name as a package name
logFallback();
return AptPackageType.Name;
}
// If apt-cache fails, update the repos and try again
if (!updatedRepos) {
updateAptReposMemoized(apt);
return aptPackageType(apt, name, version, fallBackToLatest);
}
if (canFallBackToLatest) {
// if the version is undefined or empty, return the name as a package name
logFallback();
return AptPackageType.Name;
}
return AptPackageType.None;
}
async function aptCacheSearchHasPackage(apt, name, version) {
try {
const { stdout } = await execa("apt-cache", [
"search",
"--names-only",
`^${escapeRegex(name)}-${escapeRegex(version)}$`,
], { env: getAptEnv(apt), stdio: "pipe" });
if (stdout.trim() !== "") {
return true;
}
}
catch {
// ignore
}
return false;
}
async function aptCacheShowHasPackage(apt, arg) {
try {
const { stdout } = await execa("apt-cache", ["show", arg], {
env: getAptEnv(apt),
stdio: "pipe",
verbose: true,
});
if (stdout.trim() !== "") {
return true;
}
}
catch {
// ignore
}
return false;
}
async function getAptArg(apt, pack) {
const { name, version, fallBackToLatest = false } = pack;
const package_type = await aptPackageType(apt, name, version, fallBackToLatest);
switch (package_type) {
case AptPackageType.NameDashVersion:
return `${name}-${version}`;
case AptPackageType.NameEqualsVersion:
return `${name}=${version}`;
case AptPackageType.Name: {
return name;
}
default:
throw new Error(`Could not find package '${name}' ${version ?? "with unspecified version"}`);
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhbGlmeS1pbnN0YWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3F1YWxpZnktaW5zdGFsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sUUFBUSxDQUFBO0FBQzdCLE9BQU8sV0FBVyxNQUFNLHNCQUFzQixDQUFBO0FBQzlDLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxPQUFPLENBQUE7QUFDN0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN4QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRXJDLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLG1CQUFtQixDQUFBO0FBQ3RELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxZQUFZLEVBQUUsTUFBTSxhQUFhLENBQUE7QUFFbEU7O0dBRUc7QUFDSCxNQUFNLENBQU4sSUFBWSxjQUtYO0FBTEQsV0FBWSxjQUFjO0lBQ3hCLHlFQUFtQixDQUFBO0lBQ25CLDZFQUFxQixDQUFBO0lBQ3JCLG1EQUFRLENBQUE7SUFDUixtREFBUSxDQUFBO0FBQ1YsQ0FBQyxFQUxXLGNBQWMsS0FBZCxjQUFjLFFBS3pCO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLDJCQUEyQixDQUFDLFFBQXNCLEVBQUUsTUFBYyxNQUFNLEVBQUU7SUFDOUYsT0FBTyxDQUFDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JGLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFBO0FBQ3pDLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSx5QkFBeUIs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cG9ydCBlc2NhcGVSZWdleCBmcm9tIFwiZXNjYXBlLXN0cmluZy1yZWdleHBcIlxuaW1wb3J0IHsgZXhlY2EgfSBmcm9tIFwiZXhlY2FcIlxuaW1wb3J0IHsgZ2V0QXB0RW52IH0gZnJvbSBcIi4vYXB0LWVudi5qc1wiXG5pbXBvcnQgeyBnZXRBcHQgfSBmcm9tIFwiLi9nZXQtYXB0LmpzXCJcbmltcG9ydCB0eXBlIHsgQXB0UGFja2FnZSB9IGZyb20gXCIuL2luc3RhbGwuanNcIlxuaW1wb3J0IHsgaXNBcHRQYWNrSW5zdGFsbGVkIH0gZnJvbSBcIi4vaXMtaW5zdGFsbGVkLmpzXCJcbmltcG9ydCB7IHVwZGF0ZUFwdFJlcG9zTWVtb2l6ZWQsIHVwZGF0ZWRSZXBvcyB9IGZyb20gXCIuL3VwZGF0ZS5qc1wiXG5cbi8qKlxuICogVGhlIHR5cGUgb2YgYXB0IHBhY2thZ2UgdG8gaW5zdGFsbFxuICovXG5leHBvcnQgZW51bSBBcHRQYWNrYWdlVHlwZSB7XG4gIE5hbWVEYXNoVmVyc2lvbiA9IDAsXG4gIE5hbWVFcXVhbHNWZXJzaW9uID0gMSxcbiAgTmFtZSA9IDIsXG4gIE5vbmUgPSAzLFxufVxuXG4vKipcbiAqIEZpbHRlciBvdXQgdGhlIHBhY2thZ2VzIHRoYXQgYXJlIGFscmVhZHkgaW5zdGFsbGVkIGFuZCBxdWFsaWZ5IHRoZSBwYWNrYWdlcyBpbnRvIGEgZnVsbCBwYWNrYWdlIG5hbWUvdmVyc2lvblxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmlsdGVyQW5kUXVhbGlmeUFwdFBhY2thZ2VzKHBhY2thZ2VzOiBBcHRQYWNrYWdlW10sIGFwdDogc3RyaW5nID0gZ2V0QXB0KCkpIHtcbiAgcmV0dXJuIChhd2FpdCBQcm9taXNlLmFsbChwYWNrYWdlcy5tYXAoKHBhY2spID0+IHF1YWxpZmllZE5lZWRlZEFwdFBhY2thZ2UocGFjaywgYXB0KSkpKVxuICAgIC5maWx0ZXIoKHBhY2spID0+IHBhY2sgIT09IHVuZGVmaW5lZClcbn1cblxuLyoqXG4gKiBRdWFsaWZ5IHRoZSBwYWNrYWdlIGludG8gZnVsbCBwYWNrYWdlIG5hbWUvdmVyc2lvbi5cbiAqIElmIHRoZSBwYWNrYWdlIGlzIG5vdCBpbnN0YWxsZWQsIHJldHVybiB0aGUgZnVsbCBwYWNrYWdlIG5hbWUvdmVyc2lvbi5cbiAqIElmIHRoZSBwYWNrYWdlIGlzIGFscmVhZHkgaW5zdGFsbGVkLCByZXR1cm4gdW5kZWZpbmVkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBxdWFsaWZpZWROZWVkZWRBcHRQYWNrYWdlKHBhY2s6IEFwdFBhY2thZ2UsIGFwdDogc3RyaW5nID0gZ2V0QXB0KCkpIHtcbiAgLy8gUXVhbGlmeSB0aGUgcGFja2FnZSBpbnRvIGZ1bGwgcGFja2FnZSBuYW1lL3ZlcnNpb25cbiAgY29uc3QgcXVhbGlmaWVkID0gYXdhaXQgZ2V0QXB0QXJnKGFwdCwgcGFjaylcbiAgLy8gZmlsdGVyIG91dCB0aGUgcGFja2FnZSB0aGF0IGFyZSBhbHJlYWR5IGluc3RhbGxlZFxuICByZXR1cm4gKGF3YWl0IGlzQXB0UGFja0luc3RhbGxlZChxdWFsaWZpZWQpKSA/IHVuZGVmaW5lZCA6IHF1YWxpZmllZFxufVxuXG5hc3luYyBmdW5jdGlvbiBhcHRQYWNrYWdlVHlwZShcbiAgYXB0OiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbiAgdmVyc2lvbjogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBmYWxsQmFja1RvTGF0ZXN0OiBib29sZWFuLFxuKTogUHJvbWlzZTxBcHRQYWNrYWdlVHlwZT4ge1xuICBjb25zdCBoYXNWZXJzaW9uID0gdmVyc2lvbiAhPT0gdW5kZWZpbmVkICYmIHZlcnNpb24gIT09IFwiXCJcbiAgY29uc3QgY2FuRmFsbEJhY2tUb0xhdGVzdCA9ICFoYXNWZXJzaW9uIHx8IGZhbGxCYWNrVG9MYXRlc3RcblxuICBpZiAoaGFzVmVyc2lvbikge1xuICAgIC8vIGNoZWNrIGlmIGFwdC1nZXQgc2VhcmNoIGNhbiBmaW5kIHRoZSB2ZXJzaW9uXG4gICAgaWYgKGF3YWl0IGFwdENhY2hlU2VhcmNoSGFzUGFja2FnZShhcHQsIG5hbWUsIHZlcnNpb24pKSB7XG4gICAgICByZXR1cm4gQXB0UGFja2FnZVR5cGUuTmFtZURhc2hWZXJzaW9uXG4gICAgfVxuXG4gICAgLy8gY2hlY2sgaWYgYXB0LWdldCBzaG93IGNhbiBmaW5kIHRoZSB2ZXJzaW9uXG4gICAgaWYgKGF3YWl0IGFwdENhY2hlU2hvd0hhc1BhY2thZ2UoYXB0LCBgJHtuYW1lfT0ke3ZlcnNpb259YCkpIHtcbiAgICAgIHJldHVybiBBcHRQYWNrYWdlVHlwZS5OYW1lRXF1YWxzVmVyc2lvblxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGxvZ0ZhbGxiYWNrID0gKCkgPT4ge1xuICAgIGlmIChoYXNWZXJzaW9uICYmIGZhbGxCYWNrVG9MYXRlc3QpIHtcbiAgICAgIGluZm8oYENvdWxkIG5vdCBmaW5kIHBhY2thZ2UgJHtuYW1lfSAke3ZlcnNpb259LiBGYWxsaW5nIGJhY2sgdG8gbGF0ZXN0IHZlcnNpb24uYClcbiAgICB9XG4gIH1cblxuICBpZiAoY2FuRmFsbEJhY2tUb0xhdGVzdCAmJiBhd2FpdCBhcHRDYWNoZVNob3dIYXNQYWNrYWdlKGFwdCwgbmFtZSkpIHtcbiAgICAvLyBpZiB0aGUgdmVyc2lvbiBpcyB1bmRlZmluZWQgb3IgZW1wdHksIHJldHVybiB0aGUgbmFtZSBhcyBhIHBhY2thZ2UgbmFtZVxuICAgIGxvZ0ZhbGxiYWNrKClcbiAgICByZXR1cm4gQXB0UGFja2FnZVR5cGUuTmFtZVxuICB9XG5cbiAgLy8gSWYgYXB0LWNhY2hlIGZhaWxzLCB1cGRhdGUgdGhlIHJlcG9zIGFuZCB0cnkgYWdhaW5cbiAgaWYgKCF1cGRhdGVkUmVwb3MpIHtcbiAgICB1cGRhdGVBcHRSZXBvc01lbW9pemVkKGFwdClcbiAgICByZXR1cm4gYXB0UGFja2FnZVR5cGUoYXB0LCBuYW1lLCB2ZXJzaW9uLCBmYWxsQmFja1RvTGF0ZXN0KVxuICB9XG5cbiAgaWYgKGNhbkZhbGxCYWNrVG9MYXRlc3QpIHtcbiAgICAvLyBpZiB0aGUgdmVyc2lvbiBpcyB1bmRlZmluZWQgb3IgZW1wdHksIHJldHVybiB0aGUgbmFtZSBhcyBhIHBhY2thZ2UgbmFtZVxuICAgIGxvZ0ZhbGxiYWNrKClcbiAgICByZXR1cm4gQXB0UGFja2FnZVR5cGUuTmFtZVxuICB9XG5cbiAgcmV0dXJuIEFwdFBhY2thZ2VUeXBlLk5vbmVcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXB0Q2FjaGVTZWFyY2hIYXNQYWNrYWdlKGFwdDogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZykge1xuICB0cnkge1xuICAgIGNvbnN0IHsgc3Rkb3V0IH0gPSBhd2FpdCBleGVjYShcImFwdC1jYWNoZVwiLCBbXG4gICAgICBcInNlYXJjaFwiLFxuICAgICAgXCItLW5hbWVzLW9ubHlcIixcbiAgICAgIGBeJHtlc2NhcGVSZWdleChuYW1lKX0tJHtlc2NhcGVSZWdleCh2ZXJzaW9uKX0kYCxcbiAgICBdLCB7IGVudjogZ2V0QXB0RW52KGFwdCksIHN0ZGlvOiBcInBpcGVcIiB9KVxuICAgIGlmIChzdGRvdXQudHJpbSgpICE9PSBcIlwiKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfSBjYXRjaCB7XG4gICAgLy8gaWdub3JlXG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmFzeW5jIGZ1bmN0aW9uIGFwdENhY2hlU2hvd0hhc1BhY2thZ2UoYXB0OiBzdHJpbmcsIGFyZzogc3RyaW5nKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgeyBzdGRvdXQgfSA9IGF3YWl0IGV4ZWNhKFwiYXB0LWNhY2hlXCIsIFtcInNob3dcIiwgYXJnXSwge1xuICAgICAgZW52OiBnZXRBcHRFbnYoYXB0KSxcbiAgICAgIHN0ZGlvOiBcInBpcGVcIixcbiAgICAgIHZlcmJvc2U6IHRydWUsXG4gICAgfSlcbiAgICBpZiAoc3Rkb3V0LnRyaW0oKSAhPT0gXCJcIikge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH0gY2F0Y2gge1xuICAgIC8vIGlnbm9yZVxuICB9XG4gIHJldHVybiBmYWxzZVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRBcHRBcmcoYXB0OiBzdHJpbmcsIHBhY2s6IEFwdFBhY2thZ2UpIHtcbiAgY29uc3QgeyBuYW1lLCB2ZXJzaW9uLCBmYWxsQmFja1RvTGF0ZXN0ID0gZmFsc2UgfSA9IHBhY2tcblxuICBjb25zdCBwYWNrYWdlX3R5cGUgPSBhd2FpdCBhcHRQYWNrYWdlVHlwZShhcHQsIG5hbWUsIHZlcnNpb24sIGZhbGxCYWNrVG9MYXRlc3QpXG4gIHN3aXRjaCAocGFja2FnZV90eXBlKSB7XG4gICAgY2FzZSBBcHRQYWNrYWdlVHlwZS5OYW1lRGFzaFZlcnNpb246XG4gICAgICByZXR1cm4gYCR7bmFtZX0tJHt2ZXJzaW9ufWBcbiAgICBjYXNlIEFwdFBhY2thZ2VUeXBlLk5hbWVFcXVhbHNWZXJzaW9uOlxuICAgICAgcmV0dXJuIGAke25hbWV9PSR7dmVyc2lvbn1gXG4gICAgY2FzZSBBcHRQYWNrYWdlVHlwZS5OYW1lOiB7XG4gICAgICByZXR1cm4gbmFtZVxuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgZmluZCBwYWNrYWdlICcke25hbWV9JyAke3ZlcnNpb24gPz8gXCJ3aXRoIHVuc3BlY2lmaWVkIHZlcnNpb25cIn1gKVxuICB9XG59XG4iXX0=