mirror of
https://github.com/astral-sh/setup-uv.git
synced 2026-10-01 00:29:51 +00:00
Compare commits
1 Commits
zb/setup-u
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d484374644 |
2
.github/workflows/test.yml
vendored
2
.github/workflows/test.yml
vendored
@@ -27,7 +27,7 @@ jobs:
|
|||||||
- name: Actionlint
|
- name: Actionlint
|
||||||
uses: eifinger/actionlint-action@1fc89649be682d16ec5cf65ea16e269eb88d3982 # v1.10.2
|
uses: eifinger/actionlint-action@1fc89649be682d16ec5cf65ea16e269eb88d3982 # v1.10.2
|
||||||
- name: Run zizmor
|
- name: Run zizmor
|
||||||
uses: zizmorcore/zizmor-action@70fb788f84895a7701f5643d103d587e460b5c99 # v0.6.3
|
uses: zizmorcore/zizmor-action@3dc1ecc9bcb9e94e9b2c709687979e1298497054 # v0.6.2
|
||||||
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
||||||
with:
|
with:
|
||||||
node-version-file: .nvmrc
|
node-version-file: .nvmrc
|
||||||
|
|||||||
23
README.md
23
README.md
@@ -15,7 +15,6 @@ Set up your GitHub Actions workflow with a specific version of [uv](https://docs
|
|||||||
- [Inputs](#inputs)
|
- [Inputs](#inputs)
|
||||||
- [Outputs](#outputs)
|
- [Outputs](#outputs)
|
||||||
- [Python version](#python-version)
|
- [Python version](#python-version)
|
||||||
- [Python architecture](#python-architecture)
|
|
||||||
- [Working directory](#working-directory)
|
- [Working directory](#working-directory)
|
||||||
- [Advanced Configuration](#advanced-configuration)
|
- [Advanced Configuration](#advanced-configuration)
|
||||||
- [How it works](#how-it-works)
|
- [How it works](#how-it-works)
|
||||||
@@ -57,9 +56,6 @@ Have a look under [Advanced Configuration](#advanced-configuration) for detailed
|
|||||||
# The version of Python to set UV_PYTHON to (overrides the Python version from .tool-versions)
|
# The version of Python to set UV_PYTHON to (overrides the Python version from .tool-versions)
|
||||||
python-version: ""
|
python-version: ""
|
||||||
|
|
||||||
# The Python architecture to set UV_PYTHON_ARCH to, e.g., x86_64 or aarch64
|
|
||||||
python-arch: ""
|
|
||||||
|
|
||||||
# Use uv venv to activate a venv ready to be used by later steps
|
# Use uv venv to activate a venv ready to be used by later steps
|
||||||
activate-environment: "false"
|
activate-environment: "false"
|
||||||
|
|
||||||
@@ -197,25 +193,6 @@ jobs:
|
|||||||
run: uv run --frozen pytest
|
run: uv run --frozen pytest
|
||||||
```
|
```
|
||||||
|
|
||||||
### Python architecture
|
|
||||||
|
|
||||||
Use `python-arch` to set `UV_PYTHON_ARCH` for the rest of the job. This selects the Python
|
|
||||||
architecture independently of the version, including versions requested by `.python-version`.
|
|
||||||
An explicit architecture or interpreter path in a Python request takes precedence.
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- uses: astral-sh/setup-uv@main
|
|
||||||
with:
|
|
||||||
python-version: "3.14"
|
|
||||||
python-arch: x86_64
|
|
||||||
- run: uv run --frozen pytest
|
|
||||||
```
|
|
||||||
|
|
||||||
The input overrides an existing `UV_PYTHON_ARCH` value. When it is omitted, the action respects
|
|
||||||
`UV_PYTHON_ARCH` from the environment. Both forms require a uv version that supports the variable;
|
|
||||||
the action reports an error if the installed version does not support it. The selected architecture
|
|
||||||
is included in the [cache key](docs/caching.md#cache-key).
|
|
||||||
|
|
||||||
### Working directory
|
### Working directory
|
||||||
|
|
||||||
You can set the working directory with the `working-directory` input.
|
You can set the working directory with the `working-directory` input.
|
||||||
|
|||||||
66
__tests__/cache/restore-cache.test.ts
vendored
66
__tests__/cache/restore-cache.test.ts
vendored
@@ -1,20 +1,9 @@
|
|||||||
import {
|
import { beforeEach, describe, expect, it, jest } from "@jest/globals";
|
||||||
afterEach,
|
|
||||||
beforeEach,
|
|
||||||
describe,
|
|
||||||
expect,
|
|
||||||
it,
|
|
||||||
jest,
|
|
||||||
} from "@jest/globals";
|
|
||||||
import { createSetupInputs } from "../helpers/setup-inputs";
|
import { createSetupInputs } from "../helpers/setup-inputs";
|
||||||
|
|
||||||
const mockRestoreCache = jest.fn();
|
const mockRestoreCache = jest.fn();
|
||||||
const mockSaveState = jest.fn();
|
const mockSaveState = jest.fn();
|
||||||
const mockSetOutput = jest.fn();
|
const mockSetOutput = jest.fn();
|
||||||
const mockGetArch = jest.fn(() => "x86_64");
|
|
||||||
const mockGetOSNameVersion = jest.fn(() => "ubuntu-24.04");
|
|
||||||
const mockGetPlatform = jest.fn(async () => "unknown-linux-gnu");
|
|
||||||
const ORIGINAL_UV_PYTHON_ARCH = process.env.UV_PYTHON_ARCH;
|
|
||||||
|
|
||||||
jest.unstable_mockModule("@actions/cache", () => ({
|
jest.unstable_mockModule("@actions/cache", () => ({
|
||||||
restoreCache: mockRestoreCache,
|
restoreCache: mockRestoreCache,
|
||||||
@@ -35,9 +24,9 @@ jest.unstable_mockModule("../../src/utils/logging", () => ({
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
jest.unstable_mockModule("../../src/utils/platforms", () => ({
|
jest.unstable_mockModule("../../src/utils/platforms", () => ({
|
||||||
getArch: mockGetArch,
|
getArch: jest.fn(() => "x86_64"),
|
||||||
getOSNameVersion: mockGetOSNameVersion,
|
getOSNameVersion: jest.fn(() => "ubuntu-24.04"),
|
||||||
getPlatform: mockGetPlatform,
|
getPlatform: jest.fn(async () => "unknown-linux-gnu"),
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const { restoreCache } = await import("../../src/cache/restore-cache");
|
const { restoreCache } = await import("../../src/cache/restore-cache");
|
||||||
@@ -49,19 +38,7 @@ function cacheKeyOutput(): string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
delete process.env.UV_PYTHON_ARCH;
|
|
||||||
jest.clearAllMocks();
|
jest.clearAllMocks();
|
||||||
mockGetArch.mockReturnValue("x86_64");
|
|
||||||
mockGetOSNameVersion.mockReturnValue("ubuntu-24.04");
|
|
||||||
mockGetPlatform.mockResolvedValue("unknown-linux-gnu");
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
if (ORIGINAL_UV_PYTHON_ARCH === undefined) {
|
|
||||||
delete process.env.UV_PYTHON_ARCH;
|
|
||||||
} else {
|
|
||||||
process.env.UV_PYTHON_ARCH = ORIGINAL_UV_PYTHON_ARCH;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("restoreCache", () => {
|
describe("restoreCache", () => {
|
||||||
@@ -94,39 +71,4 @@ describe("restoreCache", () => {
|
|||||||
"setup-uv-2-x86_64-unknown-linux-gnu-ubuntu-24.04-3.11-dependencyhash-tests-3.11",
|
"setup-uv-2-x86_64-unknown-linux-gnu-ubuntu-24.04-3.11-dependencyhash-tests-3.11",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("includes an inherited Python architecture in the cache key", async () => {
|
|
||||||
process.env.UV_PYTHON_ARCH = "aarch64";
|
|
||||||
|
|
||||||
await restoreCache(createSetupInputs(), "3.14");
|
|
||||||
|
|
||||||
expect(cacheKeyOutput()).toContain("-3.14-python-aarch64-");
|
|
||||||
});
|
|
||||||
|
|
||||||
it.each(["aarch64", "x86_64"])(
|
|
||||||
"separates %s Python caches on a Windows ARM64 runner",
|
|
||||||
async (pythonArch) => {
|
|
||||||
mockGetArch.mockReturnValue("aarch64");
|
|
||||||
mockGetOSNameVersion.mockReturnValue("windows-11");
|
|
||||||
mockGetPlatform.mockResolvedValue("pc-windows-msvc");
|
|
||||||
const inputs = createSetupInputs({
|
|
||||||
cachePython: true,
|
|
||||||
pythonArch,
|
|
||||||
restoreCache: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
await restoreCache(inputs, "3.14");
|
|
||||||
|
|
||||||
const cacheKey = `setup-uv-2-aarch64-pc-windows-msvc-windows-11-3.14-python-${pythonArch}-py-dependencyhash`;
|
|
||||||
expect(cacheKeyOutput()).toBe(cacheKey);
|
|
||||||
expect(mockRestoreCache).toHaveBeenCalledWith(
|
|
||||||
[inputs.cacheLocalPath?.path],
|
|
||||||
cacheKey,
|
|
||||||
);
|
|
||||||
expect(mockRestoreCache).toHaveBeenCalledWith(
|
|
||||||
[inputs.pythonDir],
|
|
||||||
`${cacheKey}-python`,
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -21,7 +21,6 @@ export function createSetupInputs(
|
|||||||
ignoreNothingToCache: false,
|
ignoreNothingToCache: false,
|
||||||
noProject: false,
|
noProject: false,
|
||||||
pruneCache: false,
|
pruneCache: false,
|
||||||
pythonArch: "",
|
|
||||||
pythonDir: "/tmp/uv-python-dir",
|
pythonDir: "/tmp/uv-python-dir",
|
||||||
pythonVersion: "",
|
pythonVersion: "",
|
||||||
quiet: false,
|
quiet: false,
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ const ORIGINAL_RUNNER_ENVIRONMENT = process.env.RUNNER_ENVIRONMENT;
|
|||||||
const ORIGINAL_RUNNER_TEMP = process.env.RUNNER_TEMP;
|
const ORIGINAL_RUNNER_TEMP = process.env.RUNNER_TEMP;
|
||||||
const ORIGINAL_UV_CACHE_DIR = process.env.UV_CACHE_DIR;
|
const ORIGINAL_UV_CACHE_DIR = process.env.UV_CACHE_DIR;
|
||||||
const ORIGINAL_UV_PYTHON = process.env.UV_PYTHON;
|
const ORIGINAL_UV_PYTHON = process.env.UV_PYTHON;
|
||||||
const ORIGINAL_UV_PYTHON_ARCH = process.env.UV_PYTHON_ARCH;
|
|
||||||
const ORIGINAL_UV_PYTHON_INSTALL_DIR = process.env.UV_PYTHON_INSTALL_DIR;
|
const ORIGINAL_UV_PYTHON_INSTALL_DIR = process.env.UV_PYTHON_INSTALL_DIR;
|
||||||
|
|
||||||
const mockDebug = jest.fn();
|
const mockDebug = jest.fn();
|
||||||
@@ -38,9 +37,7 @@ jest.unstable_mockModule("@actions/core", () => ({
|
|||||||
warning: mockWarning,
|
warning: mockWarning,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const { CacheLocalSource, loadInputs, resolvePythonArch } = await import(
|
const { CacheLocalSource, loadInputs } = await import("../../src/utils/inputs");
|
||||||
"../../src/utils/inputs"
|
|
||||||
);
|
|
||||||
|
|
||||||
function createTempProject(files: Record<string, string> = {}): string {
|
function createTempProject(files: Record<string, string> = {}): string {
|
||||||
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "setup-uv-inputs-test-"));
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "setup-uv-inputs-test-"));
|
||||||
@@ -65,7 +62,6 @@ function resetEnvironment(): void {
|
|||||||
delete process.env.RUNNER_TEMP;
|
delete process.env.RUNNER_TEMP;
|
||||||
delete process.env.UV_CACHE_DIR;
|
delete process.env.UV_CACHE_DIR;
|
||||||
delete process.env.UV_PYTHON;
|
delete process.env.UV_PYTHON;
|
||||||
delete process.env.UV_PYTHON_ARCH;
|
|
||||||
delete process.env.UV_PYTHON_INSTALL_DIR;
|
delete process.env.UV_PYTHON_INSTALL_DIR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,11 +77,6 @@ function restoreEnvironment(): void {
|
|||||||
process.env.RUNNER_TEMP = ORIGINAL_RUNNER_TEMP;
|
process.env.RUNNER_TEMP = ORIGINAL_RUNNER_TEMP;
|
||||||
process.env.UV_CACHE_DIR = ORIGINAL_UV_CACHE_DIR;
|
process.env.UV_CACHE_DIR = ORIGINAL_UV_CACHE_DIR;
|
||||||
process.env.UV_PYTHON = ORIGINAL_UV_PYTHON;
|
process.env.UV_PYTHON = ORIGINAL_UV_PYTHON;
|
||||||
if (ORIGINAL_UV_PYTHON_ARCH === undefined) {
|
|
||||||
delete process.env.UV_PYTHON_ARCH;
|
|
||||||
} else {
|
|
||||||
process.env.UV_PYTHON_ARCH = ORIGINAL_UV_PYTHON_ARCH;
|
|
||||||
}
|
|
||||||
process.env.UV_PYTHON_INSTALL_DIR = ORIGINAL_UV_PYTHON_INSTALL_DIR;
|
process.env.UV_PYTHON_INSTALL_DIR = ORIGINAL_UV_PYTHON_INSTALL_DIR;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,7 +98,6 @@ describe("loadInputs", () => {
|
|||||||
source: CacheLocalSource.Default,
|
source: CacheLocalSource.Default,
|
||||||
});
|
});
|
||||||
expect(inputs.pythonDir).toBe("/runner-temp/uv-python-dir");
|
expect(inputs.pythonDir).toBe("/runner-temp/uv-python-dir");
|
||||||
expect(inputs.pythonArch).toBe("");
|
|
||||||
expect(inputs.venvPath).toBe("/workspace/.venv");
|
expect(inputs.venvPath).toBe("/workspace/.venv");
|
||||||
expect(inputs.manifestFile).toBeUndefined();
|
expect(inputs.manifestFile).toBeUndefined();
|
||||||
expect(inputs.resolutionStrategy).toBe("highest");
|
expect(inputs.resolutionStrategy).toBe("highest");
|
||||||
@@ -159,28 +149,6 @@ describe("loadInputs", () => {
|
|||||||
expect(inputs.pythonVersion).toBe("");
|
expect(inputs.pythonVersion).toBe("");
|
||||||
});
|
});
|
||||||
|
|
||||||
it("prefers the python-arch input over UV_PYTHON_ARCH", () => {
|
|
||||||
mockInputs["working-directory"] = "/workspace";
|
|
||||||
mockInputs["python-arch"] = "x86_64";
|
|
||||||
process.env.UV_PYTHON_ARCH = "aarch64";
|
|
||||||
|
|
||||||
const inputs = loadInputs();
|
|
||||||
expect(inputs.pythonArch).toBe("x86_64");
|
|
||||||
expect(resolvePythonArch(inputs.pythonArch)).toBe("x86_64");
|
|
||||||
});
|
|
||||||
|
|
||||||
it.each(["aarch64", "x86_64_v3", ""])(
|
|
||||||
"uses UV_PYTHON_ARCH when python-arch is omitted: %s",
|
|
||||||
(pythonArch) => {
|
|
||||||
mockInputs["working-directory"] = "/workspace";
|
|
||||||
process.env.UV_PYTHON_ARCH = pythonArch;
|
|
||||||
|
|
||||||
const inputs = loadInputs();
|
|
||||||
expect(inputs.pythonArch).toBe("");
|
|
||||||
expect(resolvePythonArch(inputs.pythonArch)).toBe(pythonArch);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
it.each(["pull_request_target", "workflow_run", "release"])(
|
it.each(["pull_request_target", "workflow_run", "release"])(
|
||||||
"disables automatic caching for the %s event",
|
"disables automatic caching for the %s event",
|
||||||
(eventName) => {
|
(eventName) => {
|
||||||
|
|||||||
@@ -1,152 +0,0 @@
|
|||||||
import { promisify } from "node:util";
|
|
||||||
import {
|
|
||||||
afterEach,
|
|
||||||
beforeEach,
|
|
||||||
describe,
|
|
||||||
expect,
|
|
||||||
it,
|
|
||||||
jest,
|
|
||||||
} from "@jest/globals";
|
|
||||||
|
|
||||||
const ORIGINAL_UV_PYTHON_ARCH = process.env.UV_PYTHON_ARCH;
|
|
||||||
|
|
||||||
const mockExecFile =
|
|
||||||
jest.fn<
|
|
||||||
(...args: unknown[]) => Promise<{
|
|
||||||
stdout: string;
|
|
||||||
stderr: string;
|
|
||||||
}>
|
|
||||||
>();
|
|
||||||
const mockExportVariable = jest.fn();
|
|
||||||
|
|
||||||
jest.unstable_mockModule("node:child_process", () => ({
|
|
||||||
execFile: Object.assign(mockExecFile, { [promisify.custom]: mockExecFile }),
|
|
||||||
}));
|
|
||||||
jest.unstable_mockModule("@actions/core", () => ({
|
|
||||||
exportVariable: mockExportVariable,
|
|
||||||
}));
|
|
||||||
jest.unstable_mockModule("../../src/utils/logging", () => ({
|
|
||||||
info: jest.fn(),
|
|
||||||
}));
|
|
||||||
|
|
||||||
const { setupPythonArch } = await import("../../src/utils/python-arch");
|
|
||||||
|
|
||||||
const supportedProbe = Object.assign(new Error("uv exited with code 2"), {
|
|
||||||
code: 2,
|
|
||||||
stderr:
|
|
||||||
"error: Failed to parse environment variable `UV_PYTHON_ARCH` with invalid value `setup-uv-probe`: Unknown architecture: setup-uv-probe\n",
|
|
||||||
});
|
|
||||||
const success = { stderr: "", stdout: "/cache\n" };
|
|
||||||
|
|
||||||
beforeEach(() => {
|
|
||||||
delete process.env.UV_PYTHON_ARCH;
|
|
||||||
jest.clearAllMocks();
|
|
||||||
mockExecFile
|
|
||||||
.mockReset()
|
|
||||||
.mockRejectedValueOnce(supportedProbe)
|
|
||||||
.mockResolvedValueOnce(success);
|
|
||||||
});
|
|
||||||
|
|
||||||
afterEach(() => {
|
|
||||||
if (ORIGINAL_UV_PYTHON_ARCH === undefined) {
|
|
||||||
delete process.env.UV_PYTHON_ARCH;
|
|
||||||
} else {
|
|
||||||
process.env.UV_PYTHON_ARCH = ORIGINAL_UV_PYTHON_ARCH;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
describe("setupPythonArch", () => {
|
|
||||||
it("leaves Python selection alone without an architecture", async () => {
|
|
||||||
await setupPythonArch("/tools/uv", "");
|
|
||||||
|
|
||||||
expect(mockExecFile).not.toHaveBeenCalled();
|
|
||||||
expect(mockExportVariable).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("validates an inherited architecture without exporting it", async () => {
|
|
||||||
process.env.UV_PYTHON_ARCH = "aarch64";
|
|
||||||
|
|
||||||
await setupPythonArch("/tools/uv", "");
|
|
||||||
|
|
||||||
expect(mockExecFile).toHaveBeenNthCalledWith(
|
|
||||||
2,
|
|
||||||
"/tools/uv",
|
|
||||||
["--no-config", "cache", "dir"],
|
|
||||||
expect.objectContaining({
|
|
||||||
env: expect.objectContaining({ UV_PYTHON_ARCH: "aarch64" }),
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
expect(mockExportVariable).not.toHaveBeenCalled();
|
|
||||||
expect(process.env.UV_PYTHON_ARCH).toBe("aarch64");
|
|
||||||
});
|
|
||||||
|
|
||||||
it.each(["/runner temp/uv", "C:\\runner temp\\uv.exe"])(
|
|
||||||
"validates and exports the architecture using the installed uv: %s",
|
|
||||||
async (uvPath) => {
|
|
||||||
await setupPythonArch(uvPath, "x86_64");
|
|
||||||
|
|
||||||
expect(mockExecFile).toHaveBeenNthCalledWith(
|
|
||||||
1,
|
|
||||||
uvPath,
|
|
||||||
["--no-config", "cache", "dir"],
|
|
||||||
expect.objectContaining({
|
|
||||||
encoding: "utf8",
|
|
||||||
env: expect.objectContaining({ UV_PYTHON_ARCH: "setup-uv-probe" }),
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
expect(mockExecFile).toHaveBeenNthCalledWith(
|
|
||||||
2,
|
|
||||||
uvPath,
|
|
||||||
["--no-config", "cache", "dir"],
|
|
||||||
expect.objectContaining({
|
|
||||||
env: expect.objectContaining({ UV_PYTHON_ARCH: "x86_64" }),
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
expect(mockExportVariable).toHaveBeenCalledWith(
|
|
||||||
"UV_PYTHON_ARCH",
|
|
||||||
"x86_64",
|
|
||||||
);
|
|
||||||
},
|
|
||||||
);
|
|
||||||
|
|
||||||
it("rejects uv versions that ignore UV_PYTHON_ARCH", async () => {
|
|
||||||
mockExecFile.mockReset().mockResolvedValue(success);
|
|
||||||
|
|
||||||
await expect(setupPythonArch("/tools/uv", "x86_64")).rejects.toThrow(
|
|
||||||
"The installed version of uv does not support UV_PYTHON_ARCH",
|
|
||||||
);
|
|
||||||
expect(mockExecFile).toHaveBeenCalledTimes(1);
|
|
||||||
expect(mockExportVariable).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("reports unexpected probe failures", async () => {
|
|
||||||
mockExecFile.mockReset().mockRejectedValue(
|
|
||||||
Object.assign(new Error("uv exited with code 2"), {
|
|
||||||
code: 2,
|
|
||||||
stderr: "error: unrelated configuration error\n",
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await expect(setupPythonArch("/tools/uv", "x86_64")).rejects.toThrow(
|
|
||||||
"Failed to check uv's support for UV_PYTHON_ARCH: error: unrelated configuration error",
|
|
||||||
);
|
|
||||||
expect(mockExportVariable).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
|
|
||||||
it("reports invalid architectures before exporting them", async () => {
|
|
||||||
mockExecFile
|
|
||||||
.mockReset()
|
|
||||||
.mockRejectedValueOnce(supportedProbe)
|
|
||||||
.mockRejectedValueOnce(
|
|
||||||
Object.assign(new Error("uv exited with code 2"), {
|
|
||||||
code: 2,
|
|
||||||
stderr: "error: Unknown architecture: invalid\n",
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
|
|
||||||
await expect(setupPythonArch("/tools/uv", "invalid")).rejects.toThrow(
|
|
||||||
"Failed to set Python architecture to invalid: error: Unknown architecture: invalid",
|
|
||||||
);
|
|
||||||
expect(mockExportVariable).not.toHaveBeenCalled();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
@@ -7,8 +7,6 @@ inputs:
|
|||||||
type: string
|
type: string
|
||||||
python-version:
|
python-version:
|
||||||
type: string
|
type: string
|
||||||
python-arch:
|
|
||||||
type: string
|
|
||||||
activate-environment:
|
activate-environment:
|
||||||
type: boolean
|
type: boolean
|
||||||
venv-path:
|
venv-path:
|
||||||
|
|||||||
@@ -12,9 +12,6 @@ inputs:
|
|||||||
python-version:
|
python-version:
|
||||||
description: "The version of Python to set UV_PYTHON to. Overrides the Python version from .tool-versions."
|
description: "The version of Python to set UV_PYTHON to. Overrides the Python version from .tool-versions."
|
||||||
required: false
|
required: false
|
||||||
python-arch:
|
|
||||||
description: "The Python architecture to set UV_PYTHON_ARCH to, e.g., x86_64 or aarch64. Overrides UV_PYTHON_ARCH."
|
|
||||||
required: false
|
|
||||||
activate-environment:
|
activate-environment:
|
||||||
description: "Use uv venv to activate a venv ready to be used by later steps. "
|
description: "Use uv venv to activate a venv ready to be used by later steps. "
|
||||||
default: "false"
|
default: "false"
|
||||||
|
|||||||
20
dist/save-cache/index.cjs
generated
vendored
20
dist/save-cache/index.cjs
generated
vendored
@@ -63714,6 +63714,15 @@ function info2(msg) {
|
|||||||
}
|
}
|
||||||
var warning2 = warning;
|
var warning2 = warning;
|
||||||
|
|
||||||
|
// src/cache/restore-cache.ts
|
||||||
|
var STATE_CACHE_KEY = "cache-key";
|
||||||
|
var STATE_CACHE_MATCHED_KEY = "cache-matched-key";
|
||||||
|
var STATE_PYTHON_CACHE_MATCHED_KEY = "python-cache-matched-key";
|
||||||
|
|
||||||
|
// src/utils/constants.ts
|
||||||
|
var STATE_UV_PATH = "uv-path";
|
||||||
|
var STATE_UV_VERSION = "uv-version";
|
||||||
|
|
||||||
// src/utils/inputs.ts
|
// src/utils/inputs.ts
|
||||||
var import_node_fs4 = __toESM(require("node:fs"), 1);
|
var import_node_fs4 = __toESM(require("node:fs"), 1);
|
||||||
var import_node_path = __toESM(require("node:path"), 1);
|
var import_node_path = __toESM(require("node:path"), 1);
|
||||||
@@ -64438,7 +64447,6 @@ function loadInputs() {
|
|||||||
const version3 = getInput("version");
|
const version3 = getInput("version");
|
||||||
const versionFile = getVersionFile(workingDirectory);
|
const versionFile = getVersionFile(workingDirectory);
|
||||||
const pythonVersion = getPythonVersion(versionFile);
|
const pythonVersion = getPythonVersion(versionFile);
|
||||||
const pythonArch = getInput("python-arch");
|
|
||||||
const activateEnvironment = getBooleanInput("activate-environment");
|
const activateEnvironment = getBooleanInput("activate-environment");
|
||||||
const noProject = getBooleanInput("no-project");
|
const noProject = getBooleanInput("no-project");
|
||||||
const venvPath = getVenvPath(workingDirectory, activateEnvironment);
|
const venvPath = getVenvPath(workingDirectory, activateEnvironment);
|
||||||
@@ -64482,7 +64490,6 @@ function loadInputs() {
|
|||||||
manifestFile,
|
manifestFile,
|
||||||
noProject,
|
noProject,
|
||||||
pruneCache: pruneCache2,
|
pruneCache: pruneCache2,
|
||||||
pythonArch,
|
|
||||||
pythonDir,
|
pythonDir,
|
||||||
pythonVersion,
|
pythonVersion,
|
||||||
quiet: quiet2,
|
quiet: quiet2,
|
||||||
@@ -64731,15 +64738,6 @@ function getResolutionStrategy() {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// src/cache/restore-cache.ts
|
|
||||||
var STATE_CACHE_KEY = "cache-key";
|
|
||||||
var STATE_CACHE_MATCHED_KEY = "cache-matched-key";
|
|
||||||
var STATE_PYTHON_CACHE_MATCHED_KEY = "python-cache-matched-key";
|
|
||||||
|
|
||||||
// src/utils/constants.ts
|
|
||||||
var STATE_UV_PATH = "uv-path";
|
|
||||||
var STATE_UV_VERSION = "uv-version";
|
|
||||||
|
|
||||||
// src/save-cache.ts
|
// src/save-cache.ts
|
||||||
function formatUnexpectedFailure(error2) {
|
function formatUnexpectedFailure(error2) {
|
||||||
if (error2 instanceof Error) {
|
if (error2 instanceof Error) {
|
||||||
|
|||||||
2249
dist/setup/index.cjs
generated
vendored
2249
dist/setup/index.cjs
generated
vendored
File diff suppressed because it is too large
Load Diff
18
dist/update-known-checksums/index.cjs
generated
vendored
18
dist/update-known-checksums/index.cjs
generated
vendored
@@ -47182,24 +47182,6 @@ var semver = __toESM(require_semver(), 1);
|
|||||||
|
|
||||||
// src/download/checksum/known-checksums.json
|
// src/download/checksum/known-checksums.json
|
||||||
var known_checksums_default = {
|
var known_checksums_default = {
|
||||||
"aarch64-apple-darwin-0.12.20": "848fdeb602ff1a1baacd4f6c8b7bdc6cf1ad026a6d9cf59475fda17c179743ca",
|
|
||||||
"aarch64-pc-windows-msvc-0.12.20": "b6bd9218855591742ffd3b00fcf2044b4d2fb6446b6a3545e0dfee447e950388",
|
|
||||||
"aarch64-unknown-linux-gnu-0.12.20": "8a7aad7bc76a2fae5151566ff3e43eacce0b2a113d5e4de3e4afe3e58fa2441e",
|
|
||||||
"aarch64-unknown-linux-musl-0.12.20": "94bb13feeebc6b59a4124016c957cdc9ee406d1476ce2b2ce2991e95b8e820b7",
|
|
||||||
"arm-unknown-linux-musleabihf-0.12.20": "6aeef64cf07b43135d6b1c20bd57809f2d965d0f8a2d5602230d5d55b8245477",
|
|
||||||
"armv7-unknown-linux-gnueabihf-0.12.20": "e1c53318608448ad3b8e7f2e9b069936730a6e7b47831ba5446e4b4f436ee715",
|
|
||||||
"armv7-unknown-linux-musleabihf-0.12.20": "a4c3a0e12e5489f092c93b232ddc4a811a6ea9a03f447f91f88e96867c0bac8d",
|
|
||||||
"i686-pc-windows-msvc-0.12.20": "1a372c273370ae9a7e9aa84020ce91fc1d9ebecbd287c3447e7e99cada0b14f3",
|
|
||||||
"i686-unknown-linux-gnu-0.12.20": "f1e83cc88970ed799b507a8392152d19916dfa0b6c9ae9c8145742035a40d5cb",
|
|
||||||
"i686-unknown-linux-musl-0.12.20": "11d541dd32dd779adbdfef69fe30d7d325036f50d394d3f260a0042998e05499",
|
|
||||||
"powerpc64le-unknown-linux-gnu-0.12.20": "39224a5bfc21a8041afc0315e5d47c86acecf4e669944564950996b516fb5987",
|
|
||||||
"riscv64gc-unknown-linux-gnu-0.12.20": "5cb9df36ca64fb72673c59a77b955b50f3bb907689a98d1d8d640aa3e71f2660",
|
|
||||||
"riscv64gc-unknown-linux-musl-0.12.20": "360e91a317a27bd33978577c57b6f3ed778bdfe8c30c9b613e46fdc33bf8aee8",
|
|
||||||
"s390x-unknown-linux-gnu-0.12.20": "25485439b52cb029afa724c442418ca08a53122100f8cce68ccceb88323ccde2",
|
|
||||||
"x86_64-apple-darwin-0.12.20": "ac54283d211fd77cdc152b67606dbaf6406ff4ab03f3af4ae99468fa8e887141",
|
|
||||||
"x86_64-pc-windows-msvc-0.12.20": "95f9bc30fbb3574d276e28ac4a6de932d25153645853d13da8c21eec3bc88d06",
|
|
||||||
"x86_64-unknown-linux-gnu-0.12.20": "6590717592ace991ff83a63fef799e3ad9d33ecc8f96c5d6bdd732496e79337f",
|
|
||||||
"x86_64-unknown-linux-musl-0.12.20": "14114d66a094f1907af0fcbc863f34226bbb7f5e430e13dce6676ba40dcc6891",
|
|
||||||
"aarch64-apple-darwin-0.12.19": "a9a8df1eedeb192f2e47e40e2faabfb387db4b850209118786d42f89dde3e0ba",
|
"aarch64-apple-darwin-0.12.19": "a9a8df1eedeb192f2e47e40e2faabfb387db4b850209118786d42f89dde3e0ba",
|
||||||
"aarch64-pc-windows-msvc-0.12.19": "115b54cb823bc48260670f5782001add6067ac8d98d18c8263a833704e287de9",
|
"aarch64-pc-windows-msvc-0.12.19": "115b54cb823bc48260670f5782001add6067ac8d98d18c8263a833704e287de9",
|
||||||
"aarch64-unknown-linux-gnu-0.12.19": "0804e9b164c64b6914182d5920c08551958a095986f10a3731056df701126436",
|
"aarch64-unknown-linux-gnu-0.12.19": "0804e9b164c64b6914182d5920c08551958a095986f10a3731056df701126436",
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ The cache key is automatically generated based on:
|
|||||||
`pc-windows-msvc`)
|
`pc-windows-msvc`)
|
||||||
- **OS version**: OS name and version (e.g., `ubuntu-22.04`, `macos-14`, `windows-2022`)
|
- **OS version**: OS name and version (e.g., `ubuntu-22.04`, `macos-14`, `windows-2022`)
|
||||||
- **Python version**: The Python version in use
|
- **Python version**: The Python version in use
|
||||||
- **Python architecture**: The architecture selected by `python-arch` or `UV_PYTHON_ARCH`, when set
|
|
||||||
- **Cache options**: Whether pruning and Python caching are enabled
|
- **Cache options**: Whether pruning and Python caching are enabled
|
||||||
- **Dependency hash**: Hash of files matching `cache-dependency-glob`
|
- **Dependency hash**: Hash of files matching `cache-dependency-glob`
|
||||||
- **Suffix**: Optional `cache-suffix` if provided
|
- **Suffix**: Optional `cache-suffix` if provided
|
||||||
|
|||||||
@@ -144,7 +144,6 @@ If you want to ignore this, set the `ignore-empty-workdir` input to `true`.
|
|||||||
This action sets several environment variables that influence uv's behavior and can be used by subsequent steps:
|
This action sets several environment variables that influence uv's behavior and can be used by subsequent steps:
|
||||||
|
|
||||||
- `UV_PYTHON`: Set when `python-version` is specified or the selected `.tool-versions` file contains a supported `python` entry. Controls which Python version uv uses.
|
- `UV_PYTHON`: Set when `python-version` is specified or the selected `.tool-versions` file contains a supported `python` entry. Controls which Python version uv uses.
|
||||||
- `UV_PYTHON_ARCH`: Set when `python-arch` is specified. Controls the architecture of Python requests that do not specify one.
|
|
||||||
- `UV_CACHE_DIR`: Set when caching is enabled (unless already configured in uv config files). Controls where uv stores its cache.
|
- `UV_CACHE_DIR`: Set when caching is enabled (unless already configured in uv config files). Controls where uv stores its cache.
|
||||||
- `UV_TOOL_DIR`: Set when `tool-dir` input is specified. Controls where uv installs tool environments.
|
- `UV_TOOL_DIR`: Set when `tool-dir` input is specified. Controls where uv installs tool environments.
|
||||||
- `UV_TOOL_BIN_DIR`: Set when `tool-bin-dir` input is specified. Controls where uv installs tool binaries.
|
- `UV_TOOL_BIN_DIR`: Set when `tool-bin-dir` input is specified. Controls where uv installs tool binaries.
|
||||||
@@ -156,7 +155,6 @@ This action sets several environment variables that influence uv's behavior and
|
|||||||
- `UV_NO_MODIFY_PATH`: If set, prevents the action from modifying PATH. Cannot be used with `activate-environment`.
|
- `UV_NO_MODIFY_PATH`: If set, prevents the action from modifying PATH. Cannot be used with `activate-environment`.
|
||||||
- `UV_CACHE_DIR`: If already set, the action will respect it instead of setting its own cache directory.
|
- `UV_CACHE_DIR`: If already set, the action will respect it instead of setting its own cache directory.
|
||||||
- `UV_PYTHON`: If already set and `python-version` is not specified, the action will respect it instead of using the `python` entry from `.tool-versions`.
|
- `UV_PYTHON`: If already set and `python-version` is not specified, the action will respect it instead of using the `python` entry from `.tool-versions`.
|
||||||
- `UV_PYTHON_ARCH`: If already set and `python-arch` is not specified, the action will use it and include it in the cache key. Requires a uv version that supports `UV_PYTHON_ARCH`.
|
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- name: Example using environment variables
|
- name: Example using environment variables
|
||||||
|
|||||||
3308
package-lock.json
generated
3308
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -55,7 +55,7 @@
|
|||||||
"@types/semver": "^7.8.0",
|
"@types/semver": "^7.8.0",
|
||||||
"@vercel/ncc": "^0.45.0",
|
"@vercel/ncc": "^0.45.0",
|
||||||
"esbuild": "^0.28.2",
|
"esbuild": "^0.28.2",
|
||||||
"jest": "^30.4.2",
|
"jest": "^30.5.0",
|
||||||
"js-yaml": "^5.3.0",
|
"js-yaml": "^5.3.0",
|
||||||
"ts-jest": "^29.4.11",
|
"ts-jest": "^29.4.11",
|
||||||
"typescript": "^6.0.3"
|
"typescript": "^6.0.3"
|
||||||
|
|||||||
8
src/cache/restore-cache.ts
vendored
8
src/cache/restore-cache.ts
vendored
@@ -1,7 +1,7 @@
|
|||||||
import * as cache from "@actions/cache";
|
import * as cache from "@actions/cache";
|
||||||
import * as core from "@actions/core";
|
import * as core from "@actions/core";
|
||||||
import { hashFiles } from "../hash/hash-files";
|
import { hashFiles } from "../hash/hash-files";
|
||||||
import { resolvePythonArch, type SetupInputs } from "../utils/inputs";
|
import type { SetupInputs } from "../utils/inputs";
|
||||||
import * as log from "../utils/logging";
|
import * as log from "../utils/logging";
|
||||||
import { getArch, getOSNameVersion, getPlatform } from "../utils/platforms";
|
import { getArch, getOSNameVersion, getPlatform } from "../utils/platforms";
|
||||||
|
|
||||||
@@ -98,15 +98,11 @@ async function computeKeys(
|
|||||||
? `-${encodeURIComponent(inputs.cacheSuffix)}`
|
? `-${encodeURIComponent(inputs.cacheSuffix)}`
|
||||||
: "";
|
: "";
|
||||||
const version = encodeURIComponent(pythonVersion ?? "unknown");
|
const version = encodeURIComponent(pythonVersion ?? "unknown");
|
||||||
const pythonArch = resolvePythonArch(inputs.pythonArch);
|
|
||||||
const pythonArchKey = pythonArch
|
|
||||||
? `-python-${encodeURIComponent(pythonArch)}`
|
|
||||||
: "";
|
|
||||||
const platform = await getPlatform();
|
const platform = await getPlatform();
|
||||||
const osNameVersion = getOSNameVersion();
|
const osNameVersion = getOSNameVersion();
|
||||||
const pruned = inputs.pruneCache ? "-pruned" : "";
|
const pruned = inputs.pruneCache ? "-pruned" : "";
|
||||||
const python = inputs.cachePython ? "-py" : "";
|
const python = inputs.cachePython ? "-py" : "";
|
||||||
return `setup-uv-${CACHE_VERSION}-${getArch()}-${platform}-${osNameVersion}-${version}${pythonArchKey}${pruned}${python}${cacheDependencyPathHash}${suffix}`;
|
return `setup-uv-${CACHE_VERSION}-${getArch()}-${platform}-${osNameVersion}-${version}${pruned}${python}${cacheDependencyPathHash}${suffix}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleMatchResult(
|
function handleMatchResult(
|
||||||
|
|||||||
18
src/download/checksum/known-checksums.json
generated
18
src/download/checksum/known-checksums.json
generated
@@ -1,22 +1,4 @@
|
|||||||
{
|
{
|
||||||
"aarch64-apple-darwin-0.12.20": "848fdeb602ff1a1baacd4f6c8b7bdc6cf1ad026a6d9cf59475fda17c179743ca",
|
|
||||||
"aarch64-pc-windows-msvc-0.12.20": "b6bd9218855591742ffd3b00fcf2044b4d2fb6446b6a3545e0dfee447e950388",
|
|
||||||
"aarch64-unknown-linux-gnu-0.12.20": "8a7aad7bc76a2fae5151566ff3e43eacce0b2a113d5e4de3e4afe3e58fa2441e",
|
|
||||||
"aarch64-unknown-linux-musl-0.12.20": "94bb13feeebc6b59a4124016c957cdc9ee406d1476ce2b2ce2991e95b8e820b7",
|
|
||||||
"arm-unknown-linux-musleabihf-0.12.20": "6aeef64cf07b43135d6b1c20bd57809f2d965d0f8a2d5602230d5d55b8245477",
|
|
||||||
"armv7-unknown-linux-gnueabihf-0.12.20": "e1c53318608448ad3b8e7f2e9b069936730a6e7b47831ba5446e4b4f436ee715",
|
|
||||||
"armv7-unknown-linux-musleabihf-0.12.20": "a4c3a0e12e5489f092c93b232ddc4a811a6ea9a03f447f91f88e96867c0bac8d",
|
|
||||||
"i686-pc-windows-msvc-0.12.20": "1a372c273370ae9a7e9aa84020ce91fc1d9ebecbd287c3447e7e99cada0b14f3",
|
|
||||||
"i686-unknown-linux-gnu-0.12.20": "f1e83cc88970ed799b507a8392152d19916dfa0b6c9ae9c8145742035a40d5cb",
|
|
||||||
"i686-unknown-linux-musl-0.12.20": "11d541dd32dd779adbdfef69fe30d7d325036f50d394d3f260a0042998e05499",
|
|
||||||
"powerpc64le-unknown-linux-gnu-0.12.20": "39224a5bfc21a8041afc0315e5d47c86acecf4e669944564950996b516fb5987",
|
|
||||||
"riscv64gc-unknown-linux-gnu-0.12.20": "5cb9df36ca64fb72673c59a77b955b50f3bb907689a98d1d8d640aa3e71f2660",
|
|
||||||
"riscv64gc-unknown-linux-musl-0.12.20": "360e91a317a27bd33978577c57b6f3ed778bdfe8c30c9b613e46fdc33bf8aee8",
|
|
||||||
"s390x-unknown-linux-gnu-0.12.20": "25485439b52cb029afa724c442418ca08a53122100f8cce68ccceb88323ccde2",
|
|
||||||
"x86_64-apple-darwin-0.12.20": "ac54283d211fd77cdc152b67606dbaf6406ff4ab03f3af4ae99468fa8e887141",
|
|
||||||
"x86_64-pc-windows-msvc-0.12.20": "95f9bc30fbb3574d276e28ac4a6de932d25153645853d13da8c21eec3bc88d06",
|
|
||||||
"x86_64-unknown-linux-gnu-0.12.20": "6590717592ace991ff83a63fef799e3ad9d33ecc8f96c5d6bdd732496e79337f",
|
|
||||||
"x86_64-unknown-linux-musl-0.12.20": "14114d66a094f1907af0fcbc863f34226bbb7f5e430e13dce6676ba40dcc6891",
|
|
||||||
"aarch64-apple-darwin-0.12.19": "a9a8df1eedeb192f2e47e40e2faabfb387db4b850209118786d42f89dde3e0ba",
|
"aarch64-apple-darwin-0.12.19": "a9a8df1eedeb192f2e47e40e2faabfb387db4b850209118786d42f89dde3e0ba",
|
||||||
"aarch64-pc-windows-msvc-0.12.19": "115b54cb823bc48260670f5782001add6067ac8d98d18c8263a833704e287de9",
|
"aarch64-pc-windows-msvc-0.12.19": "115b54cb823bc48260670f5782001add6067ac8d98d18c8263a833704e287de9",
|
||||||
"aarch64-unknown-linux-gnu-0.12.19": "0804e9b164c64b6914182d5920c08551958a095986f10a3731056df701126436",
|
"aarch64-unknown-linux-gnu-0.12.19": "0804e9b164c64b6914182d5920c08551958a095986f10a3731056df701126436",
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ import {
|
|||||||
getPlatform,
|
getPlatform,
|
||||||
type Platform,
|
type Platform,
|
||||||
} from "./utils/platforms";
|
} from "./utils/platforms";
|
||||||
import { setupPythonArch } from "./utils/python-arch";
|
|
||||||
import { getPythonRuntimeId } from "./utils/python-runtime";
|
import { getPythonRuntimeId } from "./utils/python-runtime";
|
||||||
import { resolveUvVersion } from "./version/resolve";
|
import { resolveUvVersion } from "./version/resolve";
|
||||||
|
|
||||||
@@ -87,11 +86,6 @@ async function run(): Promise<void> {
|
|||||||
throw new Error(`Unsupported architecture: ${process.arch}`);
|
throw new Error(`Unsupported architecture: ${process.arch}`);
|
||||||
}
|
}
|
||||||
const setupResult = await setupUv(inputs, platform, arch);
|
const setupResult = await setupUv(inputs, platform, arch);
|
||||||
const uvPath = path.join(
|
|
||||||
setupResult.uvDir,
|
|
||||||
process.platform === "win32" ? "uv.exe" : "uv",
|
|
||||||
);
|
|
||||||
await setupPythonArch(uvPath, inputs.pythonArch);
|
|
||||||
|
|
||||||
addToolBinToPath(inputs);
|
addToolBinToPath(inputs);
|
||||||
addUvToPathAndOutput(setupResult.uvDir);
|
addUvToPathAndOutput(setupResult.uvDir);
|
||||||
|
|||||||
@@ -24,7 +24,6 @@ export interface SetupInputs {
|
|||||||
version: string;
|
version: string;
|
||||||
versionFile: string;
|
versionFile: string;
|
||||||
pythonVersion: string;
|
pythonVersion: string;
|
||||||
pythonArch: string;
|
|
||||||
activateEnvironment: boolean;
|
activateEnvironment: boolean;
|
||||||
noProject: boolean;
|
noProject: boolean;
|
||||||
venvPath: string;
|
venvPath: string;
|
||||||
@@ -55,7 +54,6 @@ export function loadInputs(): SetupInputs {
|
|||||||
const version = core.getInput("version");
|
const version = core.getInput("version");
|
||||||
const versionFile = getVersionFile(workingDirectory);
|
const versionFile = getVersionFile(workingDirectory);
|
||||||
const pythonVersion = getPythonVersion(versionFile);
|
const pythonVersion = getPythonVersion(versionFile);
|
||||||
const pythonArch = core.getInput("python-arch");
|
|
||||||
const activateEnvironment = core.getBooleanInput("activate-environment");
|
const activateEnvironment = core.getBooleanInput("activate-environment");
|
||||||
const noProject = core.getBooleanInput("no-project");
|
const noProject = core.getBooleanInput("no-project");
|
||||||
const venvPath = getVenvPath(workingDirectory, activateEnvironment);
|
const venvPath = getVenvPath(workingDirectory, activateEnvironment);
|
||||||
@@ -102,7 +100,6 @@ export function loadInputs(): SetupInputs {
|
|||||||
manifestFile,
|
manifestFile,
|
||||||
noProject,
|
noProject,
|
||||||
pruneCache,
|
pruneCache,
|
||||||
pythonArch,
|
|
||||||
pythonDir,
|
pythonDir,
|
||||||
pythonVersion,
|
pythonVersion,
|
||||||
quiet,
|
quiet,
|
||||||
@@ -149,10 +146,6 @@ function getPythonVersion(versionFile: string): string {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function resolvePythonArch(pythonArch: string): string {
|
|
||||||
return pythonArch || process.env.UV_PYTHON_ARCH || "";
|
|
||||||
}
|
|
||||||
|
|
||||||
function getVenvPath(
|
function getVenvPath(
|
||||||
workingDirectory: string,
|
workingDirectory: string,
|
||||||
activateEnvironment: boolean,
|
activateEnvironment: boolean,
|
||||||
|
|||||||
@@ -1,76 +0,0 @@
|
|||||||
import { execFile } from "node:child_process";
|
|
||||||
import { promisify } from "node:util";
|
|
||||||
import * as core from "@actions/core";
|
|
||||||
import { resolvePythonArch } from "./inputs";
|
|
||||||
import * as log from "./logging";
|
|
||||||
|
|
||||||
const execFileAsync = promisify(execFile);
|
|
||||||
const PROBE_ARCH = "setup-uv-probe";
|
|
||||||
|
|
||||||
export async function setupPythonArch(
|
|
||||||
uvPath: string,
|
|
||||||
pythonArchInput: string,
|
|
||||||
): Promise<void> {
|
|
||||||
const pythonArch = resolvePythonArch(pythonArchInput);
|
|
||||||
if (pythonArch === "") {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Older uv releases ignore unknown environment variables. An invalid architecture
|
|
||||||
// confirms that uv recognizes UV_PYTHON_ARCH without finding or downloading Python.
|
|
||||||
const probe = await queryPythonArch(uvPath, PROBE_ARCH);
|
|
||||||
if (probe.exitCode === 0) {
|
|
||||||
throw new Error(
|
|
||||||
"The installed version of uv does not support UV_PYTHON_ARCH. Select a newer uv version or use an architecture-qualified python-version.",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
if (
|
|
||||||
!probe.stderr.includes(
|
|
||||||
`environment variable \`UV_PYTHON_ARCH\` with invalid value \`${PROBE_ARCH}\``,
|
|
||||||
)
|
|
||||||
) {
|
|
||||||
throw new Error(
|
|
||||||
`Failed to check uv's support for UV_PYTHON_ARCH: ${probe.stderr.trim() || `uv exited with code ${probe.exitCode}`}`,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const selected = await queryPythonArch(uvPath, pythonArch);
|
|
||||||
if (selected.exitCode !== 0) {
|
|
||||||
throw new Error(
|
|
||||||
`Failed to set Python architecture to ${pythonArch}: ${selected.stderr.trim() || `uv exited with code ${selected.exitCode}`}`,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pythonArchInput !== "") {
|
|
||||||
core.exportVariable("UV_PYTHON_ARCH", pythonArch);
|
|
||||||
log.info(`Set UV_PYTHON_ARCH to ${pythonArch}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function queryPythonArch(
|
|
||||||
uvPath: string,
|
|
||||||
pythonArch: string,
|
|
||||||
): Promise<{ exitCode: number; stderr: string }> {
|
|
||||||
try {
|
|
||||||
const { stderr } = await execFileAsync(
|
|
||||||
uvPath,
|
|
||||||
["--no-config", "cache", "dir"],
|
|
||||||
{
|
|
||||||
encoding: "utf8",
|
|
||||||
env: { ...process.env, NO_COLOR: "1", UV_PYTHON_ARCH: pythonArch },
|
|
||||||
},
|
|
||||||
);
|
|
||||||
return { exitCode: 0, stderr };
|
|
||||||
} catch (error) {
|
|
||||||
if (
|
|
||||||
error instanceof Error &&
|
|
||||||
"code" in error &&
|
|
||||||
typeof error.code === "number" &&
|
|
||||||
"stderr" in error &&
|
|
||||||
typeof error.stderr === "string"
|
|
||||||
) {
|
|
||||||
return { exitCode: error.code, stderr: error.stderr };
|
|
||||||
}
|
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user