From 9e33cb8ba89885f1ae8c05ac6e175bab4b6df9f0 Mon Sep 17 00:00:00 2001 From: Jeffery Date: Fri, 26 Jun 2026 11:43:16 +0800 Subject: [PATCH] =?UTF-8?q?fix(release-cleanup):=20selectReleasesToDelete?= =?UTF-8?q?=20=E5=9C=A8=E6=99=82=E9=96=93=E7=9B=B8=E5=90=8C=E6=99=82?= =?UTF-8?q?=E4=BB=A5=20id=20=E6=B1=BA=E5=AE=9A=E9=A0=86=E5=BA=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 排序加入次要鍵(id 數值,大者視為新),避免多筆 created_at 相同時保留/ 刪除的選擇因引擎排序穩定性而不確定。 Co-Authored-By: Claude Opus 4.8 (1M context) --- app/releases.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/releases.js b/app/releases.js index c975fe5..2c65042 100644 --- a/app/releases.js +++ b/app/releases.js @@ -18,9 +18,14 @@ export function selectReleasesToDelete(releases, keepCount) { return Number.isNaN(time) ? 0 : time } // 先一次性計算每筆的時間戳,避免在排序比較中重複呼叫 Date.parse。 + // 時間相同時以 id(數值,大者為新)作為次要鍵,確保排序結果具決定性。 return releases - .map((release) => ({ release, time: createdTime(release) })) - .sort((a, b) => b.time - a.time) + .map((release) => ({ + release, + time: createdTime(release), + id: Number(release?.id) || 0, + })) + .sort((a, b) => b.time - a.time || b.id - a.id) .map((entry) => entry.release) .slice(keepCount) }