Phase 9 R1a: peer RepoEnsure/RepoRelease RPC (0x1e/0x1f)

New per-peer RPCs to shallow-clone a (url, git_ref) under a caller-
provided workspace namespace, and to release the checkout. Fleet
fan-out via the aggregator ships separately in R1b.

- src/cluster/repo_ensure.rs: request/reply types + derive_path
  (traversal-safe, blake3-hashed url segment), ensure_repo (cache
  hit → rev-parse HEAD, else remove-and-reclone with 5-min timeout),
  release_repo (idempotent rm)
- src/cluster/rpc.rs: Method::RepoEnsure=0x1e, RepoRelease=0x1f,
  RpcRouter::with_repo_root builder, two dispatch arms returning
  NotConfigured when repo_root is unset
- src/cluster.rs: pub mod repo_ensure
- src/actions.rs: fix pre-existing test-only Config init missing the
  aggregator field (unblocks lib tests)

Tests: 6 unit tests covering path derivation determinism, ref/url
independence, traversal safety, and sanitizer edge cases. All pass.
This commit is contained in:
Omar Sobh
2026-07-15 03:42:27 -07:00
parent 3b40a94115
commit a3fe1d147c
4 changed files with 323 additions and 0 deletions
+1
View File
@@ -128,6 +128,7 @@ mod tests {
peer: None,
cluster: None,
api_token: None,
aggregator: None,
}
}