5
0
mirror of https://github.com/astral-sh/setup-uv.git synced 2025-12-21 11:01:40 +00:00

Compare commits

...

2 Commits

Author SHA1 Message Date
Kevin Stillhammer
445689ea25 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.
2025-06-19 21:23:43 +02:00
Kevin Stillhammer
a02a550bdd Look for version-manifest.json relative to action path (#456)
Fixes: #455
2025-06-18 23:09:13 +02:00
7 changed files with 64 additions and 20 deletions

View File

@@ -540,7 +540,6 @@ jobs:
- name: Install from custom manifest file - name: Install from custom manifest file
uses: ./ uses: ./
with: with:
version: 0.7.12-alpha.1
manifest-file: "https://raw.githubusercontent.com/astral-sh/setup-uv/${{ github.ref }}/__tests__/download/custom-manifest.json" manifest-file: "https://raw.githubusercontent.com/astral-sh/setup-uv/${{ github.ref }}/__tests__/download/custom-manifest.json"
- run: uv sync - run: uv sync
working-directory: __tests__/fixtures/uv-project working-directory: __tests__/fixtures/uv-project

View File

@@ -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" 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 ## How it works
This action downloads uv from the uv repo's official This action downloads uv from the uv repo's official

26
dist/setup/index.js generated vendored
View File

@@ -124735,11 +124735,21 @@ async function downloadVersion(downloadUrl, artifactName, platform, arch, versio
function getExtension(platform) { function getExtension(platform) {
return platform === "pc-windows-msvc" ? ".zip" : ".tar.gz"; return platform === "pc-windows-msvc" ? ".zip" : ".tar.gz";
} }
async function resolveVersion(versionInput, githubToken) { async function resolveVersion(versionInput, manifestFile, githubToken) {
core.debug(`Resolving version: ${versionInput}`); core.debug(`Resolving version: ${versionInput}`);
const version = versionInput === "latest" let version;
if (manifestFile) {
version =
versionInput === "latest"
? await (0, version_manifest_1.getLatestKnownVersion)(manifestFile)
: versionInput;
}
else {
version =
versionInput === "latest"
? await getLatestVersion(githubToken) ? await getLatestVersion(githubToken)
: versionInput; : versionInput;
}
if (tc.isExplicitVersion(version)) { if (tc.isExplicitVersion(version)) {
core.debug(`Version ${version} is an explicit version.`); core.debug(`Version ${version} is an explicit version.`);
return version; return version;
@@ -124868,6 +124878,8 @@ const node_fs_1 = __nccwpck_require__(73024);
const core = __importStar(__nccwpck_require__(37484)); const core = __importStar(__nccwpck_require__(37484));
const semver = __importStar(__nccwpck_require__(39318)); const semver = __importStar(__nccwpck_require__(39318));
const fetch_1 = __nccwpck_require__(3385); const fetch_1 = __nccwpck_require__(3385);
const node_path_1 = __nccwpck_require__(76760);
const localManifestFile = (0, node_path_1.join)(__dirname, "..", "..", "version-manifest.json");
async function getLatestKnownVersion(manifestUrl) { async function getLatestKnownVersion(manifestUrl) {
const manifestEntries = await getManifestEntries(manifestUrl); const manifestEntries = await getManifestEntries(manifestUrl);
return manifestEntries.reduce((a, b) => semver.gt(a.version, b.version) ? a : b).version; return manifestEntries.reduce((a, b) => semver.gt(a.version, b.version) ? a : b).version;
@@ -124891,7 +124903,7 @@ async function getManifestEntries(manifestUrl) {
} }
else { else {
core.info("manifest-file not provided, reading from local file."); core.info("manifest-file not provided, reading from local file.");
const fileContent = await node_fs_1.promises.readFile("version-manifest.json"); const fileContent = await node_fs_1.promises.readFile(localManifestFile);
data = fileContent.toString(); data = fileContent.toString();
} }
return JSON.parse(data); return JSON.parse(data);
@@ -125103,7 +125115,7 @@ function detectEmptyWorkdir() {
} }
} }
async function setupUv(platform, arch, checkSum, githubToken) { 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); const toolCacheResult = (0, download_version_1.tryGetFromToolCache)(arch, resolvedVersion);
if (toolCacheResult.installedPath) { if (toolCacheResult.installedPath) {
core.info(`Found uv in tool-cache for ${toolCacheResult.version}`); core.info(`Found uv in tool-cache for ${toolCacheResult.version}`);
@@ -125125,16 +125137,16 @@ async function setupUv(platform, arch, checkSum, githubToken) {
version: downloadVersionResult.version, version: downloadVersionResult.version,
}; };
} }
async function determineVersion() { async function determineVersion(manifestFile) {
if (inputs_1.version !== "") { 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 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`); const versionFromPyproject = (0, config_file_1.getUvVersionFromConfigFile)(`${inputs_1.workingDirectory}${path.sep}pyproject.toml`);
if (versionFromUvToml === undefined && versionFromPyproject === undefined) { if (versionFromUvToml === undefined && versionFromPyproject === undefined) {
core.info("Could not determine uv version from uv.toml or pyproject.toml. Falling back to latest."); 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) { function addUvToPathAndOutput(cachedPath) {
core.setOutput("uv-path", `${cachedPath}${path.sep}uv`); core.setOutput("uv-path", `${cachedPath}${path.sep}uv`);

12
dist/update-known-versions/index.js generated vendored
View File

@@ -62432,6 +62432,8 @@ const node_fs_1 = __nccwpck_require__(3024);
const core = __importStar(__nccwpck_require__(7484)); const core = __importStar(__nccwpck_require__(7484));
const semver = __importStar(__nccwpck_require__(9318)); const semver = __importStar(__nccwpck_require__(9318));
const fetch_1 = __nccwpck_require__(3385); const fetch_1 = __nccwpck_require__(3385);
const node_path_1 = __nccwpck_require__(6760);
const localManifestFile = (0, node_path_1.join)(__dirname, "..", "..", "version-manifest.json");
async function getLatestKnownVersion(manifestUrl) { async function getLatestKnownVersion(manifestUrl) {
const manifestEntries = await getManifestEntries(manifestUrl); const manifestEntries = await getManifestEntries(manifestUrl);
return manifestEntries.reduce((a, b) => semver.gt(a.version, b.version) ? a : b).version; return manifestEntries.reduce((a, b) => semver.gt(a.version, b.version) ? a : b).version;
@@ -62455,7 +62457,7 @@ async function getManifestEntries(manifestUrl) {
} }
else { else {
core.info("manifest-file not provided, reading from local file."); core.info("manifest-file not provided, reading from local file.");
const fileContent = await node_fs_1.promises.readFile("version-manifest.json"); const fileContent = await node_fs_1.promises.readFile(localManifestFile);
data = fileContent.toString(); data = fileContent.toString();
} }
return JSON.parse(data); return JSON.parse(data);
@@ -62840,6 +62842,14 @@ module.exports = require("node:net");
/***/ }), /***/ }),
/***/ 6760:
/***/ ((module) => {
"use strict";
module.exports = require("node:path");
/***/ }),
/***/ 643: /***/ 643:
/***/ ((module) => { /***/ ((module) => {

View File

@@ -7,7 +7,10 @@ import { OWNER, REPO, TOOL_CACHE_NAME } from "../utils/constants";
import type { Architecture, Platform } from "../utils/platforms"; import type { Architecture, Platform } from "../utils/platforms";
import { validateChecksum } from "./checksum/checksum"; import { validateChecksum } from "./checksum/checksum";
import { Octokit } from "../utils/octokit"; import { Octokit } from "../utils/octokit";
import { getDownloadUrl } from "./version-manifest"; import {
getDownloadUrl,
getLatestKnownVersion as getLatestVersionInManifest,
} from "./version-manifest";
export function tryGetFromToolCache( export function tryGetFromToolCache(
arch: Architecture, arch: Architecture,
@@ -127,13 +130,22 @@ function getExtension(platform: Platform): string {
export async function resolveVersion( export async function resolveVersion(
versionInput: string, versionInput: string,
manifestFile: string | undefined,
githubToken: string, githubToken: string,
): Promise<string> { ): Promise<string> {
core.debug(`Resolving version: ${versionInput}`); core.debug(`Resolving version: ${versionInput}`);
const version = let version: string;
if (manifestFile) {
version =
versionInput === "latest"
? await getLatestVersionInManifest(manifestFile)
: versionInput;
} else {
version =
versionInput === "latest" versionInput === "latest"
? await getLatestVersion(githubToken) ? await getLatestVersion(githubToken)
: versionInput; : versionInput;
}
if (tc.isExplicitVersion(version)) { if (tc.isExplicitVersion(version)) {
core.debug(`Version ${version} is an explicit version.`); core.debug(`Version ${version} is an explicit version.`);
return version; return version;

View File

@@ -2,6 +2,9 @@ import { promises as fs } from "node:fs";
import * as core from "@actions/core"; import * as core from "@actions/core";
import * as semver from "semver"; import * as semver from "semver";
import { fetch } from "../utils/fetch"; import { fetch } from "../utils/fetch";
import { join } from "node:path";
const localManifestFile = join(__dirname, "..", "..", "version-manifest.json");
interface ManifestEntry { interface ManifestEntry {
version: string; version: string;
@@ -51,7 +54,7 @@ async function getManifestEntries(
data = await response.text(); data = await response.text();
} else { } else {
core.info("manifest-file not provided, reading from local file."); core.info("manifest-file not provided, reading from local file.");
const fileContent = await fs.readFile("version-manifest.json"); const fileContent = await fs.readFile(localManifestFile);
data = fileContent.toString(); data = fileContent.toString();
} }

View File

@@ -87,7 +87,7 @@ async function setupUv(
checkSum: string | undefined, checkSum: string | undefined,
githubToken: string, githubToken: string,
): Promise<{ uvDir: string; version: string }> { ): Promise<{ uvDir: string; version: string }> {
const resolvedVersion = await determineVersion(); const resolvedVersion = await determineVersion(manifestFile);
const toolCacheResult = tryGetFromToolCache(arch, resolvedVersion); const toolCacheResult = tryGetFromToolCache(arch, resolvedVersion);
if (toolCacheResult.installedPath) { if (toolCacheResult.installedPath) {
core.info(`Found uv in tool-cache for ${toolCacheResult.version}`); core.info(`Found uv in tool-cache for ${toolCacheResult.version}`);
@@ -127,9 +127,11 @@ async function setupUv(
}; };
} }
async function determineVersion(): Promise<string> { async function determineVersion(
manifestFile: string | undefined,
): Promise<string> {
if (versionInput !== "") { if (versionInput !== "") {
return await resolveVersion(versionInput, githubToken); return await resolveVersion(versionInput, manifestFile, githubToken);
} }
const versionFromUvToml = getUvVersionFromConfigFile( const versionFromUvToml = getUvVersionFromConfigFile(
`${workingDirectory}${path.sep}uv.toml`, `${workingDirectory}${path.sep}uv.toml`,
@@ -144,6 +146,7 @@ async function determineVersion(): Promise<string> {
} }
return await resolveVersion( return await resolveVersion(
versionFromUvToml || versionFromPyproject || "latest", versionFromUvToml || versionFromPyproject || "latest",
manifestFile,
githubToken, githubToken,
); );
} }