mirror of
https://github.com/astral-sh/setup-uv.git
synced 2026-01-22 11:42:15 +00:00
Compare commits
4 Commits
dependabot
...
zb/version
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0a4c5102bd | ||
|
|
9cfd029643 | ||
|
|
dd9d55bc18 | ||
|
|
8512ad0289 |
2
.github/copilot-instructions.md
vendored
2
.github/copilot-instructions.md
vendored
@@ -23,7 +23,7 @@ and configures the environment for subsequent workflow steps.
|
|||||||
**Size**: Small-medium repository (~50 source files, ~400 total files including dependencies)
|
**Size**: Small-medium repository (~50 source files, ~400 total files including dependencies)
|
||||||
**Languages**: TypeScript (primary), JavaScript (compiled output), JSON (configuration)
|
**Languages**: TypeScript (primary), JavaScript (compiled output), JSON (configuration)
|
||||||
**Runtime**: Node.js 24 (GitHub Actions runtime)
|
**Runtime**: Node.js 24 (GitHub Actions runtime)
|
||||||
**Key Dependencies**: @actions/core, @actions/cache, @actions/tool-cache, @octokit/core
|
**Key Dependencies**: @actions/core, @actions/cache, @actions/tool-cache
|
||||||
|
|
||||||
### Core Architecture
|
### Core Architecture
|
||||||
|
|
||||||
|
|||||||
@@ -202,7 +202,8 @@ by name (`uv`).
|
|||||||
With `setup-uv`, you can install a specific version of Python using `uv python install` rather than
|
With `setup-uv`, you can install a specific version of Python using `uv python install` rather than
|
||||||
relying on `actions/setup-python`.
|
relying on `actions/setup-python`.
|
||||||
|
|
||||||
Using `actions/setup-python` can be faster, because GitHub caches the Python versions alongside the runner.
|
Using `actions/setup-python` can be faster (~1s), because GitHub includes several Python versions in the runner image
|
||||||
|
which are available to get activated by `actions/setup-python` without having to download them.
|
||||||
|
|
||||||
For example:
|
For example:
|
||||||
|
|
||||||
|
|||||||
143
__tests__/download/versions-client.test.ts
Normal file
143
__tests__/download/versions-client.test.ts
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
import { beforeEach, describe, expect, it, jest } from "@jest/globals";
|
||||||
|
|
||||||
|
// biome-ignore lint/suspicious/noExplicitAny: mock needs flexible typing
|
||||||
|
const mockFetch = jest.fn<any>();
|
||||||
|
jest.mock("../../src/utils/fetch", () => ({
|
||||||
|
fetch: mockFetch,
|
||||||
|
}));
|
||||||
|
|
||||||
|
import {
|
||||||
|
clearCache,
|
||||||
|
fetchVersionData,
|
||||||
|
getAllVersions,
|
||||||
|
getArtifact,
|
||||||
|
getLatestVersion,
|
||||||
|
} from "../../src/download/versions-client";
|
||||||
|
|
||||||
|
const sampleNdjsonResponse = `{"version":"0.9.26","artifacts":[{"platform":"aarch64-apple-darwin","variant":"default","url":"https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin.tar.gz","archive_format":"tar.gz","sha256":"fcf0a9ea6599c6ae28a4c854ac6da76f2c889354d7c36ce136ef071f7ab9721f"},{"platform":"x86_64-pc-windows-msvc","variant":"default","url":"https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-pc-windows-msvc.zip","archive_format":"zip","sha256":"eb02fd95d8e0eed462b4a67ecdd320d865b38c560bffcda9a0b87ec944bdf036"}]}
|
||||||
|
{"version":"0.9.25","artifacts":[{"platform":"aarch64-apple-darwin","variant":"default","url":"https://github.com/astral-sh/uv/releases/download/0.9.25/uv-aarch64-apple-darwin.tar.gz","archive_format":"tar.gz","sha256":"606b3c6949d971709f2526fa0d9f0fd23ccf60e09f117999b406b424af18a6a6"}]}`;
|
||||||
|
|
||||||
|
function createMockResponse(
|
||||||
|
ok: boolean,
|
||||||
|
status: number,
|
||||||
|
statusText: string,
|
||||||
|
data: string,
|
||||||
|
) {
|
||||||
|
const encoder = new TextEncoder();
|
||||||
|
const body = {
|
||||||
|
async *[Symbol.asyncIterator]() {
|
||||||
|
yield encoder.encode(data);
|
||||||
|
},
|
||||||
|
};
|
||||||
|
return { body, ok, status, statusText };
|
||||||
|
}
|
||||||
|
|
||||||
|
describe("versions-client", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
clearCache();
|
||||||
|
mockFetch.mockReset();
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("fetchVersionData", () => {
|
||||||
|
it("should fetch and parse NDJSON data", async () => {
|
||||||
|
mockFetch.mockResolvedValue(
|
||||||
|
createMockResponse(true, 200, "OK", sampleNdjsonResponse),
|
||||||
|
);
|
||||||
|
|
||||||
|
const versions = await fetchVersionData();
|
||||||
|
|
||||||
|
expect(versions).toHaveLength(2);
|
||||||
|
expect(versions[0].version).toBe("0.9.26");
|
||||||
|
expect(versions[1].version).toBe("0.9.25");
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should throw error on failed fetch", async () => {
|
||||||
|
mockFetch.mockResolvedValue(
|
||||||
|
createMockResponse(false, 500, "Internal Server Error", ""),
|
||||||
|
);
|
||||||
|
|
||||||
|
await expect(fetchVersionData()).rejects.toThrow(
|
||||||
|
"Failed to fetch version data: 500 Internal Server Error",
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should cache results", async () => {
|
||||||
|
mockFetch.mockResolvedValue(
|
||||||
|
createMockResponse(true, 200, "OK", sampleNdjsonResponse),
|
||||||
|
);
|
||||||
|
|
||||||
|
await fetchVersionData();
|
||||||
|
await fetchVersionData();
|
||||||
|
|
||||||
|
expect(mockFetch).toHaveBeenCalledTimes(1);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("getLatestVersion", () => {
|
||||||
|
it("should return the first version (newest)", async () => {
|
||||||
|
mockFetch.mockResolvedValue(
|
||||||
|
createMockResponse(true, 200, "OK", sampleNdjsonResponse),
|
||||||
|
);
|
||||||
|
|
||||||
|
const latest = await getLatestVersion();
|
||||||
|
|
||||||
|
expect(latest).toBe("0.9.26");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("getAllVersions", () => {
|
||||||
|
it("should return all version strings", async () => {
|
||||||
|
mockFetch.mockResolvedValue(
|
||||||
|
createMockResponse(true, 200, "OK", sampleNdjsonResponse),
|
||||||
|
);
|
||||||
|
|
||||||
|
const versions = await getAllVersions();
|
||||||
|
|
||||||
|
expect(versions).toEqual(["0.9.26", "0.9.25"]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("getArtifact", () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
mockFetch.mockResolvedValue(
|
||||||
|
createMockResponse(true, 200, "OK", sampleNdjsonResponse),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should find artifact by version and platform", async () => {
|
||||||
|
const artifact = await getArtifact("0.9.26", "aarch64", "apple-darwin");
|
||||||
|
|
||||||
|
expect(artifact).toEqual({
|
||||||
|
sha256:
|
||||||
|
"fcf0a9ea6599c6ae28a4c854ac6da76f2c889354d7c36ce136ef071f7ab9721f",
|
||||||
|
url: "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should find Windows artifact", async () => {
|
||||||
|
const artifact = await getArtifact("0.9.26", "x86_64", "pc-windows-msvc");
|
||||||
|
|
||||||
|
expect(artifact).toEqual({
|
||||||
|
sha256:
|
||||||
|
"eb02fd95d8e0eed462b4a67ecdd320d865b38c560bffcda9a0b87ec944bdf036",
|
||||||
|
url: "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-pc-windows-msvc.zip",
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should return undefined for unknown version", async () => {
|
||||||
|
const artifact = await getArtifact("0.0.1", "aarch64", "apple-darwin");
|
||||||
|
|
||||||
|
expect(artifact).toBeUndefined();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should return undefined for unknown platform", async () => {
|
||||||
|
const artifact = await getArtifact(
|
||||||
|
"0.9.26",
|
||||||
|
"aarch64",
|
||||||
|
"unknown-linux-musl",
|
||||||
|
);
|
||||||
|
|
||||||
|
expect(artifact).toBeUndefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
3
dist/save-cache/index.js
generated
vendored
3
dist/save-cache/index.js
generated
vendored
@@ -90980,12 +90980,13 @@ function getConfigValueFromTomlFile(filePath, key) {
|
|||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
Object.defineProperty(exports, "__esModule", ({ value: true }));
|
||||||
exports.STATE_UV_VERSION = exports.STATE_UV_PATH = exports.TOOL_CACHE_NAME = exports.OWNER = exports.REPO = void 0;
|
exports.VERSIONS_NDJSON_URL = exports.STATE_UV_VERSION = exports.STATE_UV_PATH = exports.TOOL_CACHE_NAME = exports.OWNER = exports.REPO = void 0;
|
||||||
exports.REPO = "uv";
|
exports.REPO = "uv";
|
||||||
exports.OWNER = "astral-sh";
|
exports.OWNER = "astral-sh";
|
||||||
exports.TOOL_CACHE_NAME = "uv";
|
exports.TOOL_CACHE_NAME = "uv";
|
||||||
exports.STATE_UV_PATH = "uv-path";
|
exports.STATE_UV_PATH = "uv-path";
|
||||||
exports.STATE_UV_VERSION = "uv-version";
|
exports.STATE_UV_VERSION = "uv-version";
|
||||||
|
exports.VERSIONS_NDJSON_URL = "https://raw.githubusercontent.com/astral-sh/versions/main/v1/uv.ndjson";
|
||||||
|
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
|
|||||||
4525
dist/setup/index.js
generated
vendored
4525
dist/setup/index.js
generated
vendored
File diff suppressed because it is too large
Load Diff
9555
dist/update-known-versions/index.js
generated
vendored
9555
dist/update-known-versions/index.js
generated
vendored
File diff suppressed because it is too large
Load Diff
272
package-lock.json
generated
272
package-lock.json
generated
@@ -15,9 +15,6 @@
|
|||||||
"@actions/glob": "^0.5.0",
|
"@actions/glob": "^0.5.0",
|
||||||
"@actions/io": "^1.1.3",
|
"@actions/io": "^1.1.3",
|
||||||
"@actions/tool-cache": "^2.0.2",
|
"@actions/tool-cache": "^2.0.2",
|
||||||
"@octokit/core": "^7.0.6",
|
|
||||||
"@octokit/plugin-paginate-rest": "^14.0.0",
|
|
||||||
"@octokit/plugin-rest-endpoint-methods": "^17.0.0",
|
|
||||||
"@renovatebot/pep440": "^4.2.1",
|
"@renovatebot/pep440": "^4.2.1",
|
||||||
"smol-toml": "^1.4.2",
|
"smol-toml": "^1.4.2",
|
||||||
"undici": "5.28.5"
|
"undici": "5.28.5"
|
||||||
@@ -412,7 +409,6 @@
|
|||||||
"integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==",
|
"integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@ampproject/remapping": "^2.2.0",
|
"@ampproject/remapping": "^2.2.0",
|
||||||
"@babel/code-frame": "^7.27.1",
|
"@babel/code-frame": "^7.27.1",
|
||||||
@@ -1590,134 +1586,6 @@
|
|||||||
"@tybys/wasm-util": "^0.10.0"
|
"@tybys/wasm-util": "^0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/@octokit/auth-token": {
|
|
||||||
"version": "6.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz",
|
|
||||||
"integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w==",
|
|
||||||
"license": "MIT",
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 20"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/core": {
|
|
||||||
"version": "7.0.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz",
|
|
||||||
"integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==",
|
|
||||||
"license": "MIT",
|
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/auth-token": "^6.0.0",
|
|
||||||
"@octokit/graphql": "^9.0.3",
|
|
||||||
"@octokit/request": "^10.0.6",
|
|
||||||
"@octokit/request-error": "^7.0.2",
|
|
||||||
"@octokit/types": "^16.0.0",
|
|
||||||
"before-after-hook": "^4.0.0",
|
|
||||||
"universal-user-agent": "^7.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 20"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/endpoint": {
|
|
||||||
"version": "11.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz",
|
|
||||||
"integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/types": "^16.0.0",
|
|
||||||
"universal-user-agent": "^7.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 20"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/graphql": {
|
|
||||||
"version": "9.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz",
|
|
||||||
"integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/request": "^10.0.6",
|
|
||||||
"@octokit/types": "^16.0.0",
|
|
||||||
"universal-user-agent": "^7.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 20"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/openapi-types": {
|
|
||||||
"version": "27.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz",
|
|
||||||
"integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA==",
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/plugin-paginate-rest": {
|
|
||||||
"version": "14.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz",
|
|
||||||
"integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/types": "^16.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 20"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"@octokit/core": ">=6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/plugin-rest-endpoint-methods": {
|
|
||||||
"version": "17.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz",
|
|
||||||
"integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/types": "^16.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 20"
|
|
||||||
},
|
|
||||||
"peerDependencies": {
|
|
||||||
"@octokit/core": ">=6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/request": {
|
|
||||||
"version": "10.0.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz",
|
|
||||||
"integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/endpoint": "^11.0.2",
|
|
||||||
"@octokit/request-error": "^7.0.2",
|
|
||||||
"@octokit/types": "^16.0.0",
|
|
||||||
"fast-content-type-parse": "^3.0.0",
|
|
||||||
"universal-user-agent": "^7.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 20"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/request-error": {
|
|
||||||
"version": "7.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz",
|
|
||||||
"integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/types": "^16.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 20"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@octokit/types": {
|
|
||||||
"version": "16.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz",
|
|
||||||
"integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==",
|
|
||||||
"license": "MIT",
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/openapi-types": "^27.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@opentelemetry/api": {
|
"node_modules/@opentelemetry/api": {
|
||||||
"version": "1.4.1",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz",
|
||||||
@@ -2454,12 +2322,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||||
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
|
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
|
||||||
},
|
},
|
||||||
"node_modules/before-after-hook": {
|
|
||||||
"version": "4.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz",
|
|
||||||
"integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ==",
|
|
||||||
"license": "Apache-2.0"
|
|
||||||
},
|
|
||||||
"node_modules/brace-expansion": {
|
"node_modules/brace-expansion": {
|
||||||
"version": "1.1.12",
|
"version": "1.1.12",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
||||||
@@ -2502,7 +2364,6 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"caniuse-lite": "^1.0.30001733",
|
"caniuse-lite": "^1.0.30001733",
|
||||||
"electron-to-chromium": "^1.5.199",
|
"electron-to-chromium": "^1.5.199",
|
||||||
@@ -3070,22 +2931,6 @@
|
|||||||
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
|
"node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/fast-content-type-parse": {
|
|
||||||
"version": "3.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz",
|
|
||||||
"integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg==",
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"type": "github",
|
|
||||||
"url": "https://github.com/sponsors/fastify"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "opencollective",
|
|
||||||
"url": "https://opencollective.com/fastify"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"license": "MIT"
|
|
||||||
},
|
|
||||||
"node_modules/fast-json-stable-stringify": {
|
"node_modules/fast-json-stable-stringify": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
|
||||||
@@ -3630,7 +3475,6 @@
|
|||||||
"integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==",
|
"integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"peer": true,
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@jest/core": "30.2.0",
|
"@jest/core": "30.2.0",
|
||||||
"@jest/types": "30.2.0",
|
"@jest/types": "30.2.0",
|
||||||
@@ -5329,7 +5173,6 @@
|
|||||||
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"peer": true,
|
|
||||||
"bin": {
|
"bin": {
|
||||||
"tsc": "bin/tsc",
|
"tsc": "bin/tsc",
|
||||||
"tsserver": "bin/tsserver"
|
"tsserver": "bin/tsserver"
|
||||||
@@ -5370,12 +5213,6 @@
|
|||||||
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
|
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/universal-user-agent": {
|
|
||||||
"version": "7.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz",
|
|
||||||
"integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A==",
|
|
||||||
"license": "ISC"
|
|
||||||
},
|
|
||||||
"node_modules/unrs-resolver": {
|
"node_modules/unrs-resolver": {
|
||||||
"version": "1.11.1",
|
"version": "1.11.1",
|
||||||
"resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
|
"resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
|
||||||
@@ -6072,7 +5909,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz",
|
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.0.tgz",
|
||||||
"integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==",
|
"integrity": "sha512-UlLAnTPrFdNGoFtbSXwcGFQBtQZJCNjaN6hQNP3UPvuNXT1i82N26KL3dZeIpNalWywr9IuQuncaAfUaS1g6sQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"peer": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"@ampproject/remapping": "^2.2.0",
|
"@ampproject/remapping": "^2.2.0",
|
||||||
"@babel/code-frame": "^7.27.1",
|
"@babel/code-frame": "^7.27.1",
|
||||||
@@ -6887,94 +6723,6 @@
|
|||||||
"@tybys/wasm-util": "^0.10.0"
|
"@tybys/wasm-util": "^0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@octokit/auth-token": {
|
|
||||||
"version": "6.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-6.0.0.tgz",
|
|
||||||
"integrity": "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="
|
|
||||||
},
|
|
||||||
"@octokit/core": {
|
|
||||||
"version": "7.0.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/core/-/core-7.0.6.tgz",
|
|
||||||
"integrity": "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q==",
|
|
||||||
"peer": true,
|
|
||||||
"requires": {
|
|
||||||
"@octokit/auth-token": "^6.0.0",
|
|
||||||
"@octokit/graphql": "^9.0.3",
|
|
||||||
"@octokit/request": "^10.0.6",
|
|
||||||
"@octokit/request-error": "^7.0.2",
|
|
||||||
"@octokit/types": "^16.0.0",
|
|
||||||
"before-after-hook": "^4.0.0",
|
|
||||||
"universal-user-agent": "^7.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@octokit/endpoint": {
|
|
||||||
"version": "11.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-11.0.2.tgz",
|
|
||||||
"integrity": "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ==",
|
|
||||||
"requires": {
|
|
||||||
"@octokit/types": "^16.0.0",
|
|
||||||
"universal-user-agent": "^7.0.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@octokit/graphql": {
|
|
||||||
"version": "9.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-9.0.3.tgz",
|
|
||||||
"integrity": "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA==",
|
|
||||||
"requires": {
|
|
||||||
"@octokit/request": "^10.0.6",
|
|
||||||
"@octokit/types": "^16.0.0",
|
|
||||||
"universal-user-agent": "^7.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@octokit/openapi-types": {
|
|
||||||
"version": "27.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/openapi-types/-/openapi-types-27.0.0.tgz",
|
|
||||||
"integrity": "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="
|
|
||||||
},
|
|
||||||
"@octokit/plugin-paginate-rest": {
|
|
||||||
"version": "14.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-14.0.0.tgz",
|
|
||||||
"integrity": "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw==",
|
|
||||||
"requires": {
|
|
||||||
"@octokit/types": "^16.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@octokit/plugin-rest-endpoint-methods": {
|
|
||||||
"version": "17.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-17.0.0.tgz",
|
|
||||||
"integrity": "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw==",
|
|
||||||
"requires": {
|
|
||||||
"@octokit/types": "^16.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@octokit/request": {
|
|
||||||
"version": "10.0.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/request/-/request-10.0.7.tgz",
|
|
||||||
"integrity": "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA==",
|
|
||||||
"requires": {
|
|
||||||
"@octokit/endpoint": "^11.0.2",
|
|
||||||
"@octokit/request-error": "^7.0.2",
|
|
||||||
"@octokit/types": "^16.0.0",
|
|
||||||
"fast-content-type-parse": "^3.0.0",
|
|
||||||
"universal-user-agent": "^7.0.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@octokit/request-error": {
|
|
||||||
"version": "7.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-7.1.0.tgz",
|
|
||||||
"integrity": "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw==",
|
|
||||||
"requires": {
|
|
||||||
"@octokit/types": "^16.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@octokit/types": {
|
|
||||||
"version": "16.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/@octokit/types/-/types-16.0.0.tgz",
|
|
||||||
"integrity": "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg==",
|
|
||||||
"requires": {
|
|
||||||
"@octokit/openapi-types": "^27.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@opentelemetry/api": {
|
"@opentelemetry/api": {
|
||||||
"version": "1.4.1",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.4.1.tgz",
|
||||||
@@ -7475,11 +7223,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
||||||
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
|
"integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
|
||||||
},
|
},
|
||||||
"before-after-hook": {
|
|
||||||
"version": "4.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-4.0.0.tgz",
|
|
||||||
"integrity": "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="
|
|
||||||
},
|
|
||||||
"brace-expansion": {
|
"brace-expansion": {
|
||||||
"version": "1.1.12",
|
"version": "1.1.12",
|
||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
|
||||||
@@ -7503,7 +7246,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz",
|
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.2.tgz",
|
||||||
"integrity": "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==",
|
"integrity": "sha512-0si2SJK3ooGzIawRu61ZdPCO1IncZwS8IzuX73sPZsXW6EQ/w/DAfPyKI8l1ETTCr2MnvqWitmlCUxgdul45jA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"peer": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"caniuse-lite": "^1.0.30001733",
|
"caniuse-lite": "^1.0.30001733",
|
||||||
"electron-to-chromium": "^1.5.199",
|
"electron-to-chromium": "^1.5.199",
|
||||||
@@ -7881,11 +7623,6 @@
|
|||||||
"jest-util": "30.2.0"
|
"jest-util": "30.2.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"fast-content-type-parse": {
|
|
||||||
"version": "3.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/fast-content-type-parse/-/fast-content-type-parse-3.0.0.tgz",
|
|
||||||
"integrity": "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg=="
|
|
||||||
},
|
|
||||||
"fast-json-stable-stringify": {
|
"fast-json-stable-stringify": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
|
||||||
@@ -8250,7 +7987,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/jest/-/jest-30.2.0.tgz",
|
||||||
"integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==",
|
"integrity": "sha512-F26gjC0yWN8uAA5m5Ss8ZQf5nDHWGlN/xWZIh8S5SRbsEKBovwZhxGd6LJlbZYxBgCYOtreSUyb8hpXyGC5O4A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"peer": true,
|
|
||||||
"requires": {
|
"requires": {
|
||||||
"@jest/core": "30.2.0",
|
"@jest/core": "30.2.0",
|
||||||
"@jest/types": "30.2.0",
|
"@jest/types": "30.2.0",
|
||||||
@@ -9398,8 +9134,7 @@
|
|||||||
"version": "5.9.3",
|
"version": "5.9.3",
|
||||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
||||||
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
||||||
"dev": true,
|
"dev": true
|
||||||
"peer": true
|
|
||||||
},
|
},
|
||||||
"uglify-js": {
|
"uglify-js": {
|
||||||
"version": "3.19.3",
|
"version": "3.19.3",
|
||||||
@@ -9421,11 +9156,6 @@
|
|||||||
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
|
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
|
||||||
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="
|
"integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="
|
||||||
},
|
},
|
||||||
"universal-user-agent": {
|
|
||||||
"version": "7.0.3",
|
|
||||||
"resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-7.0.3.tgz",
|
|
||||||
"integrity": "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A=="
|
|
||||||
},
|
|
||||||
"unrs-resolver": {
|
"unrs-resolver": {
|
||||||
"version": "1.11.1",
|
"version": "1.11.1",
|
||||||
"resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
|
"resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz",
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
"package": "ncc build -o dist/setup src/setup-uv.ts && ncc build -o dist/save-cache src/save-cache.ts && ncc build -o dist/update-known-versions src/update-known-versions.ts",
|
"package": "ncc build -o dist/setup src/setup-uv.ts && ncc build -o dist/save-cache src/save-cache.ts && ncc build -o dist/update-known-versions src/update-known-versions.ts",
|
||||||
"test": "jest",
|
"test": "jest",
|
||||||
"act": "act pull_request -W .github/workflows/test.yml --container-architecture linux/amd64 -s GITHUB_TOKEN=\"$(gh auth token)\"",
|
"act": "act pull_request -W .github/workflows/test.yml --container-architecture linux/amd64 -s GITHUB_TOKEN=\"$(gh auth token)\"",
|
||||||
"update-known-versions": "RUNNER_TEMP=known_versions node dist/update-known-versions/index.js src/download/checksum/known-versions.ts \"$(gh auth token)\"",
|
"update-known-versions": "RUNNER_TEMP=known_versions node dist/update-known-versions/index.js src/download/checksum/known-checksums.ts version-manifest.json",
|
||||||
"all": "npm run build && npm run check && npm run package && npm test"
|
"all": "npm run build && npm run check && npm run package && npm test"
|
||||||
},
|
},
|
||||||
"repository": {
|
"repository": {
|
||||||
@@ -32,9 +32,6 @@
|
|||||||
"@actions/glob": "^0.5.0",
|
"@actions/glob": "^0.5.0",
|
||||||
"@actions/io": "^1.1.3",
|
"@actions/io": "^1.1.3",
|
||||||
"@actions/tool-cache": "^2.0.2",
|
"@actions/tool-cache": "^2.0.2",
|
||||||
"@octokit/core": "^7.0.6",
|
|
||||||
"@octokit/plugin-paginate-rest": "^14.0.0",
|
|
||||||
"@octokit/plugin-rest-endpoint-methods": "^17.0.0",
|
|
||||||
"@renovatebot/pep440": "^4.2.1",
|
"@renovatebot/pep440": "^4.2.1",
|
||||||
"smol-toml": "^1.4.2",
|
"smol-toml": "^1.4.2",
|
||||||
"undici": "5.28.5"
|
"undici": "5.28.5"
|
||||||
|
|||||||
@@ -11,24 +11,35 @@ export async function validateChecksum(
|
|||||||
arch: Architecture,
|
arch: Architecture,
|
||||||
platform: Platform,
|
platform: Platform,
|
||||||
version: string,
|
version: string,
|
||||||
|
ndjsonChecksum?: string,
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
let isValid: boolean | undefined;
|
let isValid: boolean | undefined;
|
||||||
|
let checksumUsed: string | undefined;
|
||||||
|
|
||||||
|
// Priority: user-provided checksum > KNOWN_CHECKSUMS > NDJSON fallback
|
||||||
if (checkSum !== undefined && checkSum !== "") {
|
if (checkSum !== undefined && checkSum !== "") {
|
||||||
|
checksumUsed = checkSum;
|
||||||
|
core.debug("Using user-provided checksum.");
|
||||||
isValid = await validateFileCheckSum(downloadPath, checkSum);
|
isValid = await validateFileCheckSum(downloadPath, checkSum);
|
||||||
} else {
|
} else {
|
||||||
core.debug("Checksum not provided. Checking known checksums.");
|
|
||||||
const key = `${arch}-${platform}-${version}`;
|
const key = `${arch}-${platform}-${version}`;
|
||||||
if (key in KNOWN_CHECKSUMS) {
|
if (key in KNOWN_CHECKSUMS) {
|
||||||
const knownChecksum = KNOWN_CHECKSUMS[`${arch}-${platform}-${version}`];
|
checksumUsed = KNOWN_CHECKSUMS[key];
|
||||||
core.debug(`Checking checksum for ${arch}-${platform}-${version}.`);
|
core.debug(`Using known checksum for ${key}.`);
|
||||||
isValid = await validateFileCheckSum(downloadPath, knownChecksum);
|
isValid = await validateFileCheckSum(downloadPath, checksumUsed);
|
||||||
|
} else if (ndjsonChecksum !== undefined && ndjsonChecksum !== "") {
|
||||||
|
checksumUsed = ndjsonChecksum;
|
||||||
|
core.debug("Using checksum from NDJSON version data.");
|
||||||
|
isValid = await validateFileCheckSum(downloadPath, ndjsonChecksum);
|
||||||
} else {
|
} else {
|
||||||
core.debug(`No known checksum found for ${key}.`);
|
core.debug(`No checksum found for ${key}.`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isValid === false) {
|
if (isValid === false) {
|
||||||
throw new Error(`Checksum for ${downloadPath} did not match ${checkSum}.`);
|
throw new Error(
|
||||||
|
`Checksum for ${downloadPath} did not match ${checksumUsed}.`,
|
||||||
|
);
|
||||||
}
|
}
|
||||||
if (isValid === true) {
|
if (isValid === true) {
|
||||||
core.debug(`Checksum for ${downloadPath} is valid.`);
|
core.debug(`Checksum for ${downloadPath} is valid.`);
|
||||||
|
|||||||
@@ -1,5 +1,77 @@
|
|||||||
// AUTOGENERATED_DO_NOT_EDIT
|
// AUTOGENERATED_DO_NOT_EDIT
|
||||||
export const KNOWN_CHECKSUMS: { [key: string]: string } = {
|
export const KNOWN_CHECKSUMS: { [key: string]: string } = {
|
||||||
|
"aarch64-apple-darwin-0.9.26":
|
||||||
|
"fcf0a9ea6599c6ae28a4c854ac6da76f2c889354d7c36ce136ef071f7ab9721f",
|
||||||
|
"aarch64-pc-windows-msvc-0.9.26":
|
||||||
|
"79e1398ec98681b1b0494ed3485b0f4565e98a7db109a3f205d0fcdc6a1992f7",
|
||||||
|
"aarch64-unknown-linux-gnu-0.9.26":
|
||||||
|
"f71040c59798f79c44c08a7a1c1af7de95a8d334ea924b47b67ad6b9632be270",
|
||||||
|
"aarch64-unknown-linux-musl-0.9.26":
|
||||||
|
"ba8698c36c00c22efed4bd3506339b03c95604d001f02eaf6fbc814c9224d801",
|
||||||
|
"arm-unknown-linux-musleabihf-0.9.26":
|
||||||
|
"8baa850e6f7a4f8edeef411891780161e95682bf291c85405fdc331925c425c2",
|
||||||
|
"armv7-unknown-linux-gnueabihf-0.9.26":
|
||||||
|
"f9cf9806b3bd434b4aca5de1a8412502a29bcbc908848cdea18e32480964ab79",
|
||||||
|
"armv7-unknown-linux-musleabihf-0.9.26":
|
||||||
|
"881df52998da192f0609be37abe445ab0d89f28daceecb171ea8a14088153aee",
|
||||||
|
"i686-pc-windows-msvc-0.9.26":
|
||||||
|
"2fa5e36d7dc3053962a95a2583b2bcc19aab2ec6c5d4c887cca58de819cf77dd",
|
||||||
|
"i686-unknown-linux-gnu-0.9.26":
|
||||||
|
"03548a2abd1d604724c9d65184b506d3eafef1b0a7d8cea974a083f5f9c9496f",
|
||||||
|
"i686-unknown-linux-musl-0.9.26":
|
||||||
|
"5208601b9baee1a04a604f441bd94a1ab91b511f142b27729b073f4286994f8f",
|
||||||
|
"powerpc64-unknown-linux-gnu-0.9.26":
|
||||||
|
"6ac6baa2dd7db742ff58a2d54e3fc09693e69c878666bcacf9d49bc58decc98a",
|
||||||
|
"powerpc64le-unknown-linux-gnu-0.9.26":
|
||||||
|
"1a7fbd268b7520e03747022f879113545a5bd71cad02e9cbabd591b268b5a36c",
|
||||||
|
"riscv64gc-unknown-linux-gnu-0.9.26":
|
||||||
|
"9f202ad04cc398dc77a6efe20ea91ec044ad66e1f7a60777e6efd20a357f479a",
|
||||||
|
"s390x-unknown-linux-gnu-0.9.26":
|
||||||
|
"f8e6b8f1264821add1ea21d592b4522300401f44ac4124fba9fea6874fd79797",
|
||||||
|
"x86_64-apple-darwin-0.9.26":
|
||||||
|
"171eb8c518313e157c5b4cec7b4f743bc6bab1bd23e09b646679a02d096a047f",
|
||||||
|
"x86_64-pc-windows-msvc-0.9.26":
|
||||||
|
"eb02fd95d8e0eed462b4a67ecdd320d865b38c560bffcda9a0b87ec944bdf036",
|
||||||
|
"x86_64-unknown-linux-gnu-0.9.26":
|
||||||
|
"30ccbf0a66dc8727a02b0e245c583ee970bdafecf3a443c1686e1b30ec4939e8",
|
||||||
|
"x86_64-unknown-linux-musl-0.9.26":
|
||||||
|
"708b752876aeeb753257e1d55470569789e465684c1d3bc1760db26360b6c28b",
|
||||||
|
"aarch64-apple-darwin-0.9.25":
|
||||||
|
"606b3c6949d971709f2526fa0d9f0fd23ccf60e09f117999b406b424af18a6a6",
|
||||||
|
"aarch64-pc-windows-msvc-0.9.25":
|
||||||
|
"6a4c2a753a94d9639725b435f5d1a65bfa25cd196d448ad60841f5fe81ef0052",
|
||||||
|
"aarch64-unknown-linux-gnu-0.9.25":
|
||||||
|
"a8f1d71a42c4470251a880348b2d28d530018693324175084fa1749d267c98c6",
|
||||||
|
"aarch64-unknown-linux-musl-0.9.25":
|
||||||
|
"11cddffc61826e3b7af02db37bc3ed8e9e6747dad328d45c8b02f89408afbf75",
|
||||||
|
"arm-unknown-linux-musleabihf-0.9.25":
|
||||||
|
"52f3a96605a7873ec44bb84c33ee08e717df61136fec121f715871cae5b779ec",
|
||||||
|
"armv7-unknown-linux-gnueabihf-0.9.25":
|
||||||
|
"7ae274742a5b2398bd75f9075536c7f0b3f99ebc8c6588c37e3bfcd9cc9d781d",
|
||||||
|
"armv7-unknown-linux-musleabihf-0.9.25":
|
||||||
|
"77220a539dfffe576cdc9b9e9ab5432c07dd1b63915c859c227883af7ba00538",
|
||||||
|
"i686-pc-windows-msvc-0.9.25":
|
||||||
|
"55dbf32074a76e029410620e7e3fbef9762799c7dfcf539b098ccc0a64cac9a3",
|
||||||
|
"i686-unknown-linux-gnu-0.9.25":
|
||||||
|
"b9dae29f4e37bc89e69836e59169a51d8cac4da118b7548a20b2269b19c94cad",
|
||||||
|
"i686-unknown-linux-musl-0.9.25":
|
||||||
|
"a84a159856a0227c273e86594d9cf8fbf84c56bd4eeeb9a665c946304c49dbec",
|
||||||
|
"powerpc64-unknown-linux-gnu-0.9.25":
|
||||||
|
"37bc519ebe5e4efb12fd155eb94512547a874f0e41251203b49d715f75eb5a20",
|
||||||
|
"powerpc64le-unknown-linux-gnu-0.9.25":
|
||||||
|
"a01a273b5cd64ece96d4589afbacaf5e99a0695f37ebe9a72fd6b2f7cf0a7071",
|
||||||
|
"riscv64gc-unknown-linux-gnu-0.9.25":
|
||||||
|
"9d9692f1bd5ff6d9db2c4bffc4ceeb8d8746ae03ddeca0b24a0f8fc9ea81b911",
|
||||||
|
"s390x-unknown-linux-gnu-0.9.25":
|
||||||
|
"92d5e4504ef83f421a841381678f871bf2a8821a69d3374dd638e2014d4762ab",
|
||||||
|
"x86_64-apple-darwin-0.9.25":
|
||||||
|
"4982dfff14b3548bc85d0fa0abec6ab8ae62836b218bf1223741ba1392ef93bf",
|
||||||
|
"x86_64-pc-windows-msvc-0.9.25":
|
||||||
|
"d63f8e59cf76bcce9cb8a3eac6c1a89adce0f89a29bacca978c9bf842f419277",
|
||||||
|
"x86_64-unknown-linux-gnu-0.9.25":
|
||||||
|
"fa1f4abfe101d43e820342210c3c6854028703770f81e95b119ed1e65ec81b35",
|
||||||
|
"x86_64-unknown-linux-musl-0.9.25":
|
||||||
|
"700776c376ce36ed5b731fcd699e141d897551f5111907987b63897e0c1ad797",
|
||||||
"aarch64-apple-darwin-0.9.24":
|
"aarch64-apple-darwin-0.9.24":
|
||||||
"89661d9a16682197086df54bb43d0b03e58e23d4d9360fc8c6c0166f2828fd71",
|
"89661d9a16682197086df54bb43d0b03e58e23d4d9360fc8c6c0166f2828fd71",
|
||||||
"aarch64-pc-windows-msvc-0.9.24":
|
"aarch64-pc-windows-msvc-0.9.24":
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
import { promises as fs } from "node:fs";
|
import { promises as fs } from "node:fs";
|
||||||
import * as tc from "@actions/tool-cache";
|
|
||||||
import { KNOWN_CHECKSUMS } from "./known-checksums";
|
export interface ChecksumEntry {
|
||||||
|
key: string;
|
||||||
|
checksum: string;
|
||||||
|
}
|
||||||
|
|
||||||
export async function updateChecksums(
|
export async function updateChecksums(
|
||||||
filePath: string,
|
filePath: string,
|
||||||
downloadUrls: string[],
|
checksumEntries: ChecksumEntry[],
|
||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
await fs.rm(filePath);
|
await fs.rm(filePath);
|
||||||
await fs.appendFile(
|
await fs.appendFile(
|
||||||
@@ -11,49 +15,12 @@ export async function updateChecksums(
|
|||||||
"// AUTOGENERATED_DO_NOT_EDIT\nexport const KNOWN_CHECKSUMS: { [key: string]: string } = {\n",
|
"// AUTOGENERATED_DO_NOT_EDIT\nexport const KNOWN_CHECKSUMS: { [key: string]: string } = {\n",
|
||||||
);
|
);
|
||||||
let firstLine = true;
|
let firstLine = true;
|
||||||
for (const downloadUrl of downloadUrls) {
|
for (const entry of checksumEntries) {
|
||||||
const key = getKey(downloadUrl);
|
|
||||||
if (key === undefined) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
const checksum = await getOrDownloadChecksum(key, downloadUrl);
|
|
||||||
if (!firstLine) {
|
if (!firstLine) {
|
||||||
await fs.appendFile(filePath, ",\n");
|
await fs.appendFile(filePath, ",\n");
|
||||||
}
|
}
|
||||||
await fs.appendFile(filePath, ` "${key}":\n "${checksum}"`);
|
await fs.appendFile(filePath, ` "${entry.key}":\n "${entry.checksum}"`);
|
||||||
firstLine = false;
|
firstLine = false;
|
||||||
}
|
}
|
||||||
await fs.appendFile(filePath, ",\n};\n");
|
await fs.appendFile(filePath, ",\n};\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
function getKey(downloadUrl: string): string | undefined {
|
|
||||||
// https://github.com/astral-sh/uv/releases/download/0.3.2/uv-aarch64-apple-darwin.tar.gz.sha256
|
|
||||||
const parts = downloadUrl.split("/");
|
|
||||||
const fileName = parts[parts.length - 1];
|
|
||||||
if (fileName.startsWith("source")) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
const name = fileName.split(".")[0].split("uv-")[1];
|
|
||||||
const version = parts[parts.length - 2];
|
|
||||||
return `${name}-${version}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getOrDownloadChecksum(
|
|
||||||
key: string,
|
|
||||||
downloadUrl: string,
|
|
||||||
): Promise<string> {
|
|
||||||
let checksum = "";
|
|
||||||
if (key in KNOWN_CHECKSUMS) {
|
|
||||||
checksum = KNOWN_CHECKSUMS[key];
|
|
||||||
} else {
|
|
||||||
const content = await downloadAssetContent(downloadUrl);
|
|
||||||
checksum = content.split(" ")[0].trim();
|
|
||||||
}
|
|
||||||
return checksum;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function downloadAssetContent(downloadUrl: string): Promise<string> {
|
|
||||||
const downloadPath = await tc.downloadTool(downloadUrl);
|
|
||||||
const content = await fs.readFile(downloadPath, "utf8");
|
|
||||||
return content;
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -2,20 +2,21 @@ import { promises as fs } from "node:fs";
|
|||||||
import * as path from "node:path";
|
import * as path from "node:path";
|
||||||
import * as core from "@actions/core";
|
import * as core from "@actions/core";
|
||||||
import * as tc from "@actions/tool-cache";
|
import * as tc from "@actions/tool-cache";
|
||||||
import type { Endpoints } from "@octokit/types";
|
|
||||||
import * as pep440 from "@renovatebot/pep440";
|
import * as pep440 from "@renovatebot/pep440";
|
||||||
import * as semver from "semver";
|
import * as semver from "semver";
|
||||||
import { OWNER, REPO, TOOL_CACHE_NAME } from "../utils/constants";
|
import { OWNER, REPO, TOOL_CACHE_NAME } from "../utils/constants";
|
||||||
import { Octokit } from "../utils/octokit";
|
|
||||||
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 {
|
import {
|
||||||
getDownloadUrl,
|
getDownloadUrl,
|
||||||
getLatestKnownVersion as getLatestVersionInManifest,
|
getLatestKnownVersion as getLatestVersionInManifest,
|
||||||
} from "./version-manifest";
|
} from "./version-manifest";
|
||||||
|
import {
|
||||||
type Release =
|
type ArtifactResult,
|
||||||
Endpoints["GET /repos/{owner}/{repo}/releases"]["response"]["data"][number];
|
getAllVersions,
|
||||||
|
getArtifact,
|
||||||
|
getLatestVersion as getLatestVersionFromNdjson,
|
||||||
|
} from "./versions-client";
|
||||||
|
|
||||||
export function tryGetFromToolCache(
|
export function tryGetFromToolCache(
|
||||||
arch: Architecture,
|
arch: Architecture,
|
||||||
@@ -41,7 +42,19 @@ export async function downloadVersionFromGithub(
|
|||||||
): Promise<{ version: string; cachedToolDir: string }> {
|
): Promise<{ version: string; cachedToolDir: string }> {
|
||||||
const artifact = `uv-${arch}-${platform}`;
|
const artifact = `uv-${arch}-${platform}`;
|
||||||
const extension = getExtension(platform);
|
const extension = getExtension(platform);
|
||||||
const downloadUrl = `https://github.com/${OWNER}/${REPO}/releases/download/${version}/${artifact}${extension}`;
|
|
||||||
|
// Try to get artifact info from NDJSON (includes checksum)
|
||||||
|
let artifactInfo: ArtifactResult | undefined;
|
||||||
|
try {
|
||||||
|
artifactInfo = await getArtifact(version, arch, platform);
|
||||||
|
} catch (err) {
|
||||||
|
core.debug(`Failed to get artifact from NDJSON: ${(err as Error).message}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const downloadUrl =
|
||||||
|
artifactInfo?.url ??
|
||||||
|
`https://github.com/${OWNER}/${REPO}/releases/download/${version}/${artifact}${extension}`;
|
||||||
|
|
||||||
return await downloadVersion(
|
return await downloadVersion(
|
||||||
downloadUrl,
|
downloadUrl,
|
||||||
artifact,
|
artifact,
|
||||||
@@ -50,6 +63,7 @@ export async function downloadVersionFromGithub(
|
|||||||
version,
|
version,
|
||||||
checkSum,
|
checkSum,
|
||||||
githubToken,
|
githubToken,
|
||||||
|
artifactInfo?.sha256,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -79,6 +93,16 @@ export async function downloadVersionFromManifest(
|
|||||||
githubToken,
|
githubToken,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Try to get checksum from NDJSON for manifest downloads too
|
||||||
|
let ndjsonChecksum: string | undefined;
|
||||||
|
try {
|
||||||
|
const artifactInfo = await getArtifact(version, arch, platform);
|
||||||
|
ndjsonChecksum = artifactInfo?.sha256;
|
||||||
|
} catch (err) {
|
||||||
|
core.debug(`Failed to get artifact from NDJSON: ${(err as Error).message}`);
|
||||||
|
}
|
||||||
|
|
||||||
return await downloadVersion(
|
return await downloadVersion(
|
||||||
downloadUrl,
|
downloadUrl,
|
||||||
`uv-${arch}-${platform}`,
|
`uv-${arch}-${platform}`,
|
||||||
@@ -87,6 +111,7 @@ export async function downloadVersionFromManifest(
|
|||||||
version,
|
version,
|
||||||
checkSum,
|
checkSum,
|
||||||
githubToken,
|
githubToken,
|
||||||
|
ndjsonChecksum,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -98,6 +123,7 @@ async function downloadVersion(
|
|||||||
version: string,
|
version: string,
|
||||||
checkSum: string | undefined,
|
checkSum: string | undefined,
|
||||||
githubToken: string,
|
githubToken: string,
|
||||||
|
ndjsonChecksum?: string,
|
||||||
): Promise<{ version: string; cachedToolDir: string }> {
|
): Promise<{ version: string; cachedToolDir: string }> {
|
||||||
core.info(`Downloading uv from "${downloadUrl}" ...`);
|
core.info(`Downloading uv from "${downloadUrl}" ...`);
|
||||||
const downloadPath = await tc.downloadTool(
|
const downloadPath = await tc.downloadTool(
|
||||||
@@ -105,7 +131,14 @@ async function downloadVersion(
|
|||||||
undefined,
|
undefined,
|
||||||
githubToken,
|
githubToken,
|
||||||
);
|
);
|
||||||
await validateChecksum(checkSum, downloadPath, arch, platform, version);
|
await validateChecksum(
|
||||||
|
checkSum,
|
||||||
|
downloadPath,
|
||||||
|
arch,
|
||||||
|
platform,
|
||||||
|
version,
|
||||||
|
ndjsonChecksum,
|
||||||
|
);
|
||||||
|
|
||||||
let uvDir: string;
|
let uvDir: string;
|
||||||
if (platform === "pc-windows-msvc") {
|
if (platform === "pc-windows-msvc") {
|
||||||
@@ -143,7 +176,6 @@ function getExtension(platform: Platform): string {
|
|||||||
export async function resolveVersion(
|
export async function resolveVersion(
|
||||||
versionInput: string,
|
versionInput: string,
|
||||||
manifestFile: string | undefined,
|
manifestFile: string | undefined,
|
||||||
githubToken: string,
|
|
||||||
resolutionStrategy: "highest" | "lowest" = "highest",
|
resolutionStrategy: "highest" | "lowest" = "highest",
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
core.debug(`Resolving version: ${versionInput}`);
|
core.debug(`Resolving version: ${versionInput}`);
|
||||||
@@ -163,7 +195,7 @@ export async function resolveVersion(
|
|||||||
} else {
|
} else {
|
||||||
version =
|
version =
|
||||||
versionInput === "latest" || resolveVersionSpecifierToLatest
|
versionInput === "latest" || resolveVersionSpecifierToLatest
|
||||||
? await getLatestVersion(githubToken)
|
? await getLatestVersionFromNdjson()
|
||||||
: versionInput;
|
: versionInput;
|
||||||
}
|
}
|
||||||
if (tc.isExplicitVersion(version)) {
|
if (tc.isExplicitVersion(version)) {
|
||||||
@@ -175,7 +207,7 @@ export async function resolveVersion(
|
|||||||
}
|
}
|
||||||
return version;
|
return version;
|
||||||
}
|
}
|
||||||
const availableVersions = await getAvailableVersions(githubToken);
|
const availableVersions = await getAvailableVersions();
|
||||||
core.debug(`Available versions: ${availableVersions}`);
|
core.debug(`Available versions: ${availableVersions}`);
|
||||||
const resolvedVersion =
|
const resolvedVersion =
|
||||||
resolutionStrategy === "lowest"
|
resolutionStrategy === "lowest"
|
||||||
@@ -187,79 +219,9 @@ export async function resolveVersion(
|
|||||||
return resolvedVersion;
|
return resolvedVersion;
|
||||||
}
|
}
|
||||||
|
|
||||||
async function getAvailableVersions(githubToken: string): Promise<string[]> {
|
async function getAvailableVersions(): Promise<string[]> {
|
||||||
core.info("Getting available versions from GitHub API...");
|
core.info("Getting available versions from NDJSON...");
|
||||||
try {
|
return await getAllVersions();
|
||||||
const octokit = new Octokit({
|
|
||||||
auth: githubToken,
|
|
||||||
});
|
|
||||||
return await getReleaseTagNames(octokit);
|
|
||||||
} catch (err) {
|
|
||||||
if ((err as Error).message.includes("Bad credentials")) {
|
|
||||||
core.info(
|
|
||||||
"No (valid) GitHub token provided. Falling back to anonymous. Requests might be rate limited.",
|
|
||||||
);
|
|
||||||
const octokit = new Octokit();
|
|
||||||
return await getReleaseTagNames(octokit);
|
|
||||||
}
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getReleaseTagNames(octokit: Octokit): Promise<string[]> {
|
|
||||||
const response: Release[] = await octokit.paginate(
|
|
||||||
octokit.rest.repos.listReleases,
|
|
||||||
{
|
|
||||||
owner: OWNER,
|
|
||||||
repo: REPO,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
const releaseTagNames = response.map((release) => release.tag_name);
|
|
||||||
if (releaseTagNames.length === 0) {
|
|
||||||
throw Error(
|
|
||||||
"Github API request failed while getting releases. Check the GitHub status page for outages. Try again later.",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return releaseTagNames;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getLatestVersion(githubToken: string) {
|
|
||||||
core.info("Getting latest version from GitHub API...");
|
|
||||||
const octokit = new Octokit({
|
|
||||||
auth: githubToken,
|
|
||||||
});
|
|
||||||
|
|
||||||
let latestRelease: { tag_name: string } | undefined;
|
|
||||||
try {
|
|
||||||
latestRelease = await getLatestRelease(octokit);
|
|
||||||
} catch (err) {
|
|
||||||
if ((err as Error).message.includes("Bad credentials")) {
|
|
||||||
core.info(
|
|
||||||
"No (valid) GitHub token provided. Falling back to anonymous. Requests might be rate limited.",
|
|
||||||
);
|
|
||||||
const octokit = new Octokit();
|
|
||||||
latestRelease = await getLatestRelease(octokit);
|
|
||||||
} else {
|
|
||||||
core.error(
|
|
||||||
"Github API request failed while getting latest release. Check the GitHub status page for outages. Try again later.",
|
|
||||||
);
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!latestRelease) {
|
|
||||||
throw new Error("Could not determine latest release.");
|
|
||||||
}
|
|
||||||
core.debug(`Latest version: ${latestRelease.tag_name}`);
|
|
||||||
return latestRelease.tag_name;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getLatestRelease(octokit: Octokit) {
|
|
||||||
const { data: latestRelease } = await octokit.rest.repos.getLatestRelease({
|
|
||||||
owner: OWNER,
|
|
||||||
repo: REPO,
|
|
||||||
});
|
|
||||||
return latestRelease;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function maxSatisfying(
|
function maxSatisfying(
|
||||||
|
|||||||
140
src/download/versions-client.ts
Normal file
140
src/download/versions-client.ts
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
import * as core from "@actions/core";
|
||||||
|
import { VERSIONS_NDJSON_URL } from "../utils/constants";
|
||||||
|
import { fetch } from "../utils/fetch";
|
||||||
|
|
||||||
|
export interface NdjsonArtifact {
|
||||||
|
platform: string;
|
||||||
|
variant: string;
|
||||||
|
url: string;
|
||||||
|
archive_format: string;
|
||||||
|
sha256: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface NdjsonVersion {
|
||||||
|
version: string;
|
||||||
|
artifacts: NdjsonArtifact[];
|
||||||
|
}
|
||||||
|
|
||||||
|
let cachedVersionData: NdjsonVersion[] | null = null;
|
||||||
|
|
||||||
|
export async function fetchVersionData(): Promise<NdjsonVersion[]> {
|
||||||
|
if (cachedVersionData !== null) {
|
||||||
|
core.debug("Using cached NDJSON version data");
|
||||||
|
return cachedVersionData;
|
||||||
|
}
|
||||||
|
|
||||||
|
core.info(`Fetching version data from ${VERSIONS_NDJSON_URL}...`);
|
||||||
|
const response = await fetch(VERSIONS_NDJSON_URL, {});
|
||||||
|
if (!response.ok) {
|
||||||
|
throw new Error(
|
||||||
|
`Failed to fetch version data: ${response.status} ${response.statusText}`,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const versions: NdjsonVersion[] = [];
|
||||||
|
|
||||||
|
if (!response.body) {
|
||||||
|
throw new Error("Response body is null");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Stream and parse NDJSON line by line
|
||||||
|
const decoder = new TextDecoder();
|
||||||
|
let buffer = "";
|
||||||
|
|
||||||
|
for await (const chunk of response.body) {
|
||||||
|
buffer += decoder.decode(chunk, { stream: true });
|
||||||
|
|
||||||
|
// Process complete lines
|
||||||
|
const lines = buffer.split("\n");
|
||||||
|
// Keep the last potentially incomplete line in buffer
|
||||||
|
buffer = lines.pop() ?? "";
|
||||||
|
|
||||||
|
for (const line of lines) {
|
||||||
|
const trimmed = line.trim();
|
||||||
|
if (trimmed === "") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
try {
|
||||||
|
const version = JSON.parse(trimmed) as NdjsonVersion;
|
||||||
|
versions.push(version);
|
||||||
|
} catch {
|
||||||
|
core.debug(`Failed to parse NDJSON line: ${trimmed}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Process any remaining content in buffer
|
||||||
|
const remaining = buffer.trim();
|
||||||
|
if (remaining !== "") {
|
||||||
|
try {
|
||||||
|
const version = JSON.parse(remaining) as NdjsonVersion;
|
||||||
|
versions.push(version);
|
||||||
|
} catch {
|
||||||
|
core.debug(`Failed to parse NDJSON line: ${remaining}`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (versions.length === 0) {
|
||||||
|
throw new Error("No version data found in NDJSON file");
|
||||||
|
}
|
||||||
|
|
||||||
|
cachedVersionData = versions;
|
||||||
|
return versions;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getLatestVersion(): Promise<string> {
|
||||||
|
const versions = await fetchVersionData();
|
||||||
|
// The NDJSON file lists versions in order, newest first
|
||||||
|
const latestVersion = versions[0]?.version;
|
||||||
|
if (!latestVersion) {
|
||||||
|
throw new Error("No versions found in NDJSON data");
|
||||||
|
}
|
||||||
|
core.debug(`Latest version from NDJSON: ${latestVersion}`);
|
||||||
|
return latestVersion;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getAllVersions(): Promise<string[]> {
|
||||||
|
const versions = await fetchVersionData();
|
||||||
|
return versions.map((v) => v.version);
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ArtifactResult {
|
||||||
|
url: string;
|
||||||
|
sha256: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getArtifact(
|
||||||
|
version: string,
|
||||||
|
arch: string,
|
||||||
|
platform: string,
|
||||||
|
): Promise<ArtifactResult | undefined> {
|
||||||
|
const versions = await fetchVersionData();
|
||||||
|
const versionData = versions.find((v) => v.version === version);
|
||||||
|
if (!versionData) {
|
||||||
|
core.debug(`Version ${version} not found in NDJSON data`);
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
// The NDJSON artifact platform format is like "x86_64-apple-darwin"
|
||||||
|
// We need to match against arch-platform
|
||||||
|
const targetPlatform = `${arch}-${platform}`;
|
||||||
|
const artifact = versionData.artifacts.find(
|
||||||
|
(a) => a.platform === targetPlatform,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!artifact) {
|
||||||
|
core.debug(
|
||||||
|
`Artifact for ${targetPlatform} not found in version ${version}. Available platforms: ${versionData.artifacts.map((a) => a.platform).join(", ")}`,
|
||||||
|
);
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
sha256: artifact.sha256,
|
||||||
|
url: artifact.url,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function clearCache(): void {
|
||||||
|
cachedVersionData = null;
|
||||||
|
}
|
||||||
@@ -157,12 +157,7 @@ async function determineVersion(
|
|||||||
manifestFile: string | undefined,
|
manifestFile: string | undefined,
|
||||||
): Promise<string> {
|
): Promise<string> {
|
||||||
if (versionInput !== "") {
|
if (versionInput !== "") {
|
||||||
return await resolveVersion(
|
return await resolveVersion(versionInput, manifestFile, resolutionStrategy);
|
||||||
versionInput,
|
|
||||||
manifestFile,
|
|
||||||
githubToken,
|
|
||||||
resolutionStrategy,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
if (versionFileInput !== "") {
|
if (versionFileInput !== "") {
|
||||||
const versionFromFile = getUvVersionFromFile(versionFileInput);
|
const versionFromFile = getUvVersionFromFile(versionFileInput);
|
||||||
@@ -174,7 +169,6 @@ async function determineVersion(
|
|||||||
return await resolveVersion(
|
return await resolveVersion(
|
||||||
versionFromFile,
|
versionFromFile,
|
||||||
manifestFile,
|
manifestFile,
|
||||||
githubToken,
|
|
||||||
resolutionStrategy,
|
resolutionStrategy,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -192,7 +186,6 @@ async function determineVersion(
|
|||||||
return await resolveVersion(
|
return await resolveVersion(
|
||||||
versionFromUvToml || versionFromPyproject || "latest",
|
versionFromUvToml || versionFromPyproject || "latest",
|
||||||
manifestFile,
|
manifestFile,
|
||||||
githubToken,
|
|
||||||
resolutionStrategy,
|
resolutionStrategy,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,63 +1,117 @@
|
|||||||
import * as core from "@actions/core";
|
import * as core from "@actions/core";
|
||||||
import type { Endpoints } from "@octokit/types";
|
|
||||||
import * as semver from "semver";
|
import * as semver from "semver";
|
||||||
import { updateChecksums } from "./download/checksum/update-known-checksums";
|
import { updateChecksums } from "./download/checksum/update-known-checksums";
|
||||||
|
import { getLatestKnownVersion } from "./download/version-manifest";
|
||||||
import {
|
import {
|
||||||
getLatestKnownVersion,
|
fetchVersionData,
|
||||||
updateVersionManifest,
|
getLatestVersion,
|
||||||
} from "./download/version-manifest";
|
type NdjsonVersion,
|
||||||
import { OWNER, REPO } from "./utils/constants";
|
} from "./download/versions-client";
|
||||||
import { Octokit } from "./utils/octokit";
|
|
||||||
|
|
||||||
type Release =
|
interface ChecksumEntry {
|
||||||
Endpoints["GET /repos/{owner}/{repo}/releases"]["response"]["data"][number];
|
key: string;
|
||||||
|
checksum: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ArtifactEntry {
|
||||||
|
version: string;
|
||||||
|
artifactName: string;
|
||||||
|
arch: string;
|
||||||
|
platform: string;
|
||||||
|
downloadUrl: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractChecksumsFromNdjson(
|
||||||
|
versions: NdjsonVersion[],
|
||||||
|
): ChecksumEntry[] {
|
||||||
|
const checksums: ChecksumEntry[] = [];
|
||||||
|
|
||||||
|
for (const version of versions) {
|
||||||
|
for (const artifact of version.artifacts) {
|
||||||
|
// The platform field contains the target triple like "x86_64-apple-darwin"
|
||||||
|
const key = `${artifact.platform}-${version.version}`;
|
||||||
|
checksums.push({
|
||||||
|
checksum: artifact.sha256,
|
||||||
|
key,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return checksums;
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractArtifactsFromNdjson(
|
||||||
|
versions: NdjsonVersion[],
|
||||||
|
): ArtifactEntry[] {
|
||||||
|
const artifacts: ArtifactEntry[] = [];
|
||||||
|
|
||||||
|
for (const version of versions) {
|
||||||
|
for (const artifact of version.artifacts) {
|
||||||
|
// The platform field contains the target triple like "x86_64-apple-darwin"
|
||||||
|
// Split into arch and platform (e.g., "x86_64-apple-darwin" -> ["x86_64", "apple-darwin"])
|
||||||
|
const parts = artifact.platform.split("-");
|
||||||
|
const arch = parts[0];
|
||||||
|
const platform = parts.slice(1).join("-");
|
||||||
|
|
||||||
|
// Construct artifact name from platform and archive format
|
||||||
|
const artifactName = `uv-${artifact.platform}.${artifact.archive_format}`;
|
||||||
|
|
||||||
|
artifacts.push({
|
||||||
|
arch,
|
||||||
|
artifactName,
|
||||||
|
downloadUrl: artifact.url,
|
||||||
|
platform,
|
||||||
|
version: version.version,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return artifacts;
|
||||||
|
}
|
||||||
|
|
||||||
async function run(): Promise<void> {
|
async function run(): Promise<void> {
|
||||||
const checksumFilePath = process.argv.slice(2)[0];
|
const checksumFilePath = process.argv.slice(2)[0];
|
||||||
const versionsManifestFile = process.argv.slice(2)[1];
|
const versionsManifestFile = process.argv.slice(2)[1];
|
||||||
const githubToken = process.argv.slice(2)[2];
|
|
||||||
|
|
||||||
const octokit = new Octokit({
|
|
||||||
auth: githubToken,
|
|
||||||
});
|
|
||||||
|
|
||||||
const { data: latestRelease } = await octokit.rest.repos.getLatestRelease({
|
|
||||||
owner: OWNER,
|
|
||||||
repo: REPO,
|
|
||||||
});
|
|
||||||
|
|
||||||
|
const latestVersion = await getLatestVersion();
|
||||||
const latestKnownVersion = await getLatestKnownVersion(undefined);
|
const latestKnownVersion = await getLatestKnownVersion(undefined);
|
||||||
|
|
||||||
if (semver.lte(latestRelease.tag_name, latestKnownVersion)) {
|
if (semver.lte(latestVersion, latestKnownVersion)) {
|
||||||
core.info(
|
core.info(
|
||||||
`Latest release (${latestRelease.tag_name}) is not newer than the latest known version (${latestKnownVersion}). Skipping update.`,
|
`Latest release (${latestVersion}) is not newer than the latest known version (${latestKnownVersion}). Skipping update.`,
|
||||||
);
|
);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const releases: Release[] = await octokit.paginate(
|
const versions = await fetchVersionData();
|
||||||
octokit.rest.repos.listReleases,
|
|
||||||
{
|
|
||||||
owner: OWNER,
|
|
||||||
repo: REPO,
|
|
||||||
},
|
|
||||||
);
|
|
||||||
const checksumDownloadUrls: string[] = releases.flatMap((release) =>
|
|
||||||
release.assets
|
|
||||||
.filter((asset) => asset.name.endsWith(".sha256"))
|
|
||||||
.map((asset) => asset.browser_download_url),
|
|
||||||
);
|
|
||||||
await updateChecksums(checksumFilePath, checksumDownloadUrls);
|
|
||||||
|
|
||||||
const artifactDownloadUrls: string[] = releases.flatMap((release) =>
|
// Extract checksums from NDJSON
|
||||||
release.assets
|
const checksumEntries = extractChecksumsFromNdjson(versions);
|
||||||
.filter((asset) => !asset.name.endsWith(".sha256"))
|
await updateChecksums(checksumFilePath, checksumEntries);
|
||||||
.map((asset) => asset.browser_download_url),
|
|
||||||
);
|
|
||||||
|
|
||||||
await updateVersionManifest(versionsManifestFile, artifactDownloadUrls);
|
// Extract artifact URLs for version manifest
|
||||||
|
const artifactEntries = extractArtifactsFromNdjson(versions);
|
||||||
|
await updateVersionManifestFromEntries(versionsManifestFile, artifactEntries);
|
||||||
|
|
||||||
core.setOutput("latest-version", latestRelease.tag_name);
|
core.setOutput("latest-version", latestVersion);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function updateVersionManifestFromEntries(
|
||||||
|
filePath: string,
|
||||||
|
entries: ArtifactEntry[],
|
||||||
|
): Promise<void> {
|
||||||
|
const { promises: fs } = await import("node:fs");
|
||||||
|
|
||||||
|
const manifest = entries.map((entry) => ({
|
||||||
|
arch: entry.arch,
|
||||||
|
artifactName: entry.artifactName,
|
||||||
|
downloadUrl: entry.downloadUrl,
|
||||||
|
platform: entry.platform,
|
||||||
|
version: entry.version,
|
||||||
|
}));
|
||||||
|
|
||||||
|
core.debug(`Updating manifest-file: ${JSON.stringify(manifest)}`);
|
||||||
|
await fs.writeFile(filePath, JSON.stringify(manifest));
|
||||||
}
|
}
|
||||||
|
|
||||||
run();
|
run();
|
||||||
|
|||||||
@@ -3,3 +3,5 @@ export const OWNER = "astral-sh";
|
|||||||
export const TOOL_CACHE_NAME = "uv";
|
export const TOOL_CACHE_NAME = "uv";
|
||||||
export const STATE_UV_PATH = "uv-path";
|
export const STATE_UV_PATH = "uv-path";
|
||||||
export const STATE_UV_VERSION = "uv-version";
|
export const STATE_UV_VERSION = "uv-version";
|
||||||
|
export const VERSIONS_NDJSON_URL =
|
||||||
|
"https://raw.githubusercontent.com/astral-sh/versions/main/v1/uv.ndjson";
|
||||||
|
|||||||
@@ -1,34 +0,0 @@
|
|||||||
import type { OctokitOptions } from "@octokit/core";
|
|
||||||
import { Octokit as Core } from "@octokit/core";
|
|
||||||
import {
|
|
||||||
type PaginateInterface,
|
|
||||||
paginateRest,
|
|
||||||
} from "@octokit/plugin-paginate-rest";
|
|
||||||
import { legacyRestEndpointMethods } from "@octokit/plugin-rest-endpoint-methods";
|
|
||||||
import { fetch as customFetch } from "./fetch";
|
|
||||||
|
|
||||||
export type { RestEndpointMethodTypes } from "@octokit/plugin-rest-endpoint-methods";
|
|
||||||
|
|
||||||
const DEFAULTS = {
|
|
||||||
baseUrl: "https://api.github.com",
|
|
||||||
userAgent: "setup-uv",
|
|
||||||
};
|
|
||||||
|
|
||||||
const OctokitWithPlugins = Core.plugin(paginateRest, legacyRestEndpointMethods);
|
|
||||||
|
|
||||||
export const Octokit = OctokitWithPlugins.defaults(function buildDefaults(
|
|
||||||
options: OctokitOptions,
|
|
||||||
): OctokitOptions {
|
|
||||||
return {
|
|
||||||
...DEFAULTS,
|
|
||||||
...options,
|
|
||||||
request: {
|
|
||||||
fetch: customFetch,
|
|
||||||
...options.request,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
export type Octokit = InstanceType<typeof OctokitWithPlugins> & {
|
|
||||||
paginate: PaginateInterface;
|
|
||||||
};
|
|
||||||
@@ -1,4 +1,256 @@
|
|||||||
[
|
[
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
"platform": "apple-darwin",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-aarch64-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "arm",
|
||||||
|
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-arm-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-musleabihf",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "armv7",
|
||||||
|
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-armv7-unknown-linux-gnueabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnueabihf",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "armv7",
|
||||||
|
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-armv7-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-musleabihf",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-i686-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-i686-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-i686-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "powerpc64",
|
||||||
|
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-powerpc64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "powerpc64le",
|
||||||
|
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-powerpc64le-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "riscv64gc",
|
||||||
|
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-riscv64gc-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "s390x",
|
||||||
|
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-s390x-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-apple-darwin.tar.gz",
|
||||||
|
"platform": "apple-darwin",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.26/uv-x86_64-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.26"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
"platform": "apple-darwin",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-aarch64-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-aarch64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "aarch64",
|
||||||
|
"artifactName": "uv-aarch64-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-aarch64-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "arm",
|
||||||
|
"artifactName": "uv-arm-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-arm-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-musleabihf",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "armv7",
|
||||||
|
"artifactName": "uv-armv7-unknown-linux-gnueabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-armv7-unknown-linux-gnueabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnueabihf",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "armv7",
|
||||||
|
"artifactName": "uv-armv7-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-armv7-unknown-linux-musleabihf.tar.gz",
|
||||||
|
"platform": "unknown-linux-musleabihf",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-i686-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-i686-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "i686",
|
||||||
|
"artifactName": "uv-i686-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-i686-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "powerpc64",
|
||||||
|
"artifactName": "uv-powerpc64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-powerpc64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "powerpc64le",
|
||||||
|
"artifactName": "uv-powerpc64le-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-powerpc64le-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "riscv64gc",
|
||||||
|
"artifactName": "uv-riscv64gc-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-riscv64gc-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "s390x",
|
||||||
|
"artifactName": "uv-s390x-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-s390x-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-apple-darwin.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-x86_64-apple-darwin.tar.gz",
|
||||||
|
"platform": "apple-darwin",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-pc-windows-msvc.zip",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-x86_64-pc-windows-msvc.zip",
|
||||||
|
"platform": "pc-windows-msvc",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-unknown-linux-gnu.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-x86_64-unknown-linux-gnu.tar.gz",
|
||||||
|
"platform": "unknown-linux-gnu",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"arch": "x86_64",
|
||||||
|
"artifactName": "uv-x86_64-unknown-linux-musl.tar.gz",
|
||||||
|
"downloadUrl": "https://github.com/astral-sh/uv/releases/download/0.9.25/uv-x86_64-unknown-linux-musl.tar.gz",
|
||||||
|
"platform": "unknown-linux-musl",
|
||||||
|
"version": "0.9.25"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"arch": "aarch64",
|
"arch": "aarch64",
|
||||||
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
|
"artifactName": "uv-aarch64-apple-darwin.tar.gz",
|
||||||
|
|||||||
Reference in New Issue
Block a user