From 445689ea25e0de0a23313031f5fe577c74ae45a1 Mon Sep 17 00:00:00 2001 From: Kevin Stillhammer Date: Thu, 19 Jun 2025 21:23:43 +0200 Subject: [PATCH] Use latest version from manifest-file (#458) If a manifest-file is supplied the default value of the version input (latest) will get the latest version available in the manifest. That might not be the actual latest version available in the official uv repo. --- .github/workflows/test.yml | 1 - README.md | 5 +++++ dist/setup/index.js | 26 ++++++++++++++++++-------- src/download/download-version.ts | 22 +++++++++++++++++----- src/setup-uv.ts | 9 ++++++--- 5 files changed, 46 insertions(+), 17 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fb8505e..0c57aab 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -540,7 +540,6 @@ jobs: - name: Install from custom manifest file uses: ./ with: - version: 0.7.12-alpha.1 manifest-file: "https://raw.githubusercontent.com/astral-sh/setup-uv/${{ github.ref }}/__tests__/download/custom-manifest.json" - run: uv sync working-directory: __tests__/fixtures/uv-project diff --git a/README.md b/README.md index a75541d..895ffee 100644 --- a/README.md +++ b/README.md @@ -430,6 +430,11 @@ This is useful if you maintain your own uv builds or want to override the defaul manifest-file: "https://example.com/my-custom-manifest.json" ``` +> [!NOTE] +> When you use a custom manifest file and do not set the `version` input, its default value is `latest`. +> This means the action will install the latest version available in the custom manifest file. +> This is different from the default behavior of installing the latest version from the official uv releases. + ## How it works This action downloads uv from the uv repo's official diff --git a/dist/setup/index.js b/dist/setup/index.js index eed451c..a096a2b 100644 --- a/dist/setup/index.js +++ b/dist/setup/index.js @@ -124735,11 +124735,21 @@ async function downloadVersion(downloadUrl, artifactName, platform, arch, versio function getExtension(platform) { return platform === "pc-windows-msvc" ? ".zip" : ".tar.gz"; } -async function resolveVersion(versionInput, githubToken) { +async function resolveVersion(versionInput, manifestFile, githubToken) { core.debug(`Resolving version: ${versionInput}`); - const version = versionInput === "latest" - ? await getLatestVersion(githubToken) - : versionInput; + let version; + if (manifestFile) { + version = + versionInput === "latest" + ? await (0, version_manifest_1.getLatestKnownVersion)(manifestFile) + : versionInput; + } + else { + version = + versionInput === "latest" + ? await getLatestVersion(githubToken) + : versionInput; + } if (tc.isExplicitVersion(version)) { core.debug(`Version ${version} is an explicit version.`); return version; @@ -125105,7 +125115,7 @@ function detectEmptyWorkdir() { } } async function setupUv(platform, arch, checkSum, githubToken) { - const resolvedVersion = await determineVersion(); + const resolvedVersion = await determineVersion(inputs_1.manifestFile); const toolCacheResult = (0, download_version_1.tryGetFromToolCache)(arch, resolvedVersion); if (toolCacheResult.installedPath) { core.info(`Found uv in tool-cache for ${toolCacheResult.version}`); @@ -125127,16 +125137,16 @@ async function setupUv(platform, arch, checkSum, githubToken) { version: downloadVersionResult.version, }; } -async function determineVersion() { +async function determineVersion(manifestFile) { if (inputs_1.version !== "") { - return await (0, download_version_1.resolveVersion)(inputs_1.version, inputs_1.githubToken); + return await (0, download_version_1.resolveVersion)(inputs_1.version, manifestFile, inputs_1.githubToken); } const versionFromUvToml = (0, config_file_1.getUvVersionFromConfigFile)(`${inputs_1.workingDirectory}${path.sep}uv.toml`); const versionFromPyproject = (0, config_file_1.getUvVersionFromConfigFile)(`${inputs_1.workingDirectory}${path.sep}pyproject.toml`); if (versionFromUvToml === undefined && versionFromPyproject === undefined) { core.info("Could not determine uv version from uv.toml or pyproject.toml. Falling back to latest."); } - return await (0, download_version_1.resolveVersion)(versionFromUvToml || versionFromPyproject || "latest", inputs_1.githubToken); + return await (0, download_version_1.resolveVersion)(versionFromUvToml || versionFromPyproject || "latest", manifestFile, inputs_1.githubToken); } function addUvToPathAndOutput(cachedPath) { core.setOutput("uv-path", `${cachedPath}${path.sep}uv`); diff --git a/src/download/download-version.ts b/src/download/download-version.ts index e06efae..3204e26 100644 --- a/src/download/download-version.ts +++ b/src/download/download-version.ts @@ -7,7 +7,10 @@ import { OWNER, REPO, TOOL_CACHE_NAME } from "../utils/constants"; import type { Architecture, Platform } from "../utils/platforms"; import { validateChecksum } from "./checksum/checksum"; import { Octokit } from "../utils/octokit"; -import { getDownloadUrl } from "./version-manifest"; +import { + getDownloadUrl, + getLatestKnownVersion as getLatestVersionInManifest, +} from "./version-manifest"; export function tryGetFromToolCache( arch: Architecture, @@ -127,13 +130,22 @@ function getExtension(platform: Platform): string { export async function resolveVersion( versionInput: string, + manifestFile: string | undefined, githubToken: string, ): Promise { core.debug(`Resolving version: ${versionInput}`); - const version = - versionInput === "latest" - ? await getLatestVersion(githubToken) - : versionInput; + let version: string; + if (manifestFile) { + version = + versionInput === "latest" + ? await getLatestVersionInManifest(manifestFile) + : versionInput; + } else { + version = + versionInput === "latest" + ? await getLatestVersion(githubToken) + : versionInput; + } if (tc.isExplicitVersion(version)) { core.debug(`Version ${version} is an explicit version.`); return version; diff --git a/src/setup-uv.ts b/src/setup-uv.ts index de9129d..f6ed2af 100644 --- a/src/setup-uv.ts +++ b/src/setup-uv.ts @@ -87,7 +87,7 @@ async function setupUv( checkSum: string | undefined, githubToken: string, ): Promise<{ uvDir: string; version: string }> { - const resolvedVersion = await determineVersion(); + const resolvedVersion = await determineVersion(manifestFile); const toolCacheResult = tryGetFromToolCache(arch, resolvedVersion); if (toolCacheResult.installedPath) { core.info(`Found uv in tool-cache for ${toolCacheResult.version}`); @@ -127,9 +127,11 @@ async function setupUv( }; } -async function determineVersion(): Promise { +async function determineVersion( + manifestFile: string | undefined, +): Promise { if (versionInput !== "") { - return await resolveVersion(versionInput, githubToken); + return await resolveVersion(versionInput, manifestFile, githubToken); } const versionFromUvToml = getUvVersionFromConfigFile( `${workingDirectory}${path.sep}uv.toml`, @@ -144,6 +146,7 @@ async function determineVersion(): Promise { } return await resolveVersion( versionFromUvToml || versionFromPyproject || "latest", + manifestFile, githubToken, ); }