From d5f8b2d4ea1d4c1601afaaffc712e4e07d1d93fa Mon Sep 17 00:00:00 2001 From: "Scott E. Graves" Date: Sat, 13 Sep 2025 22:04:15 -0500 Subject: [PATCH] revert --- src/api.js | 182 ++++++++++++++++++++++++----------------------------- 1 file changed, 82 insertions(+), 100 deletions(-) diff --git a/src/api.js b/src/api.js index 1d71242..1c726c8 100644 --- a/src/api.js +++ b/src/api.js @@ -62,131 +62,113 @@ const getBucketFiles = async (folderName) => { Prefix: folderKey, }), ); - - const ret = (data.Contents || []) - .filter((item) => item.Key !== folderKey) + const ret = data.Contents.filter((item) => item.Key !== folderKey) .map((item) => { - const d = - item.LastModified instanceof Date - ? item.LastModified - : new Date(item.LastModified); return { - date: d - .toLocaleDateString("en-US", { - year: "numeric", - month: "2-digit", - day: "2-digit", - hour: "2-digit", - minute: "2-digit", - second: "2-digit", - }) - .replace(/,/g, ""), - sort: d.getTime(), + date: item.LastModified.toLocaleDateString("en-US", { + year: "numeric", + month: "2-digit", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + second: "2-digit", + }).replace(/,/g, ""), + sort: item.LastModified.getTime(), name: item.Key.replace(folderKey, ""), key: item.Key, }; }) - .sort((a, b) => (a.sort > b.sort ? -1 : a.sort < b.sort ? 1 : 0)); - + .sort((a, b) => { + return a.sort > b.sort ? -1 : a.sort < b.sort ? 1 : 0; + }); const itemCount = {}; const ext = ".tar.gz"; - // ----- choose which tars to keep (apply nightly retention) ----- - const baseTars = ret.filter((item) => item.name.endsWith(ext)); - const keepTarKeys = new Set(); - - for (const t of baseTars) { - if (folderName === "nightly") { - const parts = t.name.split("_"); - // parts[0]=product, parts[3]=platform, parts[4]=arch - const groupId = `${parts[0]}_${parts[3]}_${parts[4]}`; - itemCount[groupId] = itemCount[groupId] || 0; - - if (++itemCount[groupId] <= 3) { - keepTarKeys.add(t.key); - } else { - // mark old: tar + sidecars - if (!oldItems.includes(t.key)) { - oldItems.push(t.key, t.key + ".sha256", t.key + ".sig"); + const filteredItems = ret + .filter((item) => item.name.endsWith(ext)) + .filter((item) => { + if (folderName === "nightly") { + const parts = item.name.split("_"); + const groupId = `${parts[0]}_${parts[3]}_${parts[4]}`; + itemCount[groupId] = itemCount[groupId] || 0; + if (++itemCount[groupId] <= 3) { + return true; } - // windows companion - if (parts[3] === "windows") { - const setup_key = - t.key.substring(0, t.key.length - ext.length) + "_setup.exe"; - const setup_item = ret.find((x) => x.key === setup_key); - if (setup_item && !oldItems.includes(setup_key)) { - oldItems.push( - setup_key, - setup_key + ".sha256", - setup_key + ".sig", - ); - } - } - // darwin companion (.dmg) - if (parts[3] === "darwin") { - const dmg_key = - t.key.substring(0, t.key.length - ext.length) + ".dmg"; - const dmg_item = ret.find((x) => x.key === dmg_key); - if (dmg_item && !oldItems.includes(dmg_key)) { - oldItems.push(dmg_key, dmg_key + ".sha256", dmg_key + ".sig"); + if (!oldItems.find((key) => key === item.key)) { + oldItems.push(item.key); + oldItems.push(item.key + ".sha256"); + oldItems.push(item.key + ".sig"); + + if (parts[3] === "windows") { + const setup_key = + item.key.substring(0, item.key.length - ext.length) + + "_setup.exe"; + + const setup_item = ret.find((item) => item.key == setup_key); + if (setup_item) { + oldItems.push(setup_key); + oldItems.push(setup_key + ".sha256"); + oldItems.push(setup_key + ".sig"); + } } } + return false; } - } else { - keepTarKeys.add(t.key); - } - } + return true; + }); - // ----- build final output without splicing while iterating ----- - const byKey = Object.fromEntries(ret.map((r) => [r.key, r])); - const out = []; + const totalCount = filteredItems.length * 3; + const setup_items = []; + let setup_offset = 0; + for (let i = 0; i < totalCount && i < filteredItems.length; i += 3) { + const parts = filteredItems[i].name.split("_"); + let item = ret.filter( + (item) => item.name === filteredItems[i].name + ".sha256", + ); + filteredItems.splice(i + 1, 0, ...item); + item = ret.filter((item) => item.name === filteredItems[i].name + ".sig"); + filteredItems.splice(i + 2, 0, ...item); - for (const t of baseTars) { - if (!keepTarKeys.has(t.key)) continue; - - const parts = t.name.split("_"); - - // 1) tar + sidecars - out.push(t); - const tarSha = byKey[t.key + ".sha256"]; - if (tarSha) out.push(tarSha); - const tarSig = byKey[t.key + ".sig"]; - if (tarSig) out.push(tarSig); - - // 2) windows companion: _setup.exe + sidecars if (parts[3] === "windows") { const setup_key = - t.key.substring(0, t.key.length - ext.length) + "_setup.exe"; - const setup = byKey[setup_key]; - if (setup) { - out.push(setup); - const setupSha = byKey[setup_key + ".sha256"]; - if (setupSha) out.push(setupSha); - const setupSig = byKey[setup_key + ".sig"]; - if (setupSig) out.push(setupSig); - } - } + filteredItems[i].key.substring( + 0, + filteredItems[i].key.length - ext.length, + ) + "_setup.exe"; - // 3) darwin companion: .dmg + sidecars - if (parts[3] === "darwin") { - const dmg_key = t.key.substring(0, t.key.length - ext.length) + ".dmg"; - const dmg = byKey[dmg_key]; - if (dmg) { - out.push(dmg); - const dmgSha = byKey[dmg_key + ".sha256"]; - if (dmgSha) out.push(dmgSha); - const dmgSig = byKey[dmg_key + ".sig"]; - if (dmgSig) out.push(dmgSig); + const setup_item = ret.find((item) => item.key == setup_key); + if (setup_item) { + const setup_item2 = ret.find( + (item) => item.key == setup_key + ".sha256", + ); + const setup_item3 = ret.find( + (item) => item.key == setup_key + ".sig", + ); + setup_items.push([ + { idx: i + 3 + setup_offset }, + setup_item, + setup_item2, + setup_item3, + ]); + setup_offset += 3; } } } - return out; + if (setup_items.length > 0) { + setup_items.forEach((items) => { + filteredItems.splice(items[0].idx, 0, items[1]); + filteredItems.splice(items[0].idx + 1, 0, items[2]); + filteredItems.splice(items[0].idx + 2, 0, items[3]); + }); + } + + return filteredItems; } catch (err) { console.error(err); - // make sure we always return an array for callers - return []; } + + return []; }; export { cleanOldItems, createDownloadLink, getBucketFiles };