From 51dac4893d0c412e6fb4e7aafd099dbb44f9e999 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 4 Sep 2026 06:42:21 +0000 Subject: [PATCH 1/5] Tolerate transient manifest timeouts (#1016) Transient timeout fetching manifests have increased significantly recently, especially with private runners. ``` Fetching manifest data from https://raw.githubusercontent.com/astral-sh/versions/main/v1/uv.ndjson ... Error: The operation was aborted due to timeout ``` Retry transient manifest network failures up to three times with a progressive backoff (not exponential), keeping the total wait bounded while making setup resilient to short network blips. Co-authored-by: Raymond --- __tests__/download/manifest.test.ts | 42 ++++++++++++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/__tests__/download/manifest.test.ts b/__tests__/download/manifest.test.ts index b269335..61d4a48 100644 --- a/__tests__/download/manifest.test.ts +++ b/__tests__/download/manifest.test.ts @@ -1,4 +1,11 @@ -import { beforeEach, describe, expect, it, jest } from "@jest/globals"; +import { + afterEach, + beforeEach, + describe, + expect, + it, + jest, +} from "@jest/globals"; // biome-ignore lint/suspicious/noExplicitAny: Mock requires flexible typing in tests. const mockFetch = jest.fn(); @@ -13,6 +20,7 @@ jest.unstable_mockModule("../../src/utils/fetch", () => ({ })); const { + MANIFEST_FETCH_ATTEMPTS, clearManifestCache, fetchManifest, getAllVersions, @@ -73,6 +81,10 @@ describe("manifest", () => { mockFetch.mockReset(); }); + afterEach(() => { + jest.useRealTimers(); + }); + describe("fetchManifest", () => { it("fetches and parses manifest data", async () => { mockFetch.mockResolvedValue( @@ -86,6 +98,34 @@ describe("manifest", () => { expect(versions[1]?.version).toBe("0.9.25"); }); + it("retries network failures", async () => { + jest.useFakeTimers(); + mockFetch + .mockRejectedValueOnce(new Error("request timed out")) + .mockResolvedValueOnce( + createMockResponse(true, 200, "OK", sampleManifestResponse), + ); + + const result = fetchManifest(); + await jest.runAllTimersAsync(); + + await expect(result).resolves.toHaveLength(2); + expect(mockFetch).toHaveBeenCalledTimes(2); + }); + + it("stops after the configured number of network failures", async () => { + jest.useFakeTimers(); + mockFetch.mockRejectedValue(new Error("request timed out")); + + const result = expect(fetchManifest()).rejects.toThrow( + "request timed out", + ); + await jest.runAllTimersAsync(); + + await result; + expect(mockFetch).toHaveBeenCalledTimes(MANIFEST_FETCH_ATTEMPTS); + }); + it("throws on a failed fetch", async () => { mockFetch.mockResolvedValue( createMockResponse(false, 500, "Internal Server Error", ""), From b022d39a4b3fc5a07beb00c97f3ccd1d69f549ee Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 4 Sep 2026 06:42:23 +0000 Subject: [PATCH 2/5] Tolerate transient manifest timeouts (#1016) Transient timeout fetching manifests have increased significantly recently, especially with private runners. ``` Fetching manifest data from https://raw.githubusercontent.com/astral-sh/versions/main/v1/uv.ndjson ... Error: The operation was aborted due to timeout ``` Retry transient manifest network failures up to three times with a progressive backoff (not exponential), keeping the total wait bounded while making setup resilient to short network blips. Co-authored-by: Raymond --- src/download/manifest.ts | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/download/manifest.ts b/src/download/manifest.ts index b26bf82..91763e7 100644 --- a/src/download/manifest.ts +++ b/src/download/manifest.ts @@ -31,6 +31,7 @@ interface CachedManifest { } const cachedManifestData = new Map(); +export const MANIFEST_FETCH_ATTEMPTS = 3; export async function fetchManifest( manifestUrl: string = VERSIONS_MANIFEST_URL, @@ -166,8 +167,26 @@ export function clearManifestCache(manifestUrl?: string): void { } async function fetchManifestResponse(manifestUrl: string) { - log.info(`Fetching manifest data from ${manifestUrl} ...`); - const response = await fetch(manifestUrl, {}); + let response: Awaited> | undefined; + for (let attempt = 1; attempt <= MANIFEST_FETCH_ATTEMPTS; attempt++) { + log.info(`Fetching manifest data from ${manifestUrl} ...`); + try { + response = await fetch(manifestUrl, {}); + break; + } catch (error) { + if (attempt >= MANIFEST_FETCH_ATTEMPTS) { + throw error; + } + const delayMs = 1_000 * 2 ** (attempt - 1); + log.info(`Manifest fetch failed; retrying in ${delayMs}ms ...`); + await new Promise((resolve) => setTimeout(resolve, delayMs)); + } + } + + if (response === undefined) { + throw new Error("Manifest fetch attempts exhausted."); + } + if (!response.ok) { throw new Error( `Failed to fetch manifest data: ${response.status} ${response.statusText}`, From bdb51970ea90d8b55832ea0fd8599d8969f20c4e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 4 Sep 2026 06:42:26 +0000 Subject: [PATCH 3/5] chore: update known checksums for 0.12.4 (#1017) chore: update known checksums for 0.12.4 Co-authored-by: eifinger --- src/download/checksum/known-checksums.ts | 36 ++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/download/checksum/known-checksums.ts b/src/download/checksum/known-checksums.ts index 3069d05..563b380 100644 --- a/src/download/checksum/known-checksums.ts +++ b/src/download/checksum/known-checksums.ts @@ -1,5 +1,41 @@ // AUTOGENERATED_DO_NOT_EDIT export const KNOWN_CHECKSUMS: { [key: string]: string } = { + "aarch64-apple-darwin-0.12.4": + "99a913b606194867b43086404412c1afe079547fee72ecfb6af7e7b0dd54b0c6", + "aarch64-pc-windows-msvc-0.12.4": + "3290abffee78c30e3113f5113e26684fd057287e89124a588dcdcdd6ceec0fea", + "aarch64-unknown-linux-gnu-0.12.4": + "49d881b3403187e1f1789720881e77e4251ad4259d86c4844862657d2a35d13f", + "aarch64-unknown-linux-musl-0.12.4": + "04ed16e895b08065720e3d06cde722f0d406b63d116247d5e7776525c41f4972", + "arm-unknown-linux-musleabihf-0.12.4": + "9657ea47619bae9097e92a942694c3bbead7bf37c5ccffa6a0f8b3f08a947dba", + "armv7-unknown-linux-gnueabihf-0.12.4": + "fd9d223afc79a4d116d48269ea8cdc00cdeb0637d028843910650abc037e7c4f", + "armv7-unknown-linux-musleabihf-0.12.4": + "c61f3c109fcb0c9cac2a3c232d50ccd70c422a5d4dae44dab007bdf5c1e64f0d", + "i686-pc-windows-msvc-0.12.4": + "06a4948b908ce93af14c140158e15b5247ae6c8f15db50f3e4c6335bfd08b3fd", + "i686-unknown-linux-gnu-0.12.4": + "bcf9e594c0867f9bfe91b7979cdac38a86bb9f7136ceba259e727af912127f23", + "i686-unknown-linux-musl-0.12.4": + "d4c95044a507046f1ce9efdd00fb6873432a7d582a29d22febad26d92551586a", + "powerpc64le-unknown-linux-gnu-0.12.4": + "6028a1744a7c07d789f21cf4c1574bb4bfe40f2980ac411af5bcbaeac32b0094", + "riscv64gc-unknown-linux-gnu-0.12.4": + "dca9b15d76b5547987fc6b08fc1ea14e49773d9434b52825c68397c53896a139", + "riscv64gc-unknown-linux-musl-0.12.4": + "cc481ddf7f9d09491b83defa9a221e1410f7a4b1ea160687e201815ba1d91a7a", + "s390x-unknown-linux-gnu-0.12.4": + "9c6eea6ed43d8753e7eb26489a73ac060012e1a2485992955dd82a3b10b47acb", + "x86_64-apple-darwin-0.12.4": + "e603f1eb634ca97a2a125539b983891f53235e901511ed10c32c08c86e253ecd", + "x86_64-pc-windows-msvc-0.12.4": + "4f3b7d63cd81fca0da5a655d973d20affca89ce6e5f9a29fd0183cc4204a7639", + "x86_64-unknown-linux-gnu-0.12.4": + "c8c60f47e6f88d18dbf6f33d7279fb1fbf7ae76631768152cf5578c3d65729b4", + "x86_64-unknown-linux-musl-0.12.4": + "7aef04898775585d636424e52053e5328f2b1779175d5cb47665ff9d7524e8e7", "aarch64-apple-darwin-0.12.3": "546f7f8a6c70ff13a3a9d2bc958db3427298cebf3e0cb756f9177133b7068843", "aarch64-pc-windows-msvc-0.12.3": From 26792e6d47580bb4198364c0c9cb3b7d5189c0a4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 4 Sep 2026 06:43:11 +0000 Subject: [PATCH 4/5] fix: apply code build script --- dist/setup/index.cjs | 39 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/dist/setup/index.cjs b/dist/setup/index.cjs index 6e40175..b30b4b7 100644 --- a/dist/setup/index.cjs +++ b/dist/setup/index.cjs @@ -108119,6 +108119,24 @@ var fs10 = __toESM(require("node:fs"), 1); // src/download/checksum/known-checksums.ts var KNOWN_CHECKSUMS = { + "aarch64-apple-darwin-0.12.4": "99a913b606194867b43086404412c1afe079547fee72ecfb6af7e7b0dd54b0c6", + "aarch64-pc-windows-msvc-0.12.4": "3290abffee78c30e3113f5113e26684fd057287e89124a588dcdcdd6ceec0fea", + "aarch64-unknown-linux-gnu-0.12.4": "49d881b3403187e1f1789720881e77e4251ad4259d86c4844862657d2a35d13f", + "aarch64-unknown-linux-musl-0.12.4": "04ed16e895b08065720e3d06cde722f0d406b63d116247d5e7776525c41f4972", + "arm-unknown-linux-musleabihf-0.12.4": "9657ea47619bae9097e92a942694c3bbead7bf37c5ccffa6a0f8b3f08a947dba", + "armv7-unknown-linux-gnueabihf-0.12.4": "fd9d223afc79a4d116d48269ea8cdc00cdeb0637d028843910650abc037e7c4f", + "armv7-unknown-linux-musleabihf-0.12.4": "c61f3c109fcb0c9cac2a3c232d50ccd70c422a5d4dae44dab007bdf5c1e64f0d", + "i686-pc-windows-msvc-0.12.4": "06a4948b908ce93af14c140158e15b5247ae6c8f15db50f3e4c6335bfd08b3fd", + "i686-unknown-linux-gnu-0.12.4": "bcf9e594c0867f9bfe91b7979cdac38a86bb9f7136ceba259e727af912127f23", + "i686-unknown-linux-musl-0.12.4": "d4c95044a507046f1ce9efdd00fb6873432a7d582a29d22febad26d92551586a", + "powerpc64le-unknown-linux-gnu-0.12.4": "6028a1744a7c07d789f21cf4c1574bb4bfe40f2980ac411af5bcbaeac32b0094", + "riscv64gc-unknown-linux-gnu-0.12.4": "dca9b15d76b5547987fc6b08fc1ea14e49773d9434b52825c68397c53896a139", + "riscv64gc-unknown-linux-musl-0.12.4": "cc481ddf7f9d09491b83defa9a221e1410f7a4b1ea160687e201815ba1d91a7a", + "s390x-unknown-linux-gnu-0.12.4": "9c6eea6ed43d8753e7eb26489a73ac060012e1a2485992955dd82a3b10b47acb", + "x86_64-apple-darwin-0.12.4": "e603f1eb634ca97a2a125539b983891f53235e901511ed10c32c08c86e253ecd", + "x86_64-pc-windows-msvc-0.12.4": "4f3b7d63cd81fca0da5a655d973d20affca89ce6e5f9a29fd0183cc4204a7639", + "x86_64-unknown-linux-gnu-0.12.4": "c8c60f47e6f88d18dbf6f33d7279fb1fbf7ae76631768152cf5578c3d65729b4", + "x86_64-unknown-linux-musl-0.12.4": "7aef04898775585d636424e52053e5328f2b1779175d5cb47665ff9d7524e8e7", "aarch64-apple-darwin-0.12.3": "546f7f8a6c70ff13a3a9d2bc958db3427298cebf3e0cb756f9177133b7068843", "aarch64-pc-windows-msvc-0.12.3": "4343217d668727b8a8eb5cad92389a1d2eeead93c89940d1b955ba1bb15462eb", "aarch64-unknown-linux-gnu-0.12.3": "bb66cb52e7b1823aed1183630d8d8e5c958840d584a4c55ec10a4cfc168dcca2", @@ -113335,6 +113353,7 @@ function formatVariants(entries) { // src/download/manifest.ts var cachedManifestData = /* @__PURE__ */ new Map(); +var MANIFEST_FETCH_ATTEMPTS = 3; async function fetchManifest(manifestUrl = VERSIONS_MANIFEST_URL) { const cachedManifest = cachedManifestData.get(manifestUrl); if (cachedManifest?.complete === true) { @@ -113413,8 +113432,24 @@ async function getArtifact(version3, arch3, platform2, manifestUrl = VERSIONS_MA }; } async function fetchManifestResponse(manifestUrl) { - info2(`Fetching manifest data from ${manifestUrl} ...`); - const response = await fetch2(manifestUrl, {}); + let response; + for (let attempt = 1; attempt <= MANIFEST_FETCH_ATTEMPTS; attempt++) { + info2(`Fetching manifest data from ${manifestUrl} ...`); + try { + response = await fetch2(manifestUrl, {}); + break; + } catch (error2) { + if (attempt >= MANIFEST_FETCH_ATTEMPTS) { + throw error2; + } + const delayMs = 1e3 * 2 ** (attempt - 1); + info2(`Manifest fetch failed; retrying in ${delayMs}ms ...`); + await new Promise((resolve3) => setTimeout(resolve3, delayMs)); + } + } + if (response === void 0) { + throw new Error("Manifest fetch attempts exhausted."); + } if (!response.ok) { throw new Error( `Failed to fetch manifest data: ${response.status} ${response.statusText}` From 92de172dfb0abfdc39196b118452b9f04a3c9d2e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 4 Sep 2026 06:43:14 +0000 Subject: [PATCH 5/5] fix: apply code build script --- dist/update-known-checksums/index.cjs | 39 +++++++++++++++++++++++++-- 1 file changed, 37 insertions(+), 2 deletions(-) diff --git a/dist/update-known-checksums/index.cjs b/dist/update-known-checksums/index.cjs index 0f7d473..6517b6b 100644 --- a/dist/update-known-checksums/index.cjs +++ b/dist/update-known-checksums/index.cjs @@ -59443,6 +59443,24 @@ var semver = __toESM(require_semver(), 1); // src/download/checksum/known-checksums.ts var KNOWN_CHECKSUMS = { + "aarch64-apple-darwin-0.12.4": "99a913b606194867b43086404412c1afe079547fee72ecfb6af7e7b0dd54b0c6", + "aarch64-pc-windows-msvc-0.12.4": "3290abffee78c30e3113f5113e26684fd057287e89124a588dcdcdd6ceec0fea", + "aarch64-unknown-linux-gnu-0.12.4": "49d881b3403187e1f1789720881e77e4251ad4259d86c4844862657d2a35d13f", + "aarch64-unknown-linux-musl-0.12.4": "04ed16e895b08065720e3d06cde722f0d406b63d116247d5e7776525c41f4972", + "arm-unknown-linux-musleabihf-0.12.4": "9657ea47619bae9097e92a942694c3bbead7bf37c5ccffa6a0f8b3f08a947dba", + "armv7-unknown-linux-gnueabihf-0.12.4": "fd9d223afc79a4d116d48269ea8cdc00cdeb0637d028843910650abc037e7c4f", + "armv7-unknown-linux-musleabihf-0.12.4": "c61f3c109fcb0c9cac2a3c232d50ccd70c422a5d4dae44dab007bdf5c1e64f0d", + "i686-pc-windows-msvc-0.12.4": "06a4948b908ce93af14c140158e15b5247ae6c8f15db50f3e4c6335bfd08b3fd", + "i686-unknown-linux-gnu-0.12.4": "bcf9e594c0867f9bfe91b7979cdac38a86bb9f7136ceba259e727af912127f23", + "i686-unknown-linux-musl-0.12.4": "d4c95044a507046f1ce9efdd00fb6873432a7d582a29d22febad26d92551586a", + "powerpc64le-unknown-linux-gnu-0.12.4": "6028a1744a7c07d789f21cf4c1574bb4bfe40f2980ac411af5bcbaeac32b0094", + "riscv64gc-unknown-linux-gnu-0.12.4": "dca9b15d76b5547987fc6b08fc1ea14e49773d9434b52825c68397c53896a139", + "riscv64gc-unknown-linux-musl-0.12.4": "cc481ddf7f9d09491b83defa9a221e1410f7a4b1ea160687e201815ba1d91a7a", + "s390x-unknown-linux-gnu-0.12.4": "9c6eea6ed43d8753e7eb26489a73ac060012e1a2485992955dd82a3b10b47acb", + "x86_64-apple-darwin-0.12.4": "e603f1eb634ca97a2a125539b983891f53235e901511ed10c32c08c86e253ecd", + "x86_64-pc-windows-msvc-0.12.4": "4f3b7d63cd81fca0da5a655d973d20affca89ce6e5f9a29fd0183cc4204a7639", + "x86_64-unknown-linux-gnu-0.12.4": "c8c60f47e6f88d18dbf6f33d7279fb1fbf7ae76631768152cf5578c3d65729b4", + "x86_64-unknown-linux-musl-0.12.4": "7aef04898775585d636424e52053e5328f2b1779175d5cb47665ff9d7524e8e7", "aarch64-apple-darwin-0.12.3": "546f7f8a6c70ff13a3a9d2bc958db3427298cebf3e0cb756f9177133b7068843", "aarch64-pc-windows-msvc-0.12.3": "4343217d668727b8a8eb5cad92389a1d2eeead93c89940d1b955ba1bb15462eb", "aarch64-unknown-linux-gnu-0.12.3": "bb66cb52e7b1823aed1183630d8d8e5c958840d584a4c55ec10a4cfc168dcca2", @@ -64651,6 +64669,7 @@ function info2(msg) { // src/download/manifest.ts var cachedManifestData = /* @__PURE__ */ new Map(); +var MANIFEST_FETCH_ATTEMPTS = 3; async function fetchManifest(manifestUrl = VERSIONS_MANIFEST_URL) { const cachedManifest = cachedManifestData.get(manifestUrl); if (cachedManifest?.complete === true) { @@ -64691,8 +64710,24 @@ async function getLatestVersion(manifestUrl = VERSIONS_MANIFEST_URL) { return latestVersion; } async function fetchManifestResponse(manifestUrl) { - info2(`Fetching manifest data from ${manifestUrl} ...`); - const response = await fetch2(manifestUrl, {}); + let response; + for (let attempt = 1; attempt <= MANIFEST_FETCH_ATTEMPTS; attempt++) { + info2(`Fetching manifest data from ${manifestUrl} ...`); + try { + response = await fetch2(manifestUrl, {}); + break; + } catch (error2) { + if (attempt >= MANIFEST_FETCH_ATTEMPTS) { + throw error2; + } + const delayMs = 1e3 * 2 ** (attempt - 1); + info2(`Manifest fetch failed; retrying in ${delayMs}ms ...`); + await new Promise((resolve) => setTimeout(resolve, delayMs)); + } + } + if (response === void 0) { + throw new Error("Manifest fetch attempts exhausted."); + } if (!response.ok) { throw new Error( `Failed to fetch manifest data: ${response.status} ${response.statusText}`