Skip to content
zit Artifact [02d993f860]
Login

Artifact [02d993f860]

Artifact 02d993f8608a97e2e78002fc8d7d1c4a7d76065e4b9c8e64100c075f9594bd68:

Manifest of check-in [02d993f860] - status: report edited files by hashing tracked files against the current check-in

Completes the B-status-16 deferral. `status` previously classified only `added` and `missing`: a tracked file that was present but modified produced no line at all, and the gap was documented in a comment, in `--help`, and in an e2e test that pinned the silence. Documenting a hole is not the same as not having one, and "your working copy looks clean" is the wrong thing for a version control system to say about an edited file.

What changed:

- `status` now resolves the current check-in and compares every tracked file against it, emitting an `edited` row naming the path when the bytes or the file mode differ. A file whose contents match is still not listed.

- The comparison is not a second implementation. `diff` already resolved the current check-in, tolerated the legacy trailing-separator F-card, walked the delta manifest, and merged that effective file set against the sorted managed set. That machinery is extracted into `CheckinBaseline` (open/resolve) and `walkWorkingTree` (the merge), and both verbs now run through it. `diff` is a pure refactor here -- same output, less code. The `diff*Fail` diagnostic mappers become `compare*Fail` and take the verb as a parameter, the shape `checkoutFail` and `managedFail` already used.

- A verb supplies only a sink with `emit(entry)`. `DiffSink` renders diff records; `StatusSink` renders human rows and drops the deleted-from-check-in class, which `status` still defers because it iterates the managed set. The sink is comptime-generic rather than an erased pointer pair: both sinks are known at compile time, so the call stays direct and type-checked.

- The whole report is buffered and written once, as `diff` already did. A comparison failure part-way through the walk now leaves stdout empty rather than a header above a truncated report. Dirtiness is still never a failure: every `added`/`edited`/`missing` row exits 0 (B-status-15). Only a genuine comparison failure -- unreadable tracked file, corrupt or unresolvable check-in -- exits 1.

- `CheckinBaseline` is self-referential (the walk borrows the resolver, which borrows the log, which reads through the file storage), so it is initialized in place and must not be moved. The open/deinit contract used to rest purely on each call site placing its `defer` correctly; an `opened` flag now makes that invariant assertable, and both `deinit` and the failure path assert it.

- `walkWorkingTree` carries a termination guard against the exact bound (one step per managed path, one per effective file), plus a per-iteration progress assertion, because correctness of the merge rests on every switch arm advancing exactly one cursor. Debug-only, alongside the existing debug-only assertion that the managed set is sorted.

- `--help` no longer defers edited-file detection. It documents the three row classes and narrows the deferral text to the two cases that genuinely remain out of scope: a file deleted from the check-in but no longer tracked, and untracked "extra" files -- pointing at `zit diff` and `zit extras`.

Test evidence: new e2e coverage pins each acceptance criterion -- an edited tracked file is reported as edited in the born state; a rewrite with identical bytes (mtime bump, same content) is not reported; an executable-bit-only change is reported as edited; a file deleted from the check-in but untracked is still not reported; and a current delta checkout with an absent B-card baseline fails cleanly rather than reporting a false clean tree. The pre-existing e2e that pinned the deferral is replaced by the tests above. The help-text e2es compare against a hand-written expected string, so the `--help` change is pinned too. `zig build` and `zig build test` pass in this worktree after absorbing the sibling add/rm recursion commit (281c0ed815), and the commit is proved against a clean `fossil open` checkout running `zig build` then `zig build test`. by dmestas on 2026-07-18 23:08:15.


C status:\sreport\sedited\sfiles\sby\shashing\stracked\sfiles\sagainst\sthe\scurrent\scheck-in\n\nCompletes\sthe\sB-status-16\sdeferral.\s`status`\spreviously\sclassified\sonly\n`added`\sand\s`missing`:\sa\stracked\sfile\sthat\swas\spresent\sbut\smodified\sproduced\nno\sline\sat\sall,\sand\sthe\sgap\swas\sdocumented\sin\sa\scomment,\sin\s`--help`,\sand\sin\nan\se2e\stest\sthat\spinned\sthe\ssilence.\sDocumenting\sa\shole\sis\snot\sthe\ssame\sas\nnot\shaving\sone,\sand\s"your\sworking\scopy\slooks\sclean"\sis\sthe\swrong\sthing\sfor\sa\nversion\scontrol\ssystem\sto\ssay\sabout\san\sedited\sfile.\n\nWhat\schanged:\n\n-\s`status`\snow\sresolves\sthe\scurrent\scheck-in\sand\scompares\severy\stracked\sfile\n\s\sagainst\sit,\semitting\san\s`edited`\srow\snaming\sthe\spath\swhen\sthe\sbytes\sor\sthe\n\s\sfile\smode\sdiffer.\n\s\sA\sfile\swhose\scontents\smatch\sis\sstill\snot\slisted.\n\n-\sThe\scomparison\sis\snot\sa\ssecond\simplementation.\s`diff`\salready\sresolved\sthe\n\s\scurrent\scheck-in,\stolerated\sthe\slegacy\strailing-separator\sF-card,\swalked\sthe\n\s\sdelta\smanifest,\sand\smerged\sthat\seffective\sfile\sset\sagainst\sthe\ssorted\smanaged\n\s\sset.\sThat\smachinery\sis\sextracted\sinto\s`CheckinBaseline`\s(open/resolve)\sand\n\s\s`walkWorkingTree`\s(the\smerge),\sand\sboth\sverbs\snow\srun\sthrough\sit.\s`diff`\sis\sa\n\s\spure\srefactor\shere\s--\ssame\soutput,\sless\scode.\sThe\s`diff*Fail`\sdiagnostic\n\s\smappers\sbecome\s`compare*Fail`\sand\stake\sthe\sverb\sas\sa\sparameter,\sthe\sshape\n\s\s`checkoutFail`\sand\s`managedFail`\salready\sused.\n\n-\sA\sverb\ssupplies\sonly\sa\ssink\swith\s`emit(entry)`.\s`DiffSink`\srenders\sdiff\n\s\srecords;\s`StatusSink`\srenders\shuman\srows\sand\sdrops\sthe\sdeleted-from-check-in\n\s\sclass,\swhich\s`status`\sstill\sdefers\sbecause\sit\siterates\sthe\smanaged\sset.\n\s\sThe\ssink\sis\scomptime-generic\srather\sthan\san\serased\spointer\spair:\sboth\ssinks\n\s\sare\sknown\sat\scompile\stime,\sso\sthe\scall\sstays\sdirect\sand\stype-checked.\n\n-\sThe\swhole\sreport\sis\sbuffered\sand\swritten\sonce,\sas\s`diff`\salready\sdid.\sA\n\s\scomparison\sfailure\spart-way\sthrough\sthe\swalk\snow\sleaves\sstdout\sempty\srather\n\s\sthan\sa\sheader\sabove\sa\struncated\sreport.\sDirtiness\sis\sstill\snever\sa\sfailure:\n\s\severy\s`added`/`edited`/`missing`\srow\sexits\s0\s(B-status-15).\sOnly\sa\sgenuine\n\s\scomparison\sfailure\s--\sunreadable\stracked\sfile,\scorrupt\sor\sunresolvable\n\s\scheck-in\s--\sexits\s1.\n\n-\s`CheckinBaseline`\sis\sself-referential\s(the\swalk\sborrows\sthe\sresolver,\swhich\n\s\sborrows\sthe\slog,\swhich\sreads\sthrough\sthe\sfile\sstorage),\sso\sit\sis\sinitialized\n\s\sin\splace\sand\smust\snot\sbe\smoved.\sThe\sopen/deinit\scontract\sused\sto\srest\spurely\n\s\son\seach\scall\ssite\splacing\sits\s`defer`\scorrectly;\san\s`opened`\sflag\snow\smakes\n\s\sthat\sinvariant\sassertable,\sand\sboth\s`deinit`\sand\sthe\sfailure\spath\sassert\sit.\n\n-\s`walkWorkingTree`\scarries\sa\stermination\sguard\sagainst\sthe\sexact\sbound\n\s\s(one\sstep\sper\smanaged\spath,\sone\sper\seffective\sfile),\splus\sa\sper-iteration\n\s\sprogress\sassertion,\sbecause\scorrectness\sof\sthe\smerge\srests\son\severy\sswitch\n\s\sarm\sadvancing\sexactly\sone\scursor.\sDebug-only,\salongside\sthe\sexisting\n\s\sdebug-only\sassertion\sthat\sthe\smanaged\sset\sis\ssorted.\n\n-\s`--help`\sno\slonger\sdefers\sedited-file\sdetection.\sIt\sdocuments\sthe\sthree\srow\n\s\sclasses\sand\snarrows\sthe\sdeferral\stext\sto\sthe\stwo\scases\sthat\sgenuinely\sremain\n\s\sout\sof\sscope:\sa\sfile\sdeleted\sfrom\sthe\scheck-in\sbut\sno\slonger\stracked,\sand\n\s\suntracked\s"extra"\sfiles\s--\spointing\sat\s`zit\sdiff`\sand\s`zit\sextras`.\n\nTest\sevidence:\snew\se2e\scoverage\spins\seach\sacceptance\scriterion\s--\san\sedited\ntracked\sfile\sis\sreported\sas\sedited\sin\sthe\sborn\sstate;\sa\srewrite\swith\sidentical\nbytes\s(mtime\sbump,\ssame\scontent)\sis\snot\sreported;\san\sexecutable-bit-only\schange\nis\sreported\sas\sedited;\sa\sfile\sdeleted\sfrom\sthe\scheck-in\sbut\suntracked\sis\sstill\nnot\sreported;\sand\sa\scurrent\sdelta\scheckout\swith\san\sabsent\sB-card\sbaseline\sfails\ncleanly\srather\sthan\sreporting\sa\sfalse\sclean\stree.\sThe\spre-existing\se2e\sthat\npinned\sthe\sdeferral\sis\sreplaced\sby\sthe\stests\sabove.\sThe\shelp-text\se2es\scompare\nagainst\sa\shand-written\sexpected\sstring,\sso\sthe\s`--help`\schange\sis\spinned\stoo.\n`zig\sbuild`\sand\s`zig\sbuild\stest`\spass\sin\sthis\sworktree\safter\sabsorbing\sthe\nsibling\sadd/rm\srecursion\scommit\s(281c0ed815),\sand\sthe\scommit\sis\sproved\sagainst\na\sclean\s`fossil\sopen`\scheckout\srunning\s`zig\sbuild`\sthen\s`zig\sbuild\stest`.\n
D 2026-07-18T23:08:15.386
F .fossil-settings/ignore-glob 3580f973d7097226f91a27c7b61ec13d9d07880d95549f9b90ce86da5d867a23
F LICENSE 702ae7ff835a2a971dae11c5cae039803bf394b77a6d8ec9f18693e449eaaf26
F README.md 62e1f936cc2ea0e33d717539bdffd6126a639843069bd6256359f2b15cb06232
F build.zig 4bc7076a0a8ae829e0860d78027c84f78a3cb40fb2733891a16ac1ebed18715d
F build.zig.zon 0eade544d4d7fc5a620348c6f29cc9219ff8c6d6377a05e756ca89860a524781
F docs/rfcs/draft-fossil-artifact-format-00.txt a6d542a5effeb41d0ea1e916058ccdc0a5819787f167ef1ebad7814f5680e7ad
F docs/rfcs/draft-fossil-delta-format-00.txt d8025d6d75322e33887c3334a4b9cc729960028b3c994ed01e5a474e4b388fd2
F docs/rfcs/draft-fossil-repo-state-00.txt fd413bcb28001a8a07009ca0c769cfe666394ba79dd4f14a6461f2b592049595
F docs/rfcs/draft-fossil-sync-protocol-00.txt aa55791464a54ef4b651df8780ba5c46e95c723c7997d09a5b727fef658f920a
F src/annotate.zig 0a6b6728099e63c84681d1e5228ebb45fafb55d65df1720358247fd6e6532c63
F src/artifact.zig c630afd9fbbcfaccd7b823105b4d05db1dc85b6af03080a6d58635ed064672ca
F src/artifact_fuzz.zig 8bb359ddfe790818e109a1dd7ac0c1b5cec1a8fdc556f37e73504cdb7f933e17
F src/artifact_test.zig da999476660f7e6e1f50ed9da5c30f1c83d6b358e2cfcd265c6932959c85bdd1
F src/bisect.zig 7bfc45d3e0e339017826941463cc4e9118892d2898fbcd319e6e6ca85c4d3301
F src/checkout.zig ac48e76f22c8065f70d2a827ae00ffb99887af80950a93c1a3451a9a1ad0f403
F src/cli.zig c6baeb3b06666ba4940575c03fa395c108093fa6442a64f6a4e1e61326e795a2
F src/container.zig cef1028531f2763f94248b761c8779a1884e44bb854b8c45617494e3ead40e61
F src/container_test.zig a013652b1ed181161d3ad8fc9d8f052f7c27b61e129662632ceaf8cf189445ec
F src/delta.zig e8f3a6297d47549aea146222732ccf514c39688414f0a74ba396ac91066686f3
F src/delta_fuzz.zig 9e0d8dbb8c82ca0ba1a80974c076e74e4f37072b21a10812efd5539875904719
F src/delta_test.zig b18d97e117dce8fbcc05bff6f6954effdb946bab6d36337efbe5ef64d10646a0
F src/dst.zig 66f7e5b264ded6a4ec82645e87e9780b344ff23360242e263c29415163b25501
F src/e2e.zig f4376dff255587c9335323e9c69048ad02e399193617ec7497935df43540bd76
F src/extras.zig b8b36b7d6a3d348eeaf733124e671de1dba0bd4fe3cf2acd35268dfb3cf6acfb
F src/fuzz_tests.zig 7194e723225d467cf43d60210bf96860e8c248a7ae63413b70c61ea9349d291d
F src/logstore.zig a26e7b006f335b0bbb9bb41ac702ea42fab1c5b4ce9b13c7d25a89c84197aed0
F src/logstore_benchmark.zig e245474e1cc4f10617866f718aab3958f13b256c609b3e5fd562f500668388c0
F src/logstore_fuzz.zig 67b7bda806397f92c3b07c94854d9fafca56710090071a1c1c8ec94d137408f8
F src/logstore_test.zig a9baaee2cf009c988832d3632f52a1eeabf36afd52c891315f7673ce28442533
F src/main.zig 4b700fa9e97a05a03fd517ff470132f50b90bcefe47f79affea99fb561d569fa
F src/managed.zig 81ccc2d6321fe3dff91f653305ae4e73bea0b3fae7db2ab2f0cf168d9518d601
F src/merge3.zig 22c24bbea4b5fa79879c984b8208e6b0b17b4837977ac36b79821648a4f900bd
F src/pack.zig 0ea96cb540b3f43f6ff8ce95a3044ce939879bc6f9bf0eb82b26aab4089009c7
F src/packaging_test.zig 0697e7e19ac575d0b09f957256a90de524192b03128b15210bd37fec767097a4
F src/repocache.zig aae232a6b1b86e27c5242c0ee17ce9f2544299d99cf4936d8c2c9000e3166884
F src/repoimage.zig 7d2dc2f3c145e10e2d9ba6997705fd61a0cc0aedde8e171c253163d1279ccdd5
F src/repository.zig 6d41e75aafeddf6d6f0e0b04d280402354f2e8ee046d3027162733947a199176
F src/repository_test.zig 329c0fdfc9a84f96a94afbc5e7df5f7b2ef81651413e728ebf886e143ff5df5c
F src/repostate.zig 72b063c9b779b6154940abc31c26644346d8ff9aca1ff8c7b6d0f47672ab90ec
F src/repostate_test.zig 0645afa55d528f74e6cd1c84fc49568fff8c9c55956db30d48c4390f7a142599
F src/repoview.zig ec2958e1e8fd955c761d240ab80c3b3f62e3473991713c25ed5a603df984e403
F src/rfc_vectors/artifact_a1_1_sha1_manifest.txt 82d8fc78b3fbf85efe80cb05e79db40c910bf0551e55b728c6f9c2ca7a42ddb6
F src/rfc_vectors/artifact_a1_2_sha3_technote.txt 832e850f83aab2e2a754aa97591109f7f05fb41e4126c7e71c88a59d6d17e55d
F src/rfc_vectors/artifact_a3_rcard_manifest.txt 47e412ef211f095e93275fadf527909e581eef42357d8437fc7e299bfc3e62a7
F src/rfc_vectors/sync_a1_round1_reply.txt 638813029b10f81303b88859279afb17095d7c779c993f4267870909acabbeb9
F src/rfc_vectors/sync_a1_round2_file_cards.txt 4fa397741f7521cc4181d5d6b04dc143187f57602384eaa688552115ecda27c2
F src/rfc_vectors/sync_a1_round2_reply.txt af956808190c79b37a384041690c36b78845b471d6c6c01d1cced6e3ee92e6b1
F src/rfc_vectors/sync_a2_reply.txt aa130a127cde210f793c7842960083c765e0ffc7b673374fabc8f0edfe03d763
F src/root.zig a2a13d28a5e50138557966adf64bbe121a4a70a4de0e2933f395e30924f9140a
F src/serve.zig baa76b81f5cc21322e85f3d390b533c828c969f6d10580b5e8aa1f339202d945
F src/sim/faulty_file.zig 8e8a0325d0e987d1dd306588f910af5302e6456561eefae92c73c424fc1a9c94
F src/sim/gen.zig 0e237af570a73bc78e9a717a8ea59867611deb2348287765826ea4ff1942528b
F src/sim/net.zig 8fb057012ce0a33f67c928cd696bc2761fea8ba4012b2daa33871b2ba5dfe772
F src/sim/oracle.zig 04b81d9472a0529d9e9d030779304c3d6c930f4db20b800ae3f9cbc5c178969a
F src/sim/storage_sweep.zig 5472d632347079fb5c7e7ae300b46c6e8202b91202b1c51b181dd3c7bab8a306
F src/sim/sync_gen.zig 238d46942915b5c0e989dfc738b5927b5228468ea123e6f17b6fb593aa5cbf6e
F src/sim/sync_sweep.zig 5458a84be08823d2d0fc9464665f1c3f3f26563185dc9ae24cf73259faa5d40e
F src/smoke.zig f2565465a36a6c187d49d116f4e671ed843ea6c1a291fcc9c063af29a9baa3c8
F src/storage.zig 512205eb629d5af8d50ad336f1ef49f53b455abd52ee2f9b56d20893cafad39f
F src/storage_benchmark.zig 871f00fef1a34a0b2ee7b9656a217a0cf52949fdd710b642a44dc6bf12d6866e
F src/sync.zig b04119b2679887c6705ed4831899ca1911ca20afe0bac865022ac8b7ad879194
F src/sync_benchmark.zig 9a4542401c880750ff6565a2ca9f1d116341d1c5af704ef4a05c2732eeec8849
F src/sync_driver.zig 722ed498ea6b76900661a085d4257e51f6416d43ac1185e8ac15140de265f67e
F src/sync_driver_test.zig b50450d2938fc60aa90cd9067fc45141a965b63dc2194f42d5109919e380d7df
F src/sync_fuzz.zig 3f419ec3e3c0b4ecf99376e46d111c4fae9826d08f9968e649ffdf84d10f9e61
F src/sync_test.zig b47b05d3defeef61a02c9c9817b66288c48430713737c946734dba151bb17e7e
F src/transport.zig 4652b2ab7f43ccd8af5ca6ef7604f8e7cd28353450b1ec90d206b881308f8b5f
F src/undo.zig 2e213cbe02118e37b11554620b285deae5dbf5b4d8009ae6dc229b84375b7591
F src/update.zig dbc731b339f2a6b32af95ca0ee6b5a36629d8ef9944b3f7006f4c59d62bfdcfd
F src/update_test.zig e80b1902fe29d1e8a6984f82974917ecda9b6460905b0c56b7cbc310ced3b73e
F src/warmread_benchmark.zig 9421986d49deff3f720e491fb6d1c7162dc9322f4e67dd14198820c3992dc02a
P 281c0ed815ef6939222f211b2cb00134fa864daf32d01047b8b79e205724d0b9
R 9b95c64ee26b1aa1fbdb9c165d8d40c1
U dmestas
Z d6daec76f44c56d1308e6306bda5fbd1