Skip to content
zit Timeline
Login

Timeline

10 most recent check-ins occurring on or after 2026-07-17 05:39:20.

More ↑
2026-07-17
15:17
Reduce 'zit log' to the signed one-verb surface (drop -n windowing)

'zit log' carried a -n K windowed-log flag: an extra grammar mode (a state machine with a positional-only '--' separator and a -n value token in either order) and a bad_count offense, for a bound no other query verb exposes. Its sibling 'update' already documents the target shape — one full check-in ID, help only, no windowing.

Collapse log onto that same one-positional grammar. parseLogArgs is now the plain scan parseUpdateArgs uses: -h/--help wins; -n, --all, and a bare '--' are all unknown options (log has no positional-only separator); a second positional is an extra argument. Drop LogArgs.count, the bad_count variant, parseLogCount, and walkLog's max_count / window early-exit — the ancestry walk is unconditionally unbounded again.

Usage errors (missing check-in, unknown option, extra argument) now exit 2 via cli.usageError; a well-formed-but-non-canonical ID stays a validation failure at exit 1. Help and 'zit help log' print the trimmed single-verb text. Net -110 lines. Unit + e2e (209/209) green; fmt clean; dst 6x1000 ok. closed check-in: 0973cf7e9e user: dmestas tags: recover-inflight

15:15
Dispatch sync on method + Content-Type at any URL path, not just /xfer

A conformant Fossil client POSTs sync to the repository URL path unchanged and MUST NOT append /xfer (sync §4 L759-764): a bare 'fossil clone http://host:port/' POSTs to "/". The server previously required the /xfer path and answered 404 for anything else, so a root-URL clone from a stock client failed.

Drop the path from the dispatch decision entirely. classifyXfer now keys only on method (POST) and a request-valid, outer-compressed Content-Type (application/x-fossil); the URL path is accepted but unused. Remove xfer_path, requestPath, and the not_found/404 disposition; Disposition collapses to ok / method_not_allowed / unsupported_media_type. A non-POST stays 405 rather than a home redirect this sync-only server can't honor (and a 302 to "/" would loop now that "/" is a valid endpoint).

The over-real-HTTP e2e clone now targets the bare root "/" to prove a root-URL client interoperates. Unit + e2e green; fmt clean. check-in: 9636157a85 user: dmestas tags: recover-inflight

13:46
Merge clone-w4: skip the receive-side inflate for full-form clone content, cutting clone peak RSS ~13% (651 -> 568 MB). Reconciles held()/content() across the pull .raw basis and push upload paths so a corrupt wire-backed container degrades gracefully instead of tripping an unreachable. 1538 tests pass; fossil interop smoke green. check-in: 19af0f2de7 user: dmestas tags: trunk
13:43
Skip the receive-side inflate for full-form clone content

The clone/sync receive path inflated every stored cfile container to prove the RFC1950 stream was intact (§3.9), then threw the result away: the store keeps the container verbatim and reconstructs lazily, and the persist commit hook runs the §7.7 integrity check on the reconstructed bytes. For the full form that inflate was pure waste. Move the decode into the delta branch (which genuinely needs the plaintext to reconstruct) so a full-form cfile is interned and retained without inflating.

Retaining an unvalidated container means a held artifact is no longer guaranteed reconstructable: content() can be null for a corrupt wire-backed container, so held() no longer implies content(). Reconcile the consumers that assumed it did. The pull .raw delta basis and the push upload path both degrade gracefully (round abort / silent skip) instead of tripping an unreachable or assert on hostile input; the read/derivation path keeps the decompression-bomb cap, and the eager clone-end image treats a corrupt container as an error.

Cuts clone peak RSS ~13% (651 -> 568 MB) on the fossil corpus by dropping the discarded plaintext allocation. Instruction count and wall are flat, since full-form cfiles are the minority of clone content. 1538 tests pass; fossil interop smoke green. closed check-in: d91a3cfe42 user: dmestas tags: clone-w4

12:00
Merge clone-w3: halve clone compute (-53% instructions, 2.3x faster wall) via a bounded persist-time plaintext memo, byte-identical store + trunk hash preserved. check-in: fbfef2b649 user: dmestas tags: trunk
11:58
Halve the clone compute by memoising the persist-time plaintext: a bounded PlaintextCache reuses each frame's section 7.7-verify plaintext as the basis for the reverse-deltas built on it, killing the delta-chain reconstruction read-amplification (persist no longer re-inflates + re-applies a basis chain per dependent). libfossil clone: 138.2B -> 64.7B instructions (-53%), wall 13.4s -> 5.7s, RSS 550 -> 371 MB, trunk hash identical, store byte-identical (proven by test). The target's section 7.7 hash is still verified unconditionally after every reconstruction, so a stale basis is caught, never returned. closed check-in: 1bcbee0f86 user: dmestas tags: clone-w3
11:30
Create new branch named "clone-w3" check-in: 57438f967c user: dmestas tags: clone-w3
10:12
Create new branch named "revdelta-pack" closed check-in: ba83effe96 user: dmestas tags: revdelta-pack
05:43
Ignore zig-pkg/ (the build's local extraction dir for fetched C dependencies), so the zstd dep's source tree never shows as an untracked extra or risks being swept into a commit. closed check-in: b165f47caa user: dmestas tags: zstd-phase0
05:39
Add the pack-time zstd encoder seam (foundation for local storage compression). Vendors allyourcodebase/zstd (C libzstd) via zig fetch, confined to a new src/zstd.zig module so the core zit library stays C-free; the runtime read path decodes with pure-Zig std.compress.zstd. Frames carry no content checksum (zit verifies section 7.7 over uncompressed bytes; 0.16 std's zstd checksum path is unimplemented). Proven: libzstd level-19 encode round-trips byte-identically through std decode, and encoding is deterministic for pack idempotence. check-in: a409e20ab8 user: dmestas tags: zstd-phase0
More ↓