Artifact af1092498fa20fcbd9477a23dd408d3f9d57b9efaab8d46d378a5ac4db50ee9e:
- File
docs/RELEASE-NOTES-0.3.2.md
— part of check-in
[71d327a695]
at
2026-08-31 17:02:32
on branch trunk
— image: carry the comment and login per rid, so a listing reads no manifest
zit leaves read and parsed a whole manifest per row — through its delta chain — for the comment's first line and the login. A warm store is image-backed and the image carried neither, so commentOf answered null and every row fell back to that read: 472 leaves, one second, on sqlite.
The image now materializes both: the comment CSR-addressed per rid, the login interned (a repository has a handful of committers). layout_version 6 — an older image is a miss and rebuilds, as the disposable cache intends.
0.3.2. (user: dmestas, size: 2928) [annotate] [blame] [check-ins using]
zit 0.3.2
zit 0.3.2 is a point release with one change in it: a listing verb no longer
reads a manifest per row. zit leaves on SQLite's history — 472 leaves —
went from 1.15s to 0.23s, and every verb that renders a comment or a login
from a warm store takes the same path.
Nothing else changed. No artifact, tag namespace, sync message, command, or output differs from 0.3.1.
The change
zit leaves read and parsed a whole check-in manifest for every row it
printed — through whatever delta chain that manifest sat on — to obtain two
strings: the first line of the comment, and the login. On SQLite's 472
leaves that was the entire second the verb cost, and it grew with the number
of leaves rather than with anything the reader asked for.
The derived state has carried the comment since the listings were first made
to stop re-reading manifests. What it did not carry was the login, and —
more to the point — the materialized image carried neither. A store with a
warm .zit-cache is image-backed, so both accessors returned "unknown" and
every row fell back to the manifest read. The optimization existed and never
applied to the case that matters.
The image now materializes both columns:
- the comment per rid, addressed by a CSR offset column like the hash pool;
- the login interned, one id per rid into a pool of distinct values — a repository has a handful of committers and hundreds of thousands of check-ins, so storing the string per row would have been the wrong shape.
RepoState.commentOf and a new userOf read them, and answer null exactly
where the derived maps do — for a rid with no event — so the two backings
stay query-equivalent, which the image tests assert directly.
Measured
| 0.3.1 | 0.3.2 | |
|---|---|---|
zit leaves, SQLite (131k artifacts, 472 leaves) |
1.15s | 0.23s |
zit leaves, Tcl (254k artifacts, 303 leaves) |
0.38s | 0.29s |
leaves, leaves --all, and timeline print byte-identical output before
and after on both histories.
Compatibility
- Artifacts, tags, and the sync protocol are unchanged; Fossil RFC revision
00 remains the target. A stock
fossilclones, pushes, and pulls a 0.3.2 repository byte-for-byte. - The materialized image's column schema (
layout_version) is 6, up from 5. The cache is disposable by construction: an image written by an older build is a miss, and the reader falls through to deriving from the still-valid record body, which rewrites it. There is no migration and no format negotiation — the first read after upgrading is a rebuild, and every read after that is faster. - No command, flag, or output changed.
Qualification
zig build test, e2e, smoke (Fossil interop against a real fossil),
muscle (41 differential steps), git-import-e2e, git-export-e2e, and
dst, plus the three-runner CI battery (macOS ARM64, Linux x86-64, Linux
ARM64).