# zit 0.10.0
zit 0.10.0 is for applications that write to a store without a checkout. It
adds a local daemon that keeps a store open and commits in milliseconds,
builds every `commit -R` through a new direct-commit core, and lets that
path rename and delete files. New names now follow Fossil's strict rule.
This release is from trunk. Stores, caches and the wire are unchanged from
0.9.1.
## New
- **`zit daemon -R STORE`** serves one store over a local Unix socket, for
an application that drains its own journal into zit. Requests are one
JSON line followed by raw file bytes, and replies come back in order:
- `commit`, and `batch` with one fsync for the whole batch;
- `feed` of changes and forks since a cursor;
- `get` of file contents;
- `lookup`, which finds a stored check-in by time, user and comment
without taking the writer lock;
- `status`.
A commit is acknowledged only after it is on disk, and a resend with the
same time, user and comment is answered with the stored check-in. The
socket's directory and file are owner-only, and other users are refused.
On a 10,000-file sub-manifest store, a one-file commit takes about 8 ms
and a feed with nothing new about 0.01 ms. `zit help daemon` documents
the protocol.
- **`commit -R` renames and deletes:** repeatable `--rename OLD NEW` and
`--delete PATH`, with or without `--stdin`, make one check-in with no
checkout. `--stdin NEW` gives a renamed file new content. `log` and
`annotate` follow the rename.
- **`commit --date-override DATETIME`** sets the check-in time, in Fossil's
formats. With `-R`, a resend with the same date, user and comment answers
with the stored check-in instead of committing again.
- **`annotate --partial`** reads through a purged or shunned version and
marks the lines it cannot trace with `~`. Plain `annotate` still refuses
with exit 8.
## Faster
`commit -R` no longer builds a temporary checkout. It writes the check-in
from the parent's manifest and the edits, byte-identical to a checkout
commit of the same change. A one-file commit on a 42,000-file sub-manifest
store took 0.37 s and now takes 0.16 s; held open by the daemon, it takes
about 20 ms.
## Names
New file names follow Fossil's strict rule, as `fossil add` does. `commit`,
`add`, `addremove` and `mv` refuse:
- invalid UTF-8;
- characters above U+FFFF;
- private-use characters and noncharacters;
- a backslash;
- Fossil's reserved names, such as `_FOSSIL_`.
zit also refuses control bytes in new file names and in user and branch
names. Fossil already escapes some of them; zit refuses the rest. Spaces
stay allowed. `add` of a directory warns about a bad name and skips it, as
`fossil add` does.
Names read from existing check-ins are not checked, so a Fossil-made name
still clones, updates and checks out, and a delete or rename can remove it.
## Compatibility
Stores and the wire are unchanged from 0.9.1, and nothing is rebuilt on
first open. Every check-in zit writes is still one stock Fossil reads.
A name that 0.9.x accepted and that the rules above now refuse, such as a
file name with a control byte, can no longer be added or committed under
that name. Existing check-ins that hold one are unaffected.
## Qualification
The release manifest records native qualification against the exact tagged
source archive on macOS ARM64, Linux x86-64 and Linux ARM64, using the pinned
Zig 0.17.0 toolchain. Publication is gated on unit and end-to-end tests, Git
differentials, deterministic simulation, seeded fuzzing, and Fossil
interoperability checks on every distributed target.
For the basis of the conformance claim, see
[the 0.1.0 release notes](RELEASE-NOTES-0.1.0.md).