Skip to content
zit Artifact [f2ea22bf1c]
Login

Artifact [f2ea22bf1c]

Artifact f2ea22bf1c3027cc82c9bdf2d1c4d27359f176c016a040dee2d04f0104f06730:


zit 0.7.4

zit 0.7.4 gives every Git export of a check-in the same commit ID, on any machine, from either verb. A structural horizon clone under the leaves rule keeps the branch and tags of every check-in it holds when a side branch it holds is merged. import-git holds about 40% less memory for the same history on Linux.

This release is from trunk. Stores are unchanged from 0.7.3.

A Git export's commit IDs come from the repository alone

A Git commit ID is a hash over its author and committer lines. 0.7.3 built the email in those lines from a user's contact address when zit git export ran, from the login when zit export-git ran, and from a domain kept in local config or given per run. The same check-in could get different commit IDs on two machines, from the two verbs, or after a contact was edited. A rebuilt mirror then looked like a force-push of the whole history.

Now both verbs write LOGIN <LOGIN@DOMAIN>. LOGIN is the check-in's user, and DOMAIN is the repository's Git email domain, zit.invalid unless --email-domain sets another. The domain is synced, so every clone exports the same commit IDs. A new mirror no longer uses contacts in the user table.

A mirror keeps the rule it was built with, and its state now records that rule. A mirror from an earlier release has its rule read back from its newest commits, contact addresses included, so its commit IDs do not change. --email-domain is refused on a mirror whose commits already use another domain.

The rule is recorded in the technote "A Git export's commit IDs come from the repository alone".

A horizon clone keeps the branches it holds

Under the leaves rule, a structural horizon clone holds each open branch back to where it meets C. When that branch was later merged, it no longer counted toward the rule, and the origin stopped serving and labelling it. The clone kept those check-ins, but they lost their branch and every tag they inherited. zit leaves, zit branch list and zit tag list showed them wrong. The 0.7.3 notes listed this as a zit leaves listing only; it was wider than that.

A structural clone now states, on every pull, the check-ins it holds whose parent it does not. The origin serves and labels each of them and every check-in after it, so what a clone was served stays served.

The first pull after upgrading resends what the clone holds once, and does so again whenever that set changes. The horizon draft defines the horizon-held pragma in Section 6.1. Section 6.2 no longer claims the held set only grows, and Appendix C records the change.

import-git holds less

Measured on Linux ARM64 over the first 30,000 commits of the Linux kernel:

0.7.3 0.7.4
Memory at the end of the import 632 MB 403 MB
Peak memory 1,110 MB 603 MB
Wall time 29 min 29 min

Memory still grows with the length of the history, at about 40% less per imported object. The tables keyed by Git object name hold binary names, store digests are packed in fixed blocks, and provenance is streamed to its file as it is written. On Linux, the import reuses the memory it frees, which the release build's allocator did not.

The imported store is byte-for-byte what 0.7.3 writes.

Tested against stock Fossil

The smoke suite now clones a stock Fossil server with a path cone, commits inside the cone, and pushes. A fresh clone by stock Fossil then holds the check-in exactly as zit wrote it, with every file outside the cone intact.

The nightly soak now also runs the horizon sweep alone over 800 more seeds. The sweep costs seconds a seed where the full simulation costs minutes. It covers the case above.

Known limits

import-git still holds state for every commit it imports. The whole Linux kernel history, about 1.5 million commits, needs several gigabytes. Import a history that long on a machine that has the memory, and leave sub-manifests on.

Compatibility

Stores are unchanged from 0.7.3. The Git email domain is stored under a new config key, which earlier releases skip.

A mirror from an earlier release continues under the rule it was built with. One whose newest commits match no rule zit has written is refused rather than continued under a guess. --rebuild exports it again under the new rule, with new commit IDs.

On the wire, a structural clone sends a new pragma horizon-held, and the synced config carries the Git email domain when one is set. An origin from 0.7.3 or earlier ignores the pragma and serves as it did.

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.