From aa1bf5cd109c573b0165e73563011a26f1ee176b Mon Sep 17 00:00:00 2001 From: Bassam Khouri Date: Mon, 15 Jun 2026 14:46:48 -0400 Subject: [PATCH 1/2] Add retry when retrieving PR information Fixes: #283 --- .../workflows/scripts/cross-pr-checkout.swift | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/.github/workflows/scripts/cross-pr-checkout.swift b/.github/workflows/scripts/cross-pr-checkout.swift index d9f1ed2a..c4fdea34 100644 --- a/.github/workflows/scripts/cross-pr-checkout.swift +++ b/.github/workflows/scripts/cross-pr-checkout.swift @@ -117,11 +117,23 @@ func getPRInfo(repository: String, prNumber: String) async throws -> PRInfo { throw GenericError("Failed to form URL for GitHub API") } - do { - let data = try await downloadData(from: prInfoUrl) - return try JSONDecoder().decode(PRInfo.self, from: data) - } catch { - throw GenericError("Failed to load PR info from \(prInfoUrl): \(error)") + let maxAttempts = 5 + var attempt = 1 + while true { + do { + let data = try await downloadData(from: prInfoUrl) + return try JSONDecoder().decode(PRInfo.self, from: data) + } catch { + if attempt == maxAttempts { + throw GenericError("Failed to load PR info from \(prInfoUrl) after \(maxAttempts) attempts: \(error)") + } + let delaySeconds = UInt64(1 << (attempt - 1)) + print( + "Failed to load PR info from \(prInfoUrl) (attempt \(attempt) of \(maxAttempts)): \(error). Retrying in \(delaySeconds)s..." + ) + try await Task.sleep(nanoseconds: delaySeconds * 1_000_000_000) + attempt += 1 + } } } From 465ede8096a79f79110c44b758063b23ab9affbd Mon Sep 17 00:00:00 2001 From: "Bassam (Sam) Khouri" Date: Fri, 19 Jun 2026 16:56:04 -0400 Subject: [PATCH 2/2] Update .github/workflows/scripts/cross-pr-checkout.swift Co-authored-by: Alex Hoppen --- .github/workflows/scripts/cross-pr-checkout.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/scripts/cross-pr-checkout.swift b/.github/workflows/scripts/cross-pr-checkout.swift index c4fdea34..f2cfd87c 100644 --- a/.github/workflows/scripts/cross-pr-checkout.swift +++ b/.github/workflows/scripts/cross-pr-checkout.swift @@ -131,7 +131,7 @@ func getPRInfo(repository: String, prNumber: String) async throws -> PRInfo { print( "Failed to load PR info from \(prInfoUrl) (attempt \(attempt) of \(maxAttempts)): \(error). Retrying in \(delaySeconds)s..." ) - try await Task.sleep(nanoseconds: delaySeconds * 1_000_000_000) + try await Task.sleep(for: .seconds(delaySeconds)) attempt += 1 } }