任务:SVN 只读系统包,给 adoc 生产器按修订号成批取原件
依据:
docs/hub-r4-kb-direction.md第一节:作者结构由 Hub 直接读 adoc;docs/hub-r4-research/kb-real-sources.md的 adoc 一节:真实服务器的形状和按修订号读的核实;- B04:读外部系统记为观察,响应原样存为原件;
hub/connectors/README.md:网络只由核心做,包里只放请求模板和解析函数;- 先例:
packs/system/openkm(WebDAV 加 Basic 认证,只读)。
真实的 SVN 服务器是 mod_dav_svn(HTTP 上的 WebDAV/DeltaV),支持 HTTP v2:
- 每个目录在
DAV:version-name里带最后修改的修订号; <仓库根>/!svn/rvr/<修订号>/<路径>按修订号读;按目录的修订号读到的字节和直接读最新的相同。
服务器地址、仓库路径和账号都是部署数据,不进 Git。
- 分支和工作树:
kb-svn,目录circle-hub-kb-svn(依赖已装好) - 可以改的路径:
packs/system/svn/**(新包)和它的测试、README。hub/connectors/**只在方法或认证确实不够用时才改,先回报;contracts/缺什么先回报。 - 规则:同前(不推送、不建 PR、不发布、不部署;不碰 7420、钥匙串、环境配置文件和任何真实系统;测试只用本机回环上的合成假服务;
git commit -s)。 - 验证:
npx tsc --noEmit;node --test --test-concurrency=1对packs/system/**、hub/connectors/**。
要做的
- 系统包
system@1,一个角色:仓库根地址,由资源记录给出。认证照 openkm:static_header,Basic,凭据只在密钥库。只有读路由:- 目录的修订号:在最新版本上对一个目录
PROPFIND,Depth: 0,取version-name; - 按修订号列目录:
PROPFIND /!svn/rvr/{rev}/{dir*}/,Depth: 1,取每个成员的名字、是否目录、大小和修订号; - 按修订号读文件:
GET /!svn/rvr/{rev}/{path*}。
修订号只收数字;路径参数的约束照 openkm;不跟随列表里的链接。PUT、MKCOL、MERGE、CHECKOUT、POST 等写方法一律不在路由里。
- 目录的修订号:在最新版本上对一个目录
- 读类型,照 openkm 的
reads写:- 一个目录:先取修订号,再在这个修订号上列出;
- 按修订号读一个文件。
产品包的同步计划会组合它们:同一组文件在同一个修订号上读。外部标识里带修订号,原件记请求摘要和修订号。
- 解析:PROPFIND 的 XML 用 xml@1。真实服务器的元素带命名空间前缀(
D:),response元素还带xmlns属性,两种都要认;href 可能有百分号编码,按解码后的路径比较;目录带尾斜杠。 - 测试:本机回环上的假服务按上面的真实形状应答。要覆盖:
- 白名单外的方法和路径被拒;
- 修订号不是数字被拒;
- 401 就停,不重试;静态头没有登录流程;
- 凭据不出现在日志、原件和错误信息里;
- 列表里的修订号比目录的大时报错,不悄悄接受;
- 同一修订号读两次,字节相同。
- README:读法、批次身份、怎样配置(资源记录和密钥的名字,不写值)。
完成后在终端里回报:提交号、测试数量、没做完或拿不准的地方。接真实服务器由集成者做。