Documentation
¶
Overview ¶
Package worktree 工作区隔离的**声明面与冲突判据**(不碰真实文件系统)。
为什么是「声明面」而不是「实现」 ¶
本仓至今不碰 FS 语义:建目录、挂载、chroot、git worktree 都是宿主与执行后端 的事。但**并行工作区之间会不会互相踩**这件事没有人判——两个 agent 各自 「在自己的目录里工作」,而它们的可写区完全重叠时,任何一边的写入都会 让另一边的结论失效,报告里却只有两份「各自成功」。
故本包只做三件可机械判定的事:
- **声明**:每个工作区声明它的可写区与只读区(@@Workspace@@);
- **自检**:声明本身不能自相矛盾(同一工作区里既只读又可写、路径穿出 工作区、绝对路径……);
- **冲突判据**:两个工作区的**可写区重叠**即冲突(@@Plan.Conflicts@@)。 只读区重叠不算——多个人读同一份文件没有危害,而**写**没有第二份真相。
fail-closed 的方向 ¶
@@CanWrite@@ / @@CanRead@@ 在「没有任何声明命中」时返回 false。默认允许会让 一个漏写的声明变成**全域可写**,而漏写在配置里看不出来(它只是「少了一行」)。
不支持通配(写明的局限) ¶
只支持三种形态:**目录前缀**(以 / 结尾)、**后缀**(以 . 开头)、 **精确路径**。不支持 * 与 **:它们的语义(是否跨层、是否匹配目录本身) 各实现不同,一旦进了契约就会出现「按 A 的理解写、按 B 的理解判」的夹缝。 需要更强表达力时,宿主自己展开成多条精确声明——展开是宿主的活,判定归本包。
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type Conflict ¶
type Conflict struct {
// A, B 冲突的两个工作区 id(按字典序,A < B)。
A, B string
// PatternA, PatternB 命中的声明项(让维护者知道该改哪一条)。
PatternA, PatternB string
// Why 人读的说明。
Why string
}
Conflict 两个工作区之间的可写区冲突。
type Plan ¶
type Plan struct {
// contains filtered or unexported fields
}
Plan 一组工作区的声明。
func New ¶
New 建计划并做**声明自检**(任一不满足即报错,不静默修正)。
自检项:
- ID 非空且唯一;
- 声明项非空串(空串会匹配一切);
- 声明项不得以 / 开头(绝对路径让「分区」这件事失去意义);
- 声明项不得含 ..(穿出工作区);
- **同一工作区里可写区与只读区不得重叠**(既只读又可写是自相矛盾, 而两边的读取者会得到不同的结论)。
Click to show internal directories.
Click to hide internal directories.