From 8346865481f513ba680a1134bc0ab07b173affbc Mon Sep 17 00:00:00 2001 From: ddcat666 <26564566+ddcat666@users.noreply.github.com> Date: Sat, 26 Sep 2026 17:30:17 +0800 Subject: [PATCH] =?UTF-8?q?fix(ci):=20=E8=B4=A8=E9=87=8F=E6=A3=80=E6=9F=A5?= =?UTF-8?q?=20-=20=E5=A4=84=E7=90=86=E5=BC=BA=E5=88=B6=E6=8E=A8=E9=80=81?= =?UTF-8?q?=E5=90=8E=E7=9A=84=E5=9F=BA=E5=87=86=E6=8F=90=E4=BA=A4=E7=BC=BA?= =?UTF-8?q?=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- web/scripts/check-changed-formatting.mjs | 15 +++++++++++++-- web/test/ci-formatting.test.mjs | 12 ++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/web/scripts/check-changed-formatting.mjs b/web/scripts/check-changed-formatting.mjs index 1a3225354..f1a9a91dd 100644 --- a/web/scripts/check-changed-formatting.mjs +++ b/web/scripts/check-changed-formatting.mjs @@ -12,8 +12,19 @@ export async function checkChangedFormatting({ cwd = process.cwd(), baseSha = pr return result.stdout; }; const head = git(["rev-parse", "--verify", `${headSha}^{commit}`]).trim(); - // 新分支/tag 的 before 为全零;首次提交没有父提交,改为检查整棵树。 - const base = baseSha && !/^0+$/.test(baseSha) ? git(["rev-parse", "--verify", `${baseSha}^{commit}`]).trim() : git(["rev-list", "--parents", "-n", "1", head]).trim().split(" ")[1]; + const parent = git(["rev-list", "--parents", "-n", "1", head]).trim().split(" ")[1] || null; + let base = parent; + if (baseSha && !/^0+$/.test(baseSha)) { + // 强制改写提交历史后,push 事件里的 before 可能已不在 checkout 中; + // 对合法但失效的 SHA 退回当前父提交,仍校验本次提交的完整改动。 + if (!/^[0-9a-f]{40}$/i.test(baseSha)) throw new Error(`Invalid base SHA: ${baseSha}`); + const resolved = spawnSync("git", ["rev-parse", "--verify", `${baseSha}^{commit}`], { cwd, encoding: "utf8" }); + if (resolved.status === 0) { + base = resolved.stdout.trim(); + } else { + log(`Base SHA ${baseSha} is unavailable; checking against the head parent instead.`); + } + } const files = (base ? git(["diff", "--relative", "--name-only", "--diff-filter=ACMR", "-z", base, head, "--", "."]) : git(["ls-tree", "-r", "--name-only", "-z", head, "--", "."])) .split("\0") .filter((file) => /\.(css|html|json|js|jsx|md|mdx|mjs|cjs|ts|tsx|yaml|yml)$/.test(file)); diff --git a/web/test/ci-formatting.test.mjs b/web/test/ci-formatting.test.mjs index 948eecce8..06aa0f201 100644 --- a/web/test/ci-formatting.test.mjs +++ b/web/test/ci-formatting.test.mjs @@ -71,9 +71,17 @@ describe("changed-file formatting gate", () => { expect(repo.messages).toEqual([]); }); - test("invalid explicit base SHA fails closed", async () => { + test("unavailable explicit base SHA falls back to the head parent", async () => { const repo = fixture(); - await expect(repo.check({ baseSha: "f".repeat(40) })).rejects.toThrow("git rev-parse"); + repo.write("changed.ts", "const value=1;\n"); + repo.commit(); + await expect(repo.check({ baseSha: "f".repeat(40) })).rejects.toThrow("changed.ts"); + expect(repo.messages).toContain(`Base SHA ${"f".repeat(40)} is unavailable; checking against the head parent instead.`); + }); + + test("malformed explicit base SHA fails closed", async () => { + const repo = fixture(); + await expect(repo.check({ baseSha: "not-a-sha" })).rejects.toThrow("Invalid base SHA"); }); test("zero before SHA compares the parent commit", async () => {