fix(scripts): check-i18n-en-drift 的显式 base 提为权威,解析不出即失败 (#3766) - #3821
Merged
Conversation
`resolveBaseRef` 原先把显式 `--base` / `OS_I18N_DRIFT_BASE` 仅当作候选链的
第一环。解析不出时它继续往下猜,拿 `merge-base with origin/main` 之类的
另一个提交当基准把比对做完,并打印一行自信的绿灯 —— 摘要行里的
`(--base …)` 也被换成了实际用的那一环,读日志的人看不出自己指的基准被
忽略了。「你指的 base 不存在」和「你没指 base」是两件不同的事,只有后者
可以靠猜回答。
显式来源现在是权威:给出即只查它,解析不出直接
`{ ok: false, named: true }`,并给一条针对性提示(你指的 base 在这个 clone
里不存在),而不是「去 fetch base 分支」。未指定显式 base 时的发现链
(GITHUB_BASE_REF -> origin/main -> main)行为完全不变 —— CI 的
`pnpm check:i18n-drift` 不传 `--base`,走的正是这条路径。
形状直接照抄 `scripts/check-changeset-presence.mjs:209`(同族缺陷先在那里
被它自己的测试抓到),连同钉住它的用例;该文件里那句「sibling 仍是跌落
形状」的注释随之更正。`resolveBaseRef` 补上 JSDoc `@param`,否则
`explicit` 会被 TS 从默认值推成 `null`,任何传显式 base 的测试都编译不过。
反向验证(方向先判后跑):恢复跌落写法 -> 新用例红,门禁 exit 0 并打印
「Every changed en value was followed…」;修好 -> exit 1 + named 提示。
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Collaborator
Author
|
✅ 验收通过(objectui 分片 PM,session_01GTRjn8xBqp75dk7kFupVRt)—— undraft + auto-merge。 核验:净 diff 3 文件;named base 权威形状按 Generated by Claude Code |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #3766
问题
scripts/check-i18n-en-drift.mjs的resolveBaseRef把显式指定的基准(--base、OS_I18N_DRIFT_BASE)仅当作候选链的第一环。解析不出时它不失败,而是继续往下猜,拿merge-base with origin/main之类的另一个提交当基准把比对做完,并打印一行自信的绿灯 —— 摘要行里的(--base …)也被换成了实际用的那一环,读日志的人看不出自己指的基准被忽略了。「你指的 base 在这个 clone 里不存在」和「你没指 base」是两件不同的事,只有后者可以靠猜回答。
修法
显式来源提为权威:给出即只查它,解析不出直接返回
{ ok: false, named: true },并给一条针对性提示(你指的 base 在这个 clone 里不存在),而不是原来那句会把人带偏的「去 fetch base 分支」。形状是仓内先例
scripts/check-changeset-presence.mjs:209的直移植 —— 同族缺陷先在那里被它自己的测试抓到(#3762),两个resolveBaseRef现在又是同一形状。该文件里那句「sibling 仍是跌落形状,另行开单」的注释随之更正。resolveBaseRef另补了 JSDoc@param:没有它,explicit会被 TS 从默认值null推成null | undefined,任何传显式 base 的测试都过不了pnpm type-check:scripts(先例文件的测试从不传explicit,所以那边没暴露)。这是在生产者声明契约,而不是在测试里加 cast。修好前后 exit 对照(本仓真实实测)
缺陷版(= 改动前的形状),显式给一个本 clone 里不存在的 sha:
修好后,同一条命令:
另一个显式入口
OS_I18N_DRIFT_BASE同权威、同失败:候选链不变的证明
只有「你指了但解析不出」这一情形从猜测变失败;没指定显式 base 时的发现链完全不变。CI 的
pnpm check:i18n-drift不传--base,走的正是这条路径。(--base …)而不是替换成别的候选:新增用例直接钉链路完整(
keeps guessing through the whole chain when NO base was named):无显式 base 时,GITHUB_BASE_REF指向本 clone 没有的分支 -> 继续跌落到merge-base with origin/main;在完全没有origin的 clone 里 -> 跌落到链尾的本地main。链首链尾都测到,不是只测了链首。原有的
prefers the merge base with the PR base branch when CI names one与fails loudly rather than passing when there is no base to diff两条未改动,仍绿。两个 workflow 里描述 base 解析的注释(
ci.yml的fetch-depth: 0、changeset-presence.yml关于 merge_group 跌落到origin/main)描述的都是发现链,未受影响,无需改动 —— 已逐条核对。反向验证(方向先判后跑)
预判:恢复跌落写法后,新用例应当红,且门禁 exit 0 并打印那句绿灯 —— 因为 fixture 仓里
merge-base with main解析得到 HEAD,与工作树同内容,0 个 en 变更。跑出来正是如此:修好后同两条绿。这与
check-changeset-presence.test.ts用例注释里记录的方向(exit 0 -> 1)一致。新增用例
落在
scripts/__tests__/check-i18n-en-drift.test.ts既有的resolving the commit to compare against块里,沿用本文件的形态(throwaway git 仓 + 真跑 CLI 钉 exit code):FAILS on an explicitly named --base that does not exist — it does NOT fall back—— 真跑 CLI,断言 exit 1、(unresolved)、named EXPLICITLY,并显式断言不含它过去产生的那句绿灯。FAILS the same way on an OS_I18N_DRIFT_BASE that does not exist—— 另一个显式入口。为此给runGate加了可选的envOverrides(其余用例仍照旧清空这两个 env var)。consults NOTHING but the named base — not even a candidate that would resolve—— 直接钉机理:tried只有一条。此仓同时备好了GITHUB_BASE_REF=main和真实的origin/main,发现候选本来能解析出基准,所以单条tried就是「它根本没被问」的证据。still resolves a named base that DOES exist, and --base outranks the env var—— 权威不等于总是失败:好 sha 照常解析,--base优先于 env var。keeps guessing through the whole chain when NO base was named—— 上面「候选链不变」的第 3 条。验证
改动三个文件另跑了一次控制字节自查(
grep -naP覆盖闸门不扫的0x01-0x1f),零命中。Changeset
不带。
node scripts/check-changeset-presence.mjs实跑结论:3 file(s) changed, 0 of them under the src/ of a package the release covers->No source of a released package changed in this range, so no changeset is owed.——scripts/**在发版包守卫面外,与 #3273 / #3784 先例一致。门禁本身也不是用户可见的运行时行为。影响面
今天的 CI 路径不受影响(不传
--base,走GITHUB_BASE_REF那一环)。受影响的是该脚本对外声明支持的两个显式入口 —— 复现历史提交、跨 worktree 比对、以及该门禁自身测试所用的入口:它们从「静默拿错基准报绿」变成「明确失败并说清原因」。Generated by Claude Code