跳到主要内容

assertSwitchTargetIntact()

function assertSwitchTargetIntact(executor, targetBranchId): Promise<void>;

Defined in: packages/rxdb-plugin-working-tree/src/working-tree/switch-branch-options.ts:138

校验目标分支的提交图可达完好(FR-051、SC-013)。

Parameters​

ParameterTypeDescription
executorTransactionExecutor调用方那个只读事务的执行器
targetBranchIdstring要切过去的分支 id

Returns​

Promise<void>

Throws​

BranchNotMaterializedError 目标只有 metadata、本地还没有它的提交图时

Throws​

CommitGraphCorruptedError 目标分支已被标记损坏,或可达父链上有一处对不上

Remarks​

先判物化状态,再谈损坏。 一条 metadata-only 的远端分支(FR-044/049)没有 ref、 或者有一行 HEAD 为空的 ref,而损坏守卫读不到 ref 时抛的是一句「迁移没为它建行」—— 那句话对着一条本来就该先物化的分支是错的诊断,会把用户引去查迁移。 判在前面之后,它拿到的是 branch_not_materialized,而那个码上挂着可操作的下一步。

到得了这里说明 takeOverBranchSwitch 没有接管这次切换(本连接没登记快照来源,或调用方 绕开 rxdb.switchBranch() 直接打到了适配器),所以成因写作 source_unavailable, attemptId 是 null——一次尝试都还没开始。

判定整个转交 assertCommitGraphIntact,本模块一个字面量都不重复:FR-051 要的是 「实现为共享 guard,不得各写一份」。抄一份出来一开始逐字段相同,直到某次只改了守卫、 没改抄件——而那一刻两边的用例都还是绿的。

查的是 targetBranchId,不是当前分支。另外三处调用点(commit / restore / discard)全写作 assertCommitGraphIntact(executor, token.branchId),照抄过来正好把方向弄反: 切进坏分支畅通无阻,切离坏分支反被拒——而「切离」恰恰是 FR-051 明文允许的三件事之一。

只读。损坏标记由 markBranchCorrupted() 在另一个事务里落;写进这次必然回滚的事务里, 标记会跟着一起消失,用户永远诊断不出来。