Build with clawstor cache / Cargo build (clawstor-cached) (pull_request) Failing after 6s
Wires the Phase 7f ref-tracking primitives to a real Gitea. New
CLI `claw-store cluster-ref-sweep --gitea-url <> [--gitea-token]
[--retention-days N]` queries every distinct repo we've recorded
against, fetches its live branches + tags, computes the stale set
via RefTracking::stale_at, and prints the stale fingerprints
grouped by repo.
Dry-run only in this cut. Deletion is separate — the operator
decides whether to call `forget` per fp, and whether to also
prune the corresponding blob/tag. Blob eviction happens via
cluster-gc as usual (dead refs no longer contribute to any pin).
New module cluster:
* GiteaClient::new(base_url, token) — reqwest with 15s timeout,
rustls-tls (reuses the rustls stack quinn already pulls in).
* live_refs(repo) — fetches /branches + /tags concurrently,
paginated (page 200 hard cap for safety), returns HashSet.
* 404 on either endpoint returns empty set — deleted repos then
flow through stale_at as "all refs dead", the correct default.
Deps:
* reqwest 0.12 with rustls-tls + json, default-features off (no
native-tls / openssl chain).
* clap 4 + "env" feature so --gitea-token can read GITEA_TOKEN.
+2 tests (validate_repo shape, client trims trailing slash).
Full test suite: 367 pass (+2). Pre-existing macOS
hot::tests::test_project_target_size_bytes failure unchanged.
82 lines
3.6 KiB
TOML
82 lines
3.6 KiB
TOML
[package]
|
||
name = "claw-store"
|
||
version = "0.3.0"
|
||
edition = "2021"
|
||
|
||
[[bin]]
|
||
name = "claw-store"
|
||
path = "src/main.rs"
|
||
|
||
# Phase 5b: fingerprint-keyed cargo build cache CLI. Wraps `cargo build`
|
||
# with a peer-cache lookup: hit → download+restore, miss → build+capture+upload.
|
||
# Uses the same identity/config surface as claw-store daemon.
|
||
[[bin]]
|
||
name = "claw-cargo"
|
||
path = "src/claw_cargo.rs"
|
||
|
||
[dependencies]
|
||
clap = { version = "4", features = ["derive", "env"] }
|
||
serde = { version = "1", features = ["derive"] }
|
||
toml = "0.8"
|
||
tokio = { version = "1", features = ["full"] }
|
||
sysinfo = "0.30"
|
||
anyhow = "1"
|
||
tracing = "0.1"
|
||
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
|
||
chrono = { version = "0.4", features = ["serde"] }
|
||
axum = { version = "0.7", features = ["macros"] }
|
||
tower-http = { version = "0.5", features = ["cors", "fs"] }
|
||
tokio-stream = "0.1"
|
||
serde_json = "1"
|
||
# v0.2.0 — flock(2) wrapper for atomic+locked manifest writes
|
||
# (manifest.rs). Already a transitive dep; declaring it directly
|
||
# makes the call site obvious.
|
||
libc = "0.2"
|
||
# v0.2.0 — sibling-tempfile + rename for atomic manifest persistence.
|
||
# Was previously dev-dep only; promoted to main.
|
||
tempfile = "3"
|
||
# v0.11.1 — cluster membership via scuttlebutt gossip + phi-accrual failure
|
||
# detection. Wraps in cluster/gossip.rs. UDP transport, keyed KV state per
|
||
# node, seed_nodes bootstrap from [[cluster.peers]] config.
|
||
chitchat = "0.11"
|
||
# v0.11 — QUIC transport for peer RPC (Phase 1c). UDP-based; runs on a
|
||
# separate port from chitchat gossip. TLS 1.3 by default; we wire mTLS
|
||
# against a fleet root CA in cluster/transport.rs.
|
||
quinn = { version = "0.11", default-features = false, features = ["runtime-tokio", "rustls-ring"] }
|
||
# v0.23 — TLS 1.3 provider driving quinn's crypto. Pinned to the ring
|
||
# provider so a single CryptoProvider is installed process-wide.
|
||
rustls = { version = "0.23", default-features = false, features = ["ring"] }
|
||
# v0.13 — X.509 cert generation for the fleet CA + per-node leaf certs.
|
||
# Used both by production bootstrap (writes PEM to /etc/claw-store/tls/)
|
||
# and by tests (in-memory ephemeral CA).
|
||
rcgen = { version = "0.13", features = ["pem", "x509-parser"] }
|
||
# v2 — parse PEM files into DER for rustls consumption. Used in
|
||
# NodeIdentity::from_pem_files (Phase 1d) so persistent identity round-trips
|
||
# through the file system on daemon restart.
|
||
rustls-pemfile = "2"
|
||
# v1 — content-addressed hashing for the Phase 2 blob store. BLAKE3 is
|
||
# used both for whole-blob addressing (BlobId) and for per-chunk
|
||
# addressing (dedup). Fast enough that a full-blob rehash on read
|
||
# verification stays cheap.
|
||
blake3 = "1"
|
||
# v0.4 — tar archive writer/reader for the Phase 5 build-artifact
|
||
# capture flow (cargo target/deps → tar → BlobPutStream). Preserves
|
||
# file metadata (mtimes, perms) which cargo relies on for its own
|
||
# incremental-rebuild fingerprint checks.
|
||
tar = "0.4"
|
||
# v0.13 — zstd wrapping around the tar stream. Level 3 is the default;
|
||
# gets 5-10× compression on cargo .rlib without noticeable CPU cost.
|
||
zstd = "0.13"
|
||
# v0.12 — HTTP client for the Phase 7f Gitea live-refs adapter.
|
||
# `rustls-tls` reuses the same rustls stack already pulled in by
|
||
# quinn — no additional TLS impls in the binary. `json` unlocks
|
||
# serde parsing of the /branches + /tags responses without a
|
||
# hand-rolled decoder. `default-features=false` drops native-tls
|
||
# and the openssl dep chain we don't need.
|
||
reqwest = { version = "0.12", default-features = false, features = ["rustls-tls", "json"] }
|
||
|
||
[dev-dependencies]
|
||
tempfile = "3"
|
||
tower = { version = "0.5", features = ["util"] }
|
||
http-body-util = "0.1"
|