mirror of
https://github.com/astral-sh/setup-uv.git
synced 2026-01-19 18:22:04 +00:00
Some checks failed
CodeQL / Analyze (TypeScript) (push) Failing after 2s
test / lint (push) Failing after 2s
test / test-default-version (ubuntu-latest) (push) Failing after 2s
test / test-specific-version (map[expected-version:0.1.0 resolution-strategy:lowest version-input:>=0.1.0,<0.2]) (push) Failing after 1s
test / test-uv-no-modify-path (push) Failing after 1s
test / test-specific-version (map[expected-version:0.1.45 resolution-strategy:highest version-input:>=0.1,<0.2]) (push) Failing after 1s
test / test-specific-version (map[expected-version:0.3.0 version-input:0.3.0]) (push) Failing after 1s
test / test-specific-version (map[expected-version:0.3.2 version-input:0.3.2]) (push) Failing after 2s
test / test-specific-version (map[expected-version:0.3.5 version-input:0.3.x]) (push) Failing after 1s
test / test-specific-version (map[expected-version:0.3.5 version-input:0.3]) (push) Failing after 1s
test / test-specific-version (map[expected-version:0.4.25 resolution-strategy:lowest version-input:>=0.4.25,<0.5]) (push) Failing after 1s
test / test-specific-version (map[expected-version:0.4.30 version-input:>=0.4.25,<0.5]) (push) Failing after 1s
test / test-latest-version (>=0.8) (push) Failing after 2s
test / test-latest-version (latest) (push) Failing after 1s
test / test-from-working-directory-version (map[expected-version:0.5.14 working-directory:__tests__/fixtures/pyproject-toml-project]) (push) Failing after 1s
test / test-from-working-directory-version (map[expected-version:0.5.15 working-directory:__tests__/fixtures/uv-toml-project]) (push) Failing after 2s
test / test-version-file-version (map[expected-version:0.5.15 version-file:__tests__/fixtures/.tool-versions]) (push) Failing after 2s
test / test-version-file-version (map[expected-version:0.6.17 version-file:__tests__/fixtures/uv-in-requirements-txt-project/requirements.txt]) (push) Failing after 1s
test / test-version-file-version (map[expected-version:0.8.3 version-file:__tests__/fixtures/uv-in-requirements-hash-txt-project/requirements.txt]) (push) Failing after 1s
test / test-malformed-pyproject-file-fallback (push) Failing after 1s
test / test-checksum (map[checksum:4d9279ad5ca596b1e2d703901d508430eb07564dc4d8837de9e2fca9c90f8ecd os:ubuntu-latest]) (push) Failing after 1s
test / test-with-explicit-token (push) Failing after 1s
test / test-uvx (push) Failing after 1s
test / test-tool-install (ubuntu-latest) (push) Failing after 1s
test / test-python-version (ubuntu-latest) (push) Failing after 1s
test / test-activate-environment (ubuntu-latest) (push) Failing after 1s
test / test-setup-cache (auto, ubuntu-latest) (push) Failing after 1s
test / test-setup-cache (false, ubuntu-latest) (push) Failing after 1s
test / test-setup-cache (true, ubuntu-latest) (push) Failing after 1s
test / test-musl (push) Failing after 5s
test / test-restore-cache-requirements-txt (push) Has been skipped
test / test-setup-cache-requirements-txt (push) Failing after 1s
test / test-setup-cache-dependency-glob (push) Failing after 2s
test / test-restore-cache-dependency-glob (push) Has been skipped
test / test-setup-cache-save-cache-false (push) Failing after 4s
test / test-restore-cache-save-cache-false (push) Has been skipped
test / test-setup-cache-restore-cache-false (push) Failing after 4s
test / test-restore-cache-restore-cache-false (push) Has been skipped
test / test-cache-local (map[expected-cache-dir:/home/runner/work/_temp/setup-uv-cache os:ubuntu-latest]) (push) Failing after 5s
test / test-cache-local-cache-disabled (push) Failing after 5s
test / test-no-python-version (push) Failing after 4s
test / test-custom-manifest-file (push) Failing after 4s
test / test-absolute-path (push) Failing after 3s
test / test-relative-path (push) Failing after 3s
test / test-cache-prune-force (push) Failing after 3s
test / test-cache-dir-from-file (push) Failing after 4s
test / test-cache-python-installs (push) Failing after 4s
test / test-restore-python-installs (push) Has been skipped
test / test-python-install-dir (map[expected-python-dir:/home/runner/work/_temp/uv-python-dir os:ubuntu-latest]) (push) Failing after 5s
Release Drafter / ✏️ Draft release (push) Has been cancelled
test / test-tool-install (macos-latest) (push) Has been cancelled
test / test-tool-install (windows-latest) (push) Has been cancelled
test / test-tilde-expansion-tool-dirs (push) Has been cancelled
test / test-python-version (macos-latest) (push) Has been cancelled
test / test-default-version (macos-14) (push) Has been cancelled
test / test-default-version (macos-latest) (push) Has been cancelled
test / test-default-version (windows-latest) (push) Has been cancelled
test / test-checksum (map[checksum:a70cbfbf3bb5c08b2f84963b4f12c94e08fbb2468ba418a3bfe1066fbe9e7218 os:macos-latest]) (push) Has been cancelled
test / test-tool-install (macos-14) (push) Has been cancelled
test / test-python-version (windows-latest) (push) Has been cancelled
test / test-activate-environment (macos-latest) (push) Has been cancelled
test / test-activate-environment (windows-latest) (push) Has been cancelled
test / test-setup-cache (auto, selfhosted-ubuntu-arm64) (push) Has been cancelled
test / test-setup-cache (auto, windows-latest) (push) Has been cancelled
test / test-setup-cache (false, selfhosted-ubuntu-arm64) (push) Has been cancelled
test / test-setup-cache (false, windows-latest) (push) Has been cancelled
test / test-setup-cache (true, selfhosted-ubuntu-arm64) (push) Has been cancelled
test / test-setup-cache (true, windows-latest) (push) Has been cancelled
test / test-cache-local (map[expected-cache-dir:/home/ubuntu/.cache/uv os:selfhosted-ubuntu-arm64]) (push) Has been cancelled
test / test-cache-local (map[expected-cache-dir:D:\a\_temp\setup-uv-cache os:windows-latest]) (push) Has been cancelled
test / test-setup-cache-local (push) Has been cancelled
test / test-tilde-expansion-cache-local-path (push) Has been cancelled
test / test-tilde-expansion-cache-dependency-glob (push) Has been cancelled
test / test-python-install-dir (map[expected-python-dir:/home/ubuntu/.local/share/uv/python os:selfhosted-ubuntu-arm64]) (push) Has been cancelled
test / test-restore-cache (false, selfhosted-ubuntu-arm64) (push) Has been cancelled
test / test-restore-cache (auto, selfhosted-ubuntu-arm64) (push) Has been cancelled
test / cleanup-tilde-expansion-tests (push) Has been cancelled
test / all-tests-passed (push) Has been cancelled
test / test-python-install-dir (map[expected-python-dir:D:\a\_temp\uv-python-dir os:windows-latest]) (push) Has been cancelled
test / test-restore-cache (false, ubuntu-latest) (push) Has been cancelled
test / test-restore-cache (false, windows-latest) (push) Has been cancelled
test / test-restore-cache (true, selfhosted-ubuntu-arm64) (push) Has been cancelled
test / test-restore-cache (true, ubuntu-latest) (push) Has been cancelled
test / test-restore-cache (true, windows-latest) (push) Has been cancelled
test / test-restore-cache (auto, ubuntu-latest) (push) Has been cancelled
test / test-restore-cache (auto, windows-latest) (push) Has been cancelled
test / test-restore-cache-local (push) Has been cancelled
Update known versions / build (push) Has been cancelled
Adds a new `resolution-strategy` input that allows users to choose between installing the highest (default) or lowest compatible version when resolving version ranges.
203 lines
7.1 KiB
TypeScript
203 lines
7.1 KiB
TypeScript
import path from "node:path";
|
|
import * as core from "@actions/core";
|
|
import { getConfigValueFromTomlFile } from "./config-file";
|
|
|
|
export const workingDirectory = core.getInput("working-directory");
|
|
export const version = core.getInput("version");
|
|
export const versionFile = getVersionFile();
|
|
export const pythonVersion = core.getInput("python-version");
|
|
export const activateEnvironment = core.getBooleanInput("activate-environment");
|
|
export const checkSum = core.getInput("checksum");
|
|
export const enableCache = getEnableCache();
|
|
export const restoreCache = core.getInput("restore-cache") === "true";
|
|
export const saveCache = core.getInput("save-cache") === "true";
|
|
export const cacheSuffix = core.getInput("cache-suffix") || "";
|
|
export const cacheLocalPath = getCacheLocalPath();
|
|
export const cacheDependencyGlob = getCacheDependencyGlob();
|
|
export const pruneCache = core.getInput("prune-cache") === "true";
|
|
export const cachePython = core.getInput("cache-python") === "true";
|
|
export const ignoreNothingToCache =
|
|
core.getInput("ignore-nothing-to-cache") === "true";
|
|
export const ignoreEmptyWorkdir =
|
|
core.getInput("ignore-empty-workdir") === "true";
|
|
export const toolBinDir = getToolBinDir();
|
|
export const toolDir = getToolDir();
|
|
export const pythonDir = getUvPythonDir();
|
|
export const githubToken = core.getInput("github-token");
|
|
export const manifestFile = getManifestFile();
|
|
export const addProblemMatchers =
|
|
core.getInput("add-problem-matchers") === "true";
|
|
export const resolutionStrategy = getResolutionStrategy();
|
|
|
|
function getVersionFile(): string {
|
|
const versionFileInput = core.getInput("version-file");
|
|
if (versionFileInput !== "") {
|
|
const tildeExpanded = expandTilde(versionFileInput);
|
|
return resolveRelativePath(tildeExpanded);
|
|
}
|
|
return versionFileInput;
|
|
}
|
|
|
|
function getEnableCache(): boolean {
|
|
const enableCacheInput = core.getInput("enable-cache");
|
|
if (enableCacheInput === "auto") {
|
|
return process.env.RUNNER_ENVIRONMENT === "github-hosted";
|
|
}
|
|
return enableCacheInput === "true";
|
|
}
|
|
|
|
function getToolBinDir(): string | undefined {
|
|
const toolBinDirInput = core.getInput("tool-bin-dir");
|
|
if (toolBinDirInput !== "") {
|
|
const tildeExpanded = expandTilde(toolBinDirInput);
|
|
return resolveRelativePath(tildeExpanded);
|
|
}
|
|
if (process.platform === "win32") {
|
|
if (process.env.RUNNER_TEMP !== undefined) {
|
|
return `${process.env.RUNNER_TEMP}${path.sep}uv-tool-bin-dir`;
|
|
}
|
|
throw Error(
|
|
"Could not determine UV_TOOL_BIN_DIR. Please make sure RUNNER_TEMP is set or provide the tool-bin-dir input",
|
|
);
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
function getToolDir(): string | undefined {
|
|
const toolDirInput = core.getInput("tool-dir");
|
|
if (toolDirInput !== "") {
|
|
const tildeExpanded = expandTilde(toolDirInput);
|
|
return resolveRelativePath(tildeExpanded);
|
|
}
|
|
if (process.platform === "win32") {
|
|
if (process.env.RUNNER_TEMP !== undefined) {
|
|
return `${process.env.RUNNER_TEMP}${path.sep}uv-tool-dir`;
|
|
}
|
|
throw Error(
|
|
"Could not determine UV_TOOL_DIR. Please make sure RUNNER_TEMP is set or provide the tool-dir input",
|
|
);
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
function getCacheLocalPath(): string {
|
|
const cacheLocalPathInput = core.getInput("cache-local-path");
|
|
if (cacheLocalPathInput !== "") {
|
|
const tildeExpanded = expandTilde(cacheLocalPathInput);
|
|
return resolveRelativePath(tildeExpanded);
|
|
}
|
|
const cacheDirFromConfig = getCacheDirFromConfig();
|
|
if (cacheDirFromConfig !== undefined) {
|
|
return cacheDirFromConfig;
|
|
}
|
|
if (process.env.UV_CACHE_DIR !== undefined) {
|
|
core.info(`UV_CACHE_DIR is already set to ${process.env.UV_CACHE_DIR}`);
|
|
return process.env.UV_CACHE_DIR;
|
|
}
|
|
if (process.env.RUNNER_ENVIRONMENT === "github-hosted") {
|
|
if (process.env.RUNNER_TEMP !== undefined) {
|
|
return `${process.env.RUNNER_TEMP}${path.sep}setup-uv-cache`;
|
|
}
|
|
throw Error(
|
|
"Could not determine UV_CACHE_DIR. Please make sure RUNNER_TEMP is set or provide the cache-local-path input",
|
|
);
|
|
}
|
|
if (process.platform === "win32") {
|
|
return `${process.env.APPDATA}${path.sep}uv${path.sep}cache`;
|
|
}
|
|
return `${process.env.HOME}${path.sep}.cache${path.sep}uv`;
|
|
}
|
|
|
|
function getCacheDirFromConfig(): string | undefined {
|
|
for (const filePath of [versionFile, "uv.toml", "pyproject.toml"]) {
|
|
const resolvedPath = resolveRelativePath(filePath);
|
|
try {
|
|
const cacheDir = getConfigValueFromTomlFile(resolvedPath, "cache-dir");
|
|
if (cacheDir !== undefined) {
|
|
core.info(`Found cache-dir in ${resolvedPath}: ${cacheDir}`);
|
|
return cacheDir;
|
|
}
|
|
} catch (err) {
|
|
const message = (err as Error).message;
|
|
core.warning(`Error while parsing ${filePath}: ${message}`);
|
|
return undefined;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
export function getUvPythonDir(): string {
|
|
if (process.env.UV_PYTHON_INSTALL_DIR !== undefined) {
|
|
core.info(
|
|
`UV_PYTHON_INSTALL_DIR is already set to ${process.env.UV_PYTHON_INSTALL_DIR}`,
|
|
);
|
|
return process.env.UV_PYTHON_INSTALL_DIR;
|
|
}
|
|
if (process.env.RUNNER_ENVIRONMENT !== "github-hosted") {
|
|
if (process.platform === "win32") {
|
|
return `${process.env.APPDATA}${path.sep}uv${path.sep}python`;
|
|
} else {
|
|
return `${process.env.HOME}${path.sep}.local${path.sep}share${path.sep}uv${path.sep}python`;
|
|
}
|
|
}
|
|
if (process.env.RUNNER_TEMP !== undefined) {
|
|
return `${process.env.RUNNER_TEMP}${path.sep}uv-python-dir`;
|
|
}
|
|
throw Error(
|
|
"Could not determine UV_PYTHON_INSTALL_DIR. Please make sure RUNNER_TEMP is set or provide the UV_PYTHON_INSTALL_DIR environment variable",
|
|
);
|
|
}
|
|
|
|
function getCacheDependencyGlob(): string {
|
|
const cacheDependencyGlobInput = core.getInput("cache-dependency-glob");
|
|
if (cacheDependencyGlobInput !== "") {
|
|
return cacheDependencyGlobInput
|
|
.split("\n")
|
|
.map((part) => part.trim())
|
|
.map((part) => expandTilde(part))
|
|
.map((part) => resolveRelativePath(part))
|
|
.join("\n");
|
|
}
|
|
return cacheDependencyGlobInput;
|
|
}
|
|
|
|
function expandTilde(input: string): string {
|
|
if (input.startsWith("~")) {
|
|
return `${process.env.HOME}${input.substring(1)}`;
|
|
}
|
|
return input;
|
|
}
|
|
|
|
function resolveRelativePath(inputPath: string): string {
|
|
const hasNegation = inputPath.startsWith("!");
|
|
const pathWithoutNegation = hasNegation ? inputPath.substring(1) : inputPath;
|
|
|
|
const resolvedPath = path.resolve(workingDirectory, pathWithoutNegation);
|
|
|
|
core.debug(
|
|
`Resolving relative path ${inputPath} to ${hasNegation ? "!" : ""}${resolvedPath}`,
|
|
);
|
|
return hasNegation ? `!${resolvedPath}` : resolvedPath;
|
|
}
|
|
|
|
function getManifestFile(): string | undefined {
|
|
const manifestFileInput = core.getInput("manifest-file");
|
|
if (manifestFileInput !== "") {
|
|
return manifestFileInput;
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
function getResolutionStrategy(): "highest" | "lowest" {
|
|
const resolutionStrategyInput = core.getInput("resolution-strategy");
|
|
if (resolutionStrategyInput === "lowest") {
|
|
return "lowest";
|
|
}
|
|
if (resolutionStrategyInput === "highest" || resolutionStrategyInput === "") {
|
|
return "highest";
|
|
}
|
|
throw new Error(
|
|
`Invalid resolution-strategy: ${resolutionStrategyInput}. Must be 'highest' or 'lowest'.`,
|
|
);
|
|
}
|