50 descendants of 2892f40e8b5a1c36
|
2026-09-06
| ||
| 14:06 | 0.3.6: version bump and release notes check-in: 762cd0d3cc user: dmestas tags: trunk | |
|
2026-09-05
| ||
| 17:34 | 0.3.5: version bump and release notes check-in: 882eaddc57 user: dmestas tags: trunk, version-0.3.5 | |
| 15:13 |
Honour every Fossil checkout setting file (#174)
Glob lists follow Fossil's tokenizer and '#' comment lines; crnl-glob, clean-glob, empty-dirs, encoding-glob, dotfiles and mimetypes work at every tier. Dotfiles are hidden by default and Fossil's checkout-state names are never listed. UTF-16 and invalid UTF-8 classify as Fossil's lookslike.c does; tokenizer rules from glob.c. check-in: 982afa3d8f user: dmestas tags: trunk | |
|
2026-09-02
| ||
| 22:25 | 0.3.4: version bump and release notes check-in: f785e3286b user: dmestas tags: trunk, version-0.3.4 | |
| 22:15 | zit#173: route ordering tiebreaks through the hashOf door; trap the raw store under image backing check-in: 8216f43a66 user: dmestas tags: trunk | |
| 02:57 | 0.3.3: version bump and release notes check-in: 441d99370f user: dmestas tags: trunk, version-0.3.3 | |
| 01:32 |
annotate walks the file's versions, not the whole ancestry
Every ancestor cost a manifest read and a full-file line diff — ~36k of each on SQLite where ~400 touched the file. The cache records already say who changed PATH (their diff is against the primary parent, so unlisted means byte-equal there): untouched ancestors inherit the parent's content pointer, the engine copies the parent's origins on pointer-identity, and the LCS trims the common prefix/suffix before its O(n*m) table. Unfinishable on SQLite before; 0.5-1.2s typical, 57s for a 15k-line heavily-edited file (the multi-hunk quadratic middle remains — a real diff core is the named follow-up). Attribution of a repeated line between equally-valid origins can shift, as any LCS tiebreak may. zit#172 check-in: 22bdf84fd3 user: dmestas tags: trunk | |
|
2026-09-01
| ||
| 23:10 |
timeline reads no manifest for what the state answers; count the reads that remain
The default-format timeline inflated a manifest per row — the fetch condition still said 'a.format != .oneline' from when oneline was the default, so zit#170's medium default made every row read one for two strings the image now carries. 66.5s to 0.37s for the full SQLite timeline, output identical. Repository.manifest counts its reads (ZIT_MANIFEST_READS=1 reports on exit), and an e2e runs ten listings over two history sizes and requires identical counts — a per-row reader fails by construction, no timing, no constants. zit#172 check-in: 09fa1a7fb3 user: dmestas tags: trunk | |
|
2026-08-31
| ||
| 17:02 |
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. check-in: 71d327a695 user: dmestas tags: trunk, version-0.3.2 | |
| 01:01 | import-fossil help: keep 'zit submanifest enable' on one line check-in: edac449311 user: dmestas tags: trunk, version-0.3.1 | |
|
2026-08-30
| ||
| 16:50 | 0.3.1: version bump and release notes check-in: b5afbdb45f user: dmestas tags: trunk | |
| 16:20 |
clone: diff a check-in against its parent by their changed files, not two whole file lists
The derive built the complete effective file list for every check-in and its parent, then compared them — O(files) per check-in, which on pkgsrc is 100k entries twice over, 305k times. Fossil's add_mlink merges the two deltas' own F cards and seeks the shared baseline; do the same, and walk the lists side by side when the baselines differ instead of materializing them. Keeps recently-read manifests parsed, pinned while a step holds them. zit#172 check-in: 669593f624 user: dmestas tags: trunk | |
|
2026-08-29
| ||
| 23:53 | import-fossil help: say the shape of pack's effect, not a corpus figure check-in: 97a7015b74 user: dmestas tags: trunk | |
| 22:30 | import-fossil --submanifest: recommend 'zit pack' next; the source's chains are rarely the best bases (zit#169) check-in: 24bc789080 user: dmestas tags: trunk | |
| 20:54 | An empty check-in name is refused, not a crash: guard the resolver's precondition at the repository door (zit#171) check-in: c2b38c3ca8 user: dmestas tags: trunk | |
| 20:30 | diff prints Fossil's Index banner; update's changes line reads as a sentence (zit#170) check-in: 9e3ba34bb0 user: dmestas tags: trunk | |
| 20:11 | Fossil's words by default: status rows, ADDED/DELETED/RENAME/REVERT/UNDO lines, blame's user column, a no-op update's checkout line, singular counts (zit#170) check-in: 201202f4c8 user: dmestas tags: trunk | |
| 19:39 | muscle: fourteen more session steps (stash, branch cycle, conflicting merge, undo, help); zig build ux keeps every step's bytes under zig-out/ux (zit#170) check-in: 11b68d9d99 user: dmestas tags: trunk | |
| 19:21 | Prefixes resolve through aliases and name the shortest spelling that works; verb help lists its aliases (zit#170) check-in: bb2f45e4ff user: dmestas tags: trunk | |
| 18:27 | Receipts: commit summary and content notes, undo per-file rows, stash file names, revert undo hint, short hashes in update (zit#170) check-in: 69f708db73 user: dmestas tags: trunk | |
| 17:46 |
listings take Fossil's shape: ls names, leaves lines, day-grouped timeline, annotate line numbers; branch -v (zit#170)
Twelve-character hashes and the weekday in day headers and leaf lines are the departures; -F oneline keeps the one-line timeline for scripts. check-in: 16c197b4dc user: dmestas tags: trunk | |
| 16:57 |
status leads with Fossil's checkout block; changes drops it; bare info adds the count (zit#170)
Twelve-character names and the weekday in the times are the only departures from Fossil's shape. cli.shortHash and cli.humanTime are the primitives the rest of the terminal-speech work builds on. check-in: d72b6372ab user: dmestas tags: trunk | |
| 15:33 |
info with no NAME describes the current check-in; revert names only the files it changes
Both found by running one session through fossil and zit side by side. check-in: a0690841c1 user: dmestas tags: trunk | |
| 14:40 |
update: with no CHECKIN move to the branch's newest check-in, as Fossil does
A bare 'zit update' was a usage error; Fossil's means --latest. check-in: b618fc675d user: dmestas tags: trunk | |
| 12:44 |
logstore: putArtifactPreferring takes a known base before searching (zit#169)
The converter's hints are the source's own chains and each manifest's parent, so one delta usually settles it; the best-of-N window is the fallback. Conversion is now faster than the old convert-then-pack. check-in: 598d040de5 user: dmestas tags: trunk | |
| 12:04 |
import-fossil --submanifest: delta-encode the converted store as it is written (zit#169)
Blobs take the flat source's own delta base as the hint, manifests their parent, carried artifacts the recent window. A 28x full-form gap on a toy corpus became 1.3x of packed, with no second pass and no double-disk peak. check-in: 38b9743ff8 user: dmestas tags: trunk | |
| 10:18 |
release: prepare zit 0.3.0
Fossil parity on the everyday verbs, landings and strata, protected branches behind a trusted front, Fossil's user table, and the read paths that now scale with the change rather than the store. check-in: 1e2a7bbc0d user: dmestas tags: trunk, version-0.3.0 | |
| 09:26 |
ui launches quarry's local mode (zit#165, quarry RFC 0010)
Runs quarry ui on the checkout root with the terminal inherited; the binary comes from ZIT_QUARRY or PATH, and an absent one is a three-line pointer, exit 1. check-in: 95553946e3 user: dmestas tags: trunk | |
| 09:07 |
diff --by, timeline -F html, and a reserved ui verb (zit#165)
--by writes a side-by-side page under $TMPDIR and opens it from a terminal; -F html renders the timeline as a table; ui names quarry's local mode and exits 1 until it exists. check-in: 87f4be2914 user: dmestas tags: trunk | |
| 08:46 |
settings editor and autosync pullonly, --changed/--value; grep -i -c -l -v --once; annotate -n -l (zit#164)
The two new settings ride the keyed config block; a configured editor makes commit editor-capable without a terminal. check-in: 7d9dcb2de1 user: dmestas tags: trunk | |
| 07:53 |
stash: snapshot, diff, goto, and apply --merge (zit#164)
--merge three-way merges a stashed change into a dirty file; conflicts get markers, are listed, and exit 5 with the entry kept. check-in: 21ce2c785d user: dmestas tags: trunk | |
| 07:35 |
merge: --integrate, --baseline, -n, and a bare merge onto the one other leaf (zit#164)
The checkout record carries the integrated leaf's hash as an optional sixth field; commit closes it with the same control artifact branch close mints. check-in: 2a522aab40 user: dmestas tags: trunk | |
| 07:01 |
diff: PATH operands, --numstat, --invert, --checkin, --branch (zit#164)
-Z is -w; -N is accepted (an added file's hunks already carry it all). check-in: 39c88046ab user: dmestas tags: trunk | |
| 06:35 |
mv takes many operands and directories; revert -r/-n, undo -n (zit#164)
The managed set records one pending rename per moved file. mv moves files into a directory or a tracked directory as a unit, --soft records without moving, -n previews. revert -r VERSION restores another check-in's content; revert/undo/redo -n name what they would touch. add -f takes ignored files; clean gains -n/-f and --emptydirs. check-in: ece16d74a9 user: dmestas tags: trunk | |
| 05:30 |
branch sub-verbs; clone opens its tree, open URL clones (zit#164)
branch new/close/reopen/hide/unhide/current/info. clone DIR defaults from the URL and is followed by open (--no-open keeps the bare store); open URL delegates to clone. check-in: 5d2f9a7e6e user: dmestas tags: trunk | |
| 03:36 |
timeline filters and formats, status classification, -R for the sync family
timeline gains -b/-c/-p/-u filters, -r and --offset, -F medium|full (a date header per day, *CURRENT* on the checkout's check-in, user and tags) and -v for changed files; the default line is unchanged. status gains --classify (Fossil's words, aligned), --added/--edited/--missing/--conflict/--extra/ --differ filters, -v's header block, CONFLICT for an edited file still carrying markers under a pending merge, and MERGED_WITH. pull, push, sync and remote accept -R, so a bare mirror needs no working tree. current/ ckout/prev/next take effect in these verbs through the same hint. Refs zit#163. check-in: 6c84f304f4 user: dmestas tags: trunk | |
| 02:33 |
Everyday verbs: update receipt, network narration, commit editor, checkout-relative names
update prints Fossil's receipt on stderr (per-file UPDATE/ADD/REMOVE/MERGE/ CONFLICT, the from/to block, the undo hint) and gains -n, --latest and -v. Every sync-family line names the peer, a no-op is always 'already in sync', clone prints the project code, an unreachable peer is named, and pull/push/ sync show per-round progress on a terminal. commit takes -M FILE, composes the comment in $VISUAL/$EDITOR/--editor over a template of the change set (kept in .zit-ci-comment when the commit then fails), and gains -n and --allow-empty; --no-warnings is accepted as Fossil's spelling of --no-checks — the content gate stays opt-in by design. The names current/ ckout, prev/previous and next resolve against the checkout. The muscle harness now enforces all of it. Closes zit#157, zit#158, zit#159, zit#160, zit#161. check-in: e5beabd7c0 user: dmestas tags: trunk | |
| 00:59 |
fossil-muscle-memory: a differential transcript through fossil and zit
zig build muscle runs one scripted session — 27 lines a Fossil user types most — through the real fossil and the real zit against local servers, and compares each step's exit-status class and whether the verb spoke at all. Deliberate divergences carry their reason, known gaps carry their issue; anything else fails the run. CI runs it beside smoke. Closes zit#162. check-in: 741f6d428b user: dmestas tags: trunk | |
| 00:59 |
Verb prefixes, Fossil aliases, and a suggester that never says 'rm'
Any unambiguous prefix of a command dispatches (zit up, zit tim); an ambiguous one names its candidates; an exact verb always wins, so stat stays the store census. Aliases: ci/checkin, co/checkout, changes, delete/forget/ remove, rename, blame/praise, new. A token of three letters or fewer is only suggested at edit distance 1, and an unknown verb prints two lines, never the command list. Closes zit#156. check-in: e114f7a174 user: dmestas tags: trunk | |
|
2026-08-28
| ||
| 21:29 |
import-fossil --submanifest: read and parse each baseline manifest once
repo.files re-read and re-parsed the B-card baseline for every delta check-in — 79% of the mint phase on pkgsrc. Repository.filesMemo takes a caller-owned BaselineMemo keyed by artifact name; consecutive deltas over one baseline borrow the parsed manifest and read nothing. On a 30k-file history of 300 deltas, source enumeration went from 10s to 0.3s and the conversion from 13.5s to 3.7s, every check-in hash identical. The memo holds a heap entry with a stable address; the optional-by-value form did not persist under ReleaseFast. Closes zit#167. check-in: c80728261e user: dmestas tags: trunk | |
| 16:04 |
submanifest convert, and import-fossil --submanifest straight from a fossil URL
The rebirth arm of import-fossil required a zit store, so the verb that says 'import a fossil' could not take one. It now accepts the fossil's sync URL like --compatible does, cloning a transient flat store beside DIR and removing it after; a local store stays accepted. The zit->zit conversion gets its proper home as 'zit submanifest convert SRC DEST', beside 'enable', which now says what it does not do: existing check-ins stay flat, and fossil peers receive nothing new from the next commit. Diagnostics carry the verb the operator typed. Closes zit#168. check-in: abd850dc4c user: dmestas tags: trunk | |
| 03:59 |
import-fossil --submanifest: drop the whole-history replay gate and --force
The gate replayed every commit through the from-scratch tree builder three times to predict what the conversion itself measures, and on pkgsrc that was 14 of 26 hours before a byte was written. The conversion writes a new project beside an untouched source, so the honest evidence is the converted store: the summary now reports its bytes against the flat source's. The partition parameter comes from --k or the tip sweep; a history no k partitions is refused, as 'submanifest enable' refuses it. 'zit submanifest analyze --replay-all' keeps the model for anyone who wants it first. Closes zit#129. check-in: 04d944c1dd user: dmestas tags: trunk | |
| 01:56 |
import-fossil --submanifest: build each check-in's tree from its parent's with the sub-manifest editor
Every check-in went through artifact.buildTree from scratch, so a wide tree cost its whole file set per commit against a few changed slices actually written. The converter now applies each check-in's change set over its primary parent's root with TreeEditor — the commit verb's builder — keeps a parent cache released as children consume it, interns the retained cards, runs the pair proof through the run-scoped flatten memo, and parses each source manifest once. The Git importer's LogTreeStore moves to a shared module. Output is unchanged: every check-in hash matches the from-scratch build on libfossil and on a 30k-file synthetic history. Refs zit#167. check-in: 5e0155427e user: dmestas tags: trunk | |
| 01:00 |
import-fossil --submanifest: strip SSH signatures, verify per pair in the mint loop, fold the census into pass 1, skip the replay under --k --force
The converter only stripped PGP armor, so an SSH-signed check-in re-minted with its envelope inside and failed its own verify silently. Verification now runs as each pair is minted, the census counts come from the first pass instead of a second corpus read, and --k narrows the gate's replay to one arm (skipped with --force). Each phase reports its wall time on stderr; the summary points at 'zit pack'. Closes zit#155. check-in: 75c8669553 user: dmestas tags: trunk | |
|
2026-08-27
| ||
| 20:02 | merge settings-config-repo-flag-153: accept -R on a bare store for settings and config (#153) check-in: 26ed9cbc86 user: dmestas tags: trunk | |
| 19:00 |
settings, config: accept -R on a bare store
Their repository and global tiers, and config's user/shun areas, all live in the store, not the working tree -- fossil serves them under -R too. Move both out of the -R blanket refusal, resolve the override, and name a bad -R path with the #97 diagnostic rather than the discovery message that advises the flag already given. Issue #153. closed check-in: b342686fd9 user: dmestas tags: settings-config-repo-flag-153 | |
| 11:04 |
landing: update -- bring the target into the proposed branch on the store
The reverse of accept, through the same ephemeral-checkout merge, now one function that does not know which direction it runs. Always merges in a working area of its own, checkout or not, so a tree is never left half-merged. Up to date is exit 0 with nothing written; a conflict is refused with its paths; a settled record is refused; a stacked landing is not, since refreshing a rung is what the rungs above it need. The refresh is a reply in the record's thread. Issue #152. check-in: c4b949ebbf user: dmestas tags: trunk | |
|
2026-08-26
| ||
| 19:43 | merge serve-protected-branches: per-request branch protection behind a trusted front (#151) check-in: d46cb9a855 user: dmestas tags: trunk | |
| 16:57 |
serve: refuse a check-in's own singleton claim on a protected name; warm the image only after a push
A self-targeted +sym-B is not how a branch is joined, but nothing legitimate mints one on a protected name. maintain now derives the fast-read image only when the log grew, so a pull-heavy fronted server does not pay an image load per connection. Pins that a merge with a protected secondary parent stays on its primary's branch. Issue #151. closed check-in: 13760d0c92 user: dmestas tags: serve-protected-branches | |
| 16:14 |
serve: refuse membership changes to protected branches, per request, from a trusted front
A front that authenticates every push knows who is pushing; the store knows which branch a pushed check-in resolves to. The front sends only the rule -- X-Zit-Protect, a glob list -- and zit serve --fronted refuses the whole round when a check-in would join one of those branches or a tag would move a held check-in in or out of one. Same error card as a content-policy refusal, so a stock fossil client reads it. Without --fronted the header is ignored and the server is unchanged. Nothing new on the wire or in the repository. Resolution is crosslink's own, through the fast-read image, which maintain keeps warm between connections. A parent not yet held is admitted: it is judged on arrival. Resolver faults fail closed. Issue #151. check-in: 63ec7d6dc8 user: dmestas tags: serve-protected-branches | |
| 14:35 | merge landing-reply-to-149: --reply-to aims a landing comment's I-card (#149) check-in: 2892f40e8b user: dmestas tags: trunk | |