Skip to content
go-libfossil Timeline
Login

Timeline

50 ancestors of 0cf8b7a09b3baf62

2026-10-20
16:25
Merge commit '575d5e3' into feat/submanifest-reader check-in: 0cf8b7a09b user: [email protected] tags: feat/submanifest-reader, main, trunk
16:21
test(conformance): register sparse compaction with explicit remaining gaps check-in: e7477e64f8 user: [email protected] tags: feat/submanifest-reader, main, trunk
16:20
Merge commit 'f2c70bd' into feat/submanifest-reader check-in: e2829629bd user: [email protected] tags: feat/submanifest-reader, main, trunk
16:20
fix(content): tolerate repositories without the forum table check-in: 7a12c245df user: [email protected] tags: feat/submanifest-reader, main, trunk
16:19
test(content): prove compaction reader snapshots and local delta closure check-in: 6b1244bac2 user: [email protected] tags: feat/submanifest-reader, main, trunk
16:18
refactor(repo): hold sparse compaction public surface pending review check-in: 84c5070f16 user: [email protected] tags: feat/submanifest-reader, main, trunk
16:17
fix(content): keep forum and cherry-pick dependencies dense check-in: 6fcada6c23 user: [email protected] tags: feat/submanifest-reader, main, trunk
16:16
feat(repo): expose explicit sparse store compaction check-in: c18b7fba43 user: [email protected] tags: feat/submanifest-reader, main, trunk
16:13
docs: keep feature notes above the unchanged v0.13 release check-in: ea92f1c237 user: [email protected] tags: feat/submanifest-reader, main, trunk
16:13
test(sparse): prove compaction closures rollback and recovery check-in: 3fdb608c79 user: [email protected] tags: feat/submanifest-reader, main, trunk
16:08
fix(content): retain structural phantoms and transitive delta bases check-in: 097e8fa156 user: [email protected] tags: feat/submanifest-reader, main, trunk
16:02
feat(content): compact sparse file holdings transactionally check-in: 91f8ae67bc user: [email protected] tags: feat/submanifest-reader, main, trunk
16:01
Merge main release fixes while preserving feature ticket coverage check-in: 67c2af8525 user: [email protected] tags: feat/submanifest-reader, main, trunk
15:58
Merge commit '8961b59' into feat/sparse-store check-in: dd6f1125ed user: [email protected] tags: feat/submanifest-reader, main, trunk
04:31
chore(release): v0.13.0 changelog (#458) check-in: ae2704ef94 user: [email protected] tags: main, trunk, v0.13.0
03:15
fix(manifest): honor fossil's optional ticket columns (#456)

* test(manifest): cover ticket schemas without fossil's optional columns

Fossil treats the ticket table, ticket.tkt_ctime, the ticketchng table, ticketchng.tkt_rid and ticketchng.tkt_user as optional. Each schema here must derive the rows fossil rebuild derives; all fail today.

* fix(manifest): honor fossil's optional ticket columns

Port ticket_insert and ticket_rebuild_entry's schema probes from src/tkt.c: the ticket table, tkt_ctime, the ticketchng table, tkt_rid and tkt_user are optional, a change row is written only when it has a field or bookkeeping column to fill, fields stored in both tables are copied from the ticket row, and baseline columns record the assigning rid. Rebuilding fossil's own repository failed on its missing tkt_user.

* docs(changelog): note optional ticket columns fix

* test(manifest): pin ticket append to an unset field, baselines and shared columns

The corpus now appends to a field no artifact set, to a field with a baseline column, and to a field stored in both tables, so the comparison against fossil rebuild covers each branch of the append path. check-in: 1f46e25556 user: [email protected] tags: main, trunk

03:01
Merge remote-tracking branch 'origin/main' into feat/submanifest-reader

# Conflicts: # internal/checkout/vfile.go check-in: 741864259c user: [email protected] tags: feat/submanifest-reader, main, trunk

02:58
fix(cli): match PATH as fossil does; run pragmas in a fixed order (#457)

* fix(cli): match PATH as fossil does; run pragmas in a fixed order

log --path, cat --at and diff drop a leading ./, a trailing / and doubled or /./ separators, and compare names with the repository's case-sensitive setting, fossil's platform default when unset. Not found stays exit 2, where fossil exits 1; the docs now say so. SettingBoolean moves to internal/repo, shared by sync and checkout.

Opening a repository runs every pragma in a fixed order, not only busy_timeout first.

Tracked in #451

* feat(cli): document and pin repo new for embedding apps

repo new takes the path from -R as the other embedding commands do, refuses a missing parent directory with a message naming it, and is documented in the embedding contract with its output and exit statuses. Tests pin each behaviour and that stock fossil opens the result.

Tracked in #451

* docs(cli): say how ../x, absolute paths and the global case-sensitive setting behave

Tracked in #451 check-in: 8de2ae751d user: [email protected] tags: main, trunk

02:48
fix(checkout): restore the database/sql import the merge dropped check-in: ab7f1cde7b user: [email protected] tags: feat/submanifest-reader, main, trunk
02:45
Merge branch 'feat/submanifest-reader' into feat/sparse-store check-in: e4f56e44a9 user: [email protected] tags: feat/submanifest-reader, main, trunk
02:40
Merge branch 'fix/revert-swap-chain' into feat/submanifest-reader

# Conflicts: # internal/checkout/revert.go check-in: 32155296d0 user: [email protected] tags: feat/submanifest-reader, main, trunk

02:37
Merge branch 'fix/symlink-write-paths' into feat/submanifest-reader check-in: 79679cc3fa user: [email protected] tags: feat/submanifest-reader, main, trunk
02:09
Merge branch 'docs/repin-00' into feat/submanifest-reader check-in: d868c1b189 user: [email protected] tags: feat/submanifest-reader, main, trunk
02:08
conformance: re-pin the three drafts to their -00 names

zit check-in 68a3f76cb7 renames the artifact-format, repo-state and sync-protocol drafts from -01 to -00 in their headers, cross-references and reference entries, and retitles each Changes appendix "Changes in This Revision". No normative text changed and no section number moved.

The pinned copies take zit's file names, the requirement tables pin the new hashes, and the comments, tests and docs that cited the -01 drafts cite the -00 ones. The refresh script copies every draft under its own name. The sparse-cone copy is re-pinned to d497c2432f, whose text is unchanged. Coverage counts are identical before and after. check-in: 245a0ed306 user: [email protected] tags: feat/submanifest-reader, main, trunk

01:42
test(stash): fossil and go both refuse to merge a repointed symlink check-in: aec658f5a9 user: [email protected] tags: feat/submanifest-reader, main, trunk
01:42
fix(stash): do not merge a changed symlink, as fossil's stash apply does

Where a symlink was stashed or is now on disk, Apply writes the stashed file only when both are links and the link still holds the baseline. Otherwise it leaves the file and its row alone and reports it, as fossil's stash_apply prints "Cannot merge symlink" and counts a conflict. Apply and Pop now return the files they did not merge; Pop still drops the entry, as fossil's does. check-in: 2ee5684bf3 user: [email protected] tags: feat/submanifest-reader, main, trunk

01:40
test(stash): pop over a changed symlink does not merge it (red) check-in: d19a7ecca7 user: [email protected] tags: feat/submanifest-reader, main, trunk
01:36
Merge remote-tracking branch 'origin/main' into feat/submanifest-reader

# Conflicts: # CHANGELOG.md # internal/fsltype/julian_test.go check-in: 63f78ed893 user: [email protected] tags: feat/submanifest-reader, main, trunk

01:30
Merge branch 'docs/drafts-without-errata' into feat/submanifest-reader check-in: 27732942f1 user: [email protected] tags: feat/submanifest-reader, main, trunk
01:30
test: read isLink as an integer under both drivers check-in: 179069251f user: [email protected] tags: feat/submanifest-reader, main, trunk
01:30
feat(cli): checkout-free snapshot, per-path log, cat --at and diff --json (#453)

* feat(cli): checkout-free snapshot, per-path log, cat --at and diff --json

repo snapshot commits one file's bytes onto trunk with no checkout, a no-op when they equal the tip. repo log --path lists the check-ins that changed a path, repo cat --at reads a file as a version holds it, and repo diff --json A B [PATH] diffs two versions. Exit 2 means not found. A snapshot re-checks the check-in stamp inside its write transaction and retries, so concurrent processes build one linear trunk.

Tracked in #451

* test(cli): cover log across a rename; order exit statuses in the docs

Tracked in #451

* fix(db): convert Julian days to the millisecond SQLite gives

log --json printed most check-in times 1ms before their D card: db.julianToTime truncated where SQLite's date.c rounds with (sqlite3_int64)(r*86400000.0+0.5). fsltype.MillisFromJulianDay now does exactly that, JulianToTime and ScanTime use it, and ScanTime rounds the time.Time ncruces hands back to the millisecond as well.

* fix(cli): print usage errors on stderr and pin their exit status 80

The documented status was right for the binary; go run turns it into 1. Usage text went to stdout, so an embedder reading stdout saw it on a failure. The doc now says which status a measurement under go run shows, and a test pins 80 for an unknown flag, a missing flag or argument and an unknown subcommand.

* fix(cli): refuse a snapshot path holding a control byte or a reserved name

validateRepoPath now applies fossil's own rules for a new file name: file_is_simple_pathname in strict form (deck.StrictPathname), no byte below 0x20, and file_is_reserved_name, whose existing port in deck is exported as IsReservedName. Each refusal exits 1 and names the reason.

* fix(cli): diff A B PATH matches fossil's PATH rules

A PATH in neither version printed [] and exited 0; fossil diff --from A --to B fails with "not found". It now exits 2 (not found), and PATH also matches a directory, as fossil's file_dir_match does. The test runs fossil on the same repository as the oracle.

* fix(cli): refuse a snapshot into a repository with no main-branch check-in

When the main branch resolved to nothing, snapshot took the repository for empty and committed a second root beside the existing history. It now treats only a repository with no check-ins as empty, and otherwise fails at exit 1 naming the branch.

* test(cli): compare log across a rename with fossil finfo

The rename test built its history through manifest.Checkin and checked our own idea of the result. It now builds the history with the fossil binary and compares repo log with fossil finfo on the same repository: both stop a name's history at the rename. The doc tells an embedder how to follow a file across renames, and where log differs from finfo.

* fix(db): set busy_timeout before any other pragma on open

The drivers build the DSN's _pragma parameters from a map and run them in that order, so journal_mode or foreign_keys often ran before busy_timeout. An open while another process held a lock then failed at once with "database is locked" instead of waiting: one cause of TestSnapshotConcurrentProcesses failing under -tags test_ncruces.

* fix(cli): hold the write lock from snapshot's read of the tip to its commit

Under -tags test_ncruces, TestSnapshotConcurrentProcesses failed 8 of 20 runs. Besides the open-time lock error fixed in db, a snapshot read the tip's manifest outside any transaction while another process's check-in re-deltaed it, and failed with a hash mismatch. A snapshot now runs in one bound write transaction from the read of the tip to its commit, so no other check-in can land in between; the optimistic retry loop it replaces is gone. check-in: 90345545d3 user: [email protected] tags: main, trunk

01:30
Merge branch 'feat/submanifest-reader' into fix/revert-swap-chain check-in: c7a321a35d user: [email protected] tags: feat/submanifest-reader, main, trunk
00:51
test(conformance): drop the erratum files; the draft text is the authority

zit applied every erratum in its draft text and retired docs/rfcs/erratum/ at check-in 62a7d1bb3f. Each draft records its corrections in its own Changes appendix, so the suite stops pinning and reading erratum files: the "# erratum" pin lines, the parser branch that accepted them and conformance/rfcs/erratum/ are removed, and comments that named an erratum file cite the draft section instead.

The artifact-format, repo-state, sync-protocol and delta-format drafts are byte-identical at 62a7d1bb3f. The sub-manifest draft is re-pinned; it differs only in its expiry date, reflow, and the dropped pointer to the erratum files. The sparse-cone draft is re-pinned to the 19 October 2026 revision on zit's horizon-rfc branch (0acb5e185c, its merge of 62a7d1bb3f): section 3.6 is removed and section 3.4 states the literal prefix rule once, so SC-3.6-1 becomes SC-3.4-3 (a metacharacter is a literal character, never expanded, and the member may be refused), covered by the same case, renamed sparsecone.3.4.metachar. The refresh script copies the -01 texts to their -01 names and takes the horizon-rfc drafts from a second checkout. check-in: 3e1f791160 user: [email protected] tags: feat/submanifest-reader, main, trunk

00:25
docs(changelog): sparse store classification and verification check-in: 242b5f3d9e user: [email protected] tags: feat/submanifest-reader, main, trunk
00:25
test(manifest,verify): unit tests for commit and verify over a sparse store check-in: c935561cfc user: [email protected] tags: feat/submanifest-reader, main, trunk
00:25
test(conformance): zit checks the sparse store

zit clones go-libfossil's flat history through a cone, and both sides must report the same number of elided phantoms over the same cone. Each side then commits over its sparse store and pushes to a dense store of the other. The commit carries no R card, and the receiver holds the whole check-in. check-in: 0a63c3b22f user: [email protected] tags: feat/submanifest-reader, main, trunk

00:25
test(conformance): one sparse-store fixture for every origin check-in: a76ce676f6 user: [email protected] tags: feat/submanifest-reader, main, trunk
00:25
test(conformance): cover the sparse store's step-3 requirements

Cases elide out-of-cone blobs from a dense clone, as a cone-scoped clone would leave the store. They check the three absence classes, the client and server sync filters, recomputation on a cone change, loss of the cone (unreadable, or dropped by fossil rebuild, after which fossil's pull heals the store), verify and rebuild counts, R-card omission and skipping, a commit over elided subtrees pushed to a dense peer, widening, hybrid histories, and delta bases.

Holding out-of-cone sub-manifest nodes is recorded as a deviation from §5.1. zit holds them too, because a tree that cannot be enumerated never links.

A checkout's record names the phantom for a file that neither cone covers, so a checkout opens over a sparse store. check-in: b907b41650 user: [email protected] tags: feat/submanifest-reader, main, trunk

00:25
feat(sync): never request a sparse store's elided phantoms

The client's phantom load and the server's request_phantoms skip elided phantoms (draft-fossil-sparse-cone-00 §5.2). A dense store classifies nothing and behaves as before. Repo.StoreCone and Repo.SetStoreCone expose the store cone. check-in: 37f15485b4 user: [email protected] tags: feat/submanifest-reader, main, trunk

00:25
feat(manifest,verify): commit over a sparse store, and count absences

A commit over a store with a store cone leaves out the R card (draft-fossil-sparse-cone-00 §4.3). It refers to out-of-cone files the store lacks by hash alone (§5.3). VerifyRCard skips over a sparse store, and skips a manifest that has no R card, since an absent R card is not damage.

verify.Report gains Phantoms (transit) and Elided. Neither is an Issue, so a store complete within its cone verifies OK (§5.2). Rebuild keeps the store cone and reports the same counts. check-in: cd98ba38cb user: [email protected] tags: feat/submanifest-reader, main, trunk

00:25
feat(content): store cone and the three absence classes of the sparse store

The store cone (draft-fossil-sparse-cone-00 §5) is kept in a storecone table that exists only while a cone is set. fossil rebuild drops tables it does not know, so losing the cone reads as dense and the store heals toward dense (§5.2). A cone that does not parse also reads as dense.

LoadAbsences sorts every phantom into transit, shunned or elided by zit's rules. A phantom is elided when F cards name it only outside the store cone and no held delta uses it as a base. check-in: 524c749185 user: [email protected] tags: feat/submanifest-reader, main, trunk

2026-10-19
23:58
Merge branch 'feat/submanifest-pragma' into feat/submanifest-reader check-in: 6681b95432 user: [email protected] tags: feat/submanifest-reader, main, trunk
23:53
test(conformance): skip zit tests on a zit that predates send-submanifests

A zit older than check-in 0431958ff4 gates trees on the announced version, so against it the interop tests fail on the protocol change rather than on anything go-libfossil does. zitBinary now probes the binary for the pragma's name, which a zit that sends it carries; zit's version cannot tell, since 0.5.0 was tagged before the change. An older zit is skipped with its path, version and the check-in needed, or fails the run under REQUIRE_ZIT_BIN=1 as a missing one does.

Tracked in #452. check-in: b9c7364ff2 user: [email protected] tags: feat/submanifest-reader, main, trunk

23:44
Merge branch 'fix/update-cone-symlink' into feat/submanifest-reader check-in: 44ac676efe user: [email protected] tags: feat/submanifest-reader, main, trunk
23:12
vfile: assert a Disk is made, and test one on a storage without links check-in: 6eb99ff380 user: [email protected] tags: feat/submanifest-reader, main, trunk
23:10
test(stash): fossil pops go's symlink stash and go pops fossil's check-in: 805385f535 user: [email protected] tags: feat/submanifest-reader, main, trunk
23:09
test: fossil reads go's symlink undo state and go reads fossil's; RestoreFiles keeps links check-in: 03f0b0c67b user: [email protected] tags: feat/submanifest-reader, main, trunk
23:06
fix(stash): stash, revert and apply symlinks as fossil's stash does

Save reads each changed file through vfile.Disk, so a symlink is stashed as its target's name and recorded with file_islink, and its revert makes it a link to the committed target. Apply writes a stashed symlink as a symlink and deletes a link before writing, so neither writes through one. check-in: 5be36b41a0 user: [email protected] tags: feat/submanifest-reader, main, trunk

23:02
fix(checkout): revert a symlink as fossil's revert does

restoreCommitted writes through vfile.Disk with the row's islink, so a repointed link is made a link to its committed target again instead of having that name written into the file it points to. check-in: 6a440bc42f user: [email protected] tags: feat/submanifest-reader, main, trunk

22:58
fix(undo): save and restore symlinks as fossil's undo does

Move checkout's link-aware diskView into vfile.Disk, so checkout, undo and stash share one RepoFILE view: Stat, Read, Write (which deletes a link before writing, makes a symlink when allow-symlinks is on, creates the directory and sets the executable bit as file_setexe does), SetExe, MTime and Remove. The allow-symlinks setting is read by vfile.OpenDisk.

undo.Save, Undo, Redo, Swap, ReadFile and RestoreFiles now take a Disk: a symlink is read as its target's name and recorded with isLink, and is deleted and made a symlink again on restore, as undo_save and undo_one do, so Undo of an Update no longer writes through a link. check-in: 858c20561f user: [email protected] tags: feat/submanifest-reader, main, trunk

22:55
fix(manifest): warn with zit's §8.1 flag-day rule; pin the dated -00 revision

zit retired the sub-manifest draft's provisional phase the same day as the send-submanifests errata (erratum submanifests-00-s8.2-provisional-phase- retired): §8.2 is gone, and its one permanent rule, that the setting must not be enabled on a repository a non-reading peer serves, moves to §8.1. zit's enable warning now states that rule in place of the disposable- fixture text, so go-libfossil's, worded as zit's, does too.

The conformance suite pins the draft at zit check-in bbc6794bf0, the revision dated 19 October 2026 whose Appendix C lists the nine errata it applies; the Appendix A vectors are unchanged.

Tracked in #452. check-in: efba058666 user: [email protected] tags: feat/submanifest-reader, main, trunk