mirror of
https://github.com/astral-sh/setup-uv.git
synced 2025-06-17 18:07:48 +00:00
Some checks failed
test / test-specific-version (0.3.0) (push) Successful in 16s
test / test-default-version (ubuntu-latest) (push) Successful in 21s
CodeQL / Analyze (TypeScript) (push) Failing after 32s
test / test-specific-version (0.3) (push) Failing after 26s
test / test-semver-range (ubuntu-latest) (push) Successful in 31s
test / lint (push) Successful in 1m15s
test / test-no-python-version (push) Failing after 14m23s
test / test-cache-local (map[expected-cache-dir:/home/runner/work/_temp/setup-uv-cache os:ubuntu-latest]) (push) Failing after 14m23s
test / test-setup-cache-dependency-glob (push) Failing after 14m23s
test / test-setup-cache-requirements-txt (push) Failing after 14m24s
test / test-setup-cache (true, ubuntu-latest) (push) Failing after 14m25s
test / test-setup-cache (false, ubuntu-latest) (push) Failing after 14m27s
test / test-setup-cache (auto, ubuntu-latest) (push) Failing after 14m28s
test / test-musl (push) Failing after 14m28s
test / test-activate-environment (ubuntu-latest) (push) Failing after 14m30s
test / test-python-version (ubuntu-latest) (push) Failing after 14m31s
test / test-tool-install (ubuntu-latest) (push) Failing after 14m32s
test / test-uvx (push) Failing after 14m33s
test / test-with-explicit-token (push) Failing after 14m34s
test / test-checksum (map[checksum:4d9279ad5ca596b1e2d703901d508430eb07564dc4d8837de9e2fca9c90f8ecd os:ubuntu-latest]) (push) Failing after 14m35s
test / test-uv-file-version (push) Failing after 14m36s
test / test-malformed-pyproject-file-fallback (push) Failing after 14m38s
test / test-pyproject-file-version (push) Failing after 14m39s
test / test-pep440-version (push) Failing after 14m39s
test / test-specific-version (>=0.3.0) (push) Failing after 14m42s
test / test-specific-version (0.3.x) (push) Failing after 14m43s
test / test-specific-version (0.3.2) (push) Failing after 14m44s
Release Drafter / ✏️ Draft release (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-semver-range (selfhosted-ubuntu-arm64) (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-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-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-restore-cache (auto, selfhosted-ubuntu-arm64) (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 (false, selfhosted-ubuntu-arm64) (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-requirements-txt (push) Has been cancelled
test / test-restore-cache-dependency-glob (push) Has been cancelled
test / test-restore-cache-local (push) Has been cancelled
test / cleanup-tilde-expansion-tests (push) Has been cancelled
test / all-tests-passed (push) Has been cancelled
Update known versions / build (push) Has been cancelled
Fix #344
205 lines
5.7 KiB
TypeScript
205 lines
5.7 KiB
TypeScript
import * as core from "@actions/core";
|
|
import * as path from "node:path";
|
|
import {
|
|
downloadVersion,
|
|
tryGetFromToolCache,
|
|
resolveVersion,
|
|
} from "./download/download-version";
|
|
import { restoreCache } from "./cache/restore-cache";
|
|
|
|
import {
|
|
type Architecture,
|
|
getArch,
|
|
getPlatform,
|
|
type Platform,
|
|
} from "./utils/platforms";
|
|
import {
|
|
activateEnvironment as activateEnvironmentInput,
|
|
cacheLocalPath,
|
|
checkSum,
|
|
ignoreEmptyWorkdir,
|
|
enableCache,
|
|
githubToken,
|
|
pythonVersion,
|
|
toolBinDir,
|
|
toolDir,
|
|
version as versionInput,
|
|
workingDirectory,
|
|
serverUrl,
|
|
} from "./utils/inputs";
|
|
import * as exec from "@actions/exec";
|
|
import fs from "node:fs";
|
|
import { getUvVersionFromConfigFile } from "./utils/config-file";
|
|
|
|
async function run(): Promise<void> {
|
|
detectEmptyWorkdir();
|
|
const platform = await getPlatform();
|
|
const arch = getArch();
|
|
|
|
try {
|
|
if (platform === undefined) {
|
|
throw new Error(`Unsupported platform: ${process.platform}`);
|
|
}
|
|
if (arch === undefined) {
|
|
throw new Error(`Unsupported architecture: ${process.arch}`);
|
|
}
|
|
const setupResult = await setupUv(platform, arch, checkSum, githubToken);
|
|
|
|
addToolBinToPath();
|
|
addUvToPathAndOutput(setupResult.uvDir);
|
|
setToolDir();
|
|
setupPython();
|
|
await activateEnvironment();
|
|
addMatchers();
|
|
setCacheDir(cacheLocalPath);
|
|
|
|
core.setOutput("uv-version", setupResult.version);
|
|
core.info(`Successfully installed uv version ${setupResult.version}`);
|
|
|
|
if (enableCache) {
|
|
await restoreCache();
|
|
}
|
|
process.exit(0);
|
|
} catch (err) {
|
|
core.setFailed((err as Error).message);
|
|
}
|
|
}
|
|
|
|
function detectEmptyWorkdir(): void {
|
|
if (fs.readdirSync(".").length === 0) {
|
|
if (ignoreEmptyWorkdir) {
|
|
core.info(
|
|
"Empty workdir detected. Ignoring because ignore-empty-workdir is enabled",
|
|
);
|
|
} else {
|
|
core.warning(
|
|
"Empty workdir detected. This may cause unexpected behavior. You can enable ignore-empty-workdir to mute this warning.",
|
|
);
|
|
}
|
|
}
|
|
}
|
|
|
|
async function setupUv(
|
|
platform: Platform,
|
|
arch: Architecture,
|
|
checkSum: string | undefined,
|
|
githubToken: string,
|
|
): Promise<{ uvDir: string; version: string }> {
|
|
const resolvedVersion = await determineVersion();
|
|
const toolCacheResult = tryGetFromToolCache(arch, resolvedVersion);
|
|
if (toolCacheResult.installedPath) {
|
|
core.info(`Found uv in tool-cache for ${toolCacheResult.version}`);
|
|
return {
|
|
uvDir: toolCacheResult.installedPath,
|
|
version: toolCacheResult.version,
|
|
};
|
|
}
|
|
|
|
const downloadVersionResult = await downloadVersion(
|
|
serverUrl,
|
|
platform,
|
|
arch,
|
|
resolvedVersion,
|
|
checkSum,
|
|
githubToken,
|
|
);
|
|
|
|
return {
|
|
uvDir: downloadVersionResult.cachedToolDir,
|
|
version: downloadVersionResult.version,
|
|
};
|
|
}
|
|
|
|
async function determineVersion(): Promise<string> {
|
|
if (versionInput !== "") {
|
|
return await resolveVersion(versionInput, githubToken);
|
|
}
|
|
const versionFromUvToml = getUvVersionFromConfigFile(
|
|
`${workingDirectory}${path.sep}uv.toml`,
|
|
);
|
|
const versionFromPyproject = getUvVersionFromConfigFile(
|
|
`${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 resolveVersion(
|
|
versionFromUvToml || versionFromPyproject || "latest",
|
|
githubToken,
|
|
);
|
|
}
|
|
|
|
function addUvToPathAndOutput(cachedPath: string): void {
|
|
core.setOutput("uv-path", `${cachedPath}${path.sep}uv`);
|
|
core.setOutput("uvx-path", `${cachedPath}${path.sep}uvx`);
|
|
core.addPath(cachedPath);
|
|
core.info(`Added ${cachedPath} to the path`);
|
|
}
|
|
|
|
function addToolBinToPath(): void {
|
|
if (toolBinDir !== undefined) {
|
|
core.exportVariable("UV_TOOL_BIN_DIR", toolBinDir);
|
|
core.info(`Set UV_TOOL_BIN_DIR to ${toolBinDir}`);
|
|
core.addPath(toolBinDir);
|
|
core.info(`Added ${toolBinDir} to the path`);
|
|
} else {
|
|
if (process.env.XDG_BIN_HOME !== undefined) {
|
|
core.addPath(process.env.XDG_BIN_HOME);
|
|
core.info(`Added ${process.env.XDG_BIN_HOME} to the path`);
|
|
} else if (process.env.XDG_DATA_HOME !== undefined) {
|
|
core.addPath(`${process.env.XDG_DATA_HOME}/../bin`);
|
|
core.info(`Added ${process.env.XDG_DATA_HOME}/../bin to the path`);
|
|
} else {
|
|
core.addPath(`${process.env.HOME}/.local/bin`);
|
|
core.info(`Added ${process.env.HOME}/.local/bin to the path`);
|
|
}
|
|
}
|
|
}
|
|
|
|
function setToolDir(): void {
|
|
if (toolDir !== undefined) {
|
|
core.exportVariable("UV_TOOL_DIR", toolDir);
|
|
core.info(`Set UV_TOOL_DIR to ${toolDir}`);
|
|
}
|
|
}
|
|
|
|
function setupPython(): void {
|
|
if (pythonVersion !== "") {
|
|
core.exportVariable("UV_PYTHON", pythonVersion);
|
|
core.info(`Set UV_PYTHON to ${pythonVersion}`);
|
|
}
|
|
}
|
|
|
|
async function activateEnvironment(): Promise<void> {
|
|
if (activateEnvironmentInput) {
|
|
const execArgs = ["venv", ".venv", "--directory", workingDirectory];
|
|
|
|
core.info("Activating python venv...");
|
|
await exec.exec("uv", execArgs);
|
|
|
|
let venvBinPath = `${workingDirectory}${path.sep}.venv${path.sep}bin`;
|
|
if (process.platform === "win32") {
|
|
venvBinPath = `${workingDirectory}${path.sep}.venv${path.sep}Scripts`;
|
|
}
|
|
core.addPath(path.resolve(venvBinPath));
|
|
core.exportVariable(
|
|
"VIRTUAL_ENV",
|
|
path.resolve(`${workingDirectory}${path.sep}.venv`),
|
|
);
|
|
}
|
|
}
|
|
|
|
function setCacheDir(cacheLocalPath: string): void {
|
|
core.exportVariable("UV_CACHE_DIR", cacheLocalPath);
|
|
core.info(`Set UV_CACHE_DIR to ${cacheLocalPath}`);
|
|
}
|
|
|
|
function addMatchers(): void {
|
|
const matchersPath = path.join(__dirname, `..${path.sep}..`, ".github");
|
|
core.info(`##[add-matcher]${path.join(matchersPath, "python.json")}`);
|
|
}
|
|
|
|
run();
|