From 5ccd85c8a97ea46c1daf6724364d63cf062012b1 Mon Sep 17 00:00:00 2001 From: enki Date: Thu, 2 Jul 2026 08:51:52 -0700 Subject: [PATCH] release-codeberg: resume interrupted uploads Skip release assets already uploaded at the same size instead of deleting and re-uploading everything, so a re-run picks up where it left off. Co-Authored-By: Claude Opus 4.8 --- apps/desktop/scripts/release-codeberg.mjs | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/apps/desktop/scripts/release-codeberg.mjs b/apps/desktop/scripts/release-codeberg.mjs index 1cbc5b4f9d..e556b44a3a 100644 --- a/apps/desktop/scripts/release-codeberg.mjs +++ b/apps/desktop/scripts/release-codeberg.mjs @@ -77,18 +77,23 @@ async function main() { } const release = await getOrCreateRelease(); - const existing = new Map((release.assets ?? []).map((a) => [a.name, a.id])); + const existing = new Map((release.assets ?? []).map((a) => [a.name, a])); for (const file of files) { const name = basename(file); - if (existing.has(name)) { - await api(`/repos/${OWNER}/${REPO}/releases/${release.id}/assets/${existing.get(name)}`, { - method: "DELETE", - }); - } const filePath = join(distDir, file); - const sizeMB = (statSync(filePath).size / 1e6).toFixed(0); - process.stdout.write(`Uploading ${name} (${sizeMB} MB)... `); + const size = statSync(filePath).size; + const already = existing.get(name); + // Resume: skip assets already uploaded at the same size (lets a re-run + // finish where it left off instead of re-uploading everything). + if (already && already.size === size) { + console.log(`Skipping ${name} (already uploaded)`); + continue; + } + if (already) { + await api(`/repos/${OWNER}/${REPO}/releases/${release.id}/assets/${already.id}`, { method: "DELETE" }); + } + process.stdout.write(`Uploading ${name} (${(size / 1e6).toFixed(0)} MB)... `); // Upload via curl: Node's built-in fetch (undici) times out on large files // (UND_ERR_HEADERS_TIMEOUT). curl streams from disk with no such limit. execFileSync(