import * as core from "@actions/core"; import * as tc from "@actions/tool-cache"; import * as path from "path"; import { OWNER, REPO, TOOL_CACHE_NAME } from "../utils/constants"; import { Architecture, Platform } from "../utils/platforms"; import { validateChecksum } from "./checksum/checksum"; import * as github from "@actions/github"; export function tryGetFromToolCache( arch: Architecture, version: string, ): { version: string; installedPath: string | undefined } { core.debug(`Trying to get uv from tool cache for ${version}...`); const cachedVersions = tc.findAllVersions(TOOL_CACHE_NAME, arch); core.debug(`Cached versions: ${cachedVersions}`); let resolvedVersion = tc.evaluateVersions(cachedVersions, version); if (resolvedVersion === "") { resolvedVersion = version; } const installedPath = tc.find(TOOL_CACHE_NAME, resolvedVersion, arch); return { version: resolvedVersion, installedPath }; } export async function downloadVersion( platform: Platform, arch: Architecture, version: string, checkSum: string | undefined, githubToken: string, ): Promise<{ version: string; cachedToolDir: string }> { const resolvedVersion = await resolveVersion(version, githubToken); const artifact = `uv-${arch}-${platform}`; let downloadUrl = `https://github.com/${OWNER}/${REPO}/releases/download/${resolvedVersion}/${artifact}`; if (platform === "pc-windows-msvc") { downloadUrl += ".zip"; } else { downloadUrl += ".tar.gz"; } core.info(`Downloading uv from "${downloadUrl}" ...`); const downloadPath = await tc.downloadTool( downloadUrl, undefined, githubToken, ); await validateChecksum( checkSum, downloadPath, arch, platform, resolvedVersion, ); let uvDir: string; if (platform === "pc-windows-msvc") { uvDir = await tc.extractZip(downloadPath); // On windows extracting the zip does not create an intermediate directory } else { const extractedDir = await tc.extractTar(downloadPath); uvDir = path.join(extractedDir, artifact); } const cachedToolDir = await tc.cacheDir( uvDir, TOOL_CACHE_NAME, resolvedVersion, arch, ); return { version: resolvedVersion, cachedToolDir }; } async function resolveVersion( version: string, githubToken: string, ): Promise { if (tc.isExplicitVersion(version)) { core.debug(`Version ${version} is an explicit version.`); return version; } const availableVersions = await getAvailableVersions(githubToken); const resolvedVersion = tc.evaluateVersions(availableVersions, version); if (resolvedVersion === "") { throw new Error(`No version found for ${version}`); } return resolvedVersion; } async function getAvailableVersions(githubToken: string): Promise { const octokit = github.getOctokit(githubToken); const response = await octokit.paginate(octokit.rest.repos.listReleases, { owner: OWNER, repo: REPO, }); return response.map((release) => release.tag_name); }