Repository navigation
Releases: danmestas/go-libfossil
Release list
v0.12.0
What's Changed
- test(conformance): sync-protocol conformance suite (#262) by @danmestas in #311
- test(conformance): sync suite follows the s7.3 uvgimme Read erratum by @danmestas in #313
- fix(checkout): count only open leaves for forks and fork warnings (#291) by @danmestas in #315
- fix(branch): refuse an open branch's name on create; close a branch by its newest check-in (#292) by @danmestas in #317
- fix(repo): resolve version names in fossil's order and forms (#290) by @danmestas in #318
- fix(blob): fill a phantom in place when its content is stored (#278) by @danmestas in #319
- fix(delta): refuse a source or target of 2^32 bytes or more in Create (#279) by @danmestas in #320
- fix(manifest): refuse check-in filenames outside the writer profile (#270) by @danmestas in #321
- fix(manifest): reject a non-baseline as a delta manifest's baseline (#275) by @danmestas in #322
- fix(hash): default to sha3 when empty and persist the auto promotion (#274) by @danmestas in #323
- fix(manifest): write the first check-in's sym-trunk as propagating (#289) by @danmestas in #324
- fix(manifest): make root check-in mlink derivation idempotent (#294) by @danmestas in #325
- fix(manifest): refuse a technote with a non-self or non-singleton T-card (#287) by @danmestas in #326
- fix(manifest): apply the parent (reparent) tag (#286) by @danmestas in #327
- fix(tag): keep a propagated-tag cancel from deleting newer inherited rows (#288) by @danmestas in #328
- fix(libfossil): sym- prefix and reserved-prefix refusal in Repo.Tag (#293) by @danmestas in #329
- fix(deck): judge artifact framing by the rule it breaks, not the Z checksum (#265) by @danmestas in #330
- fix(deck): tokenize cards as fossil does and enforce per-card arity (#266, #267) by @danmestas in #331
- fix(deck): validate every artifact-hash and checksum position (#268) by @danmestas in #332
- fix(deck): enforce the pathname, wiki-name and reserved-name rules (#269) by @danmestas in #333
- fix(verify): derive Rebuild state through the crosslink sweep (#285) by @danmestas in #336
- fix(deck): parse D and E timestamps with the full 4.6.4 grammar (#271) by @danmestas in #337
- fix(deck): re-encode present-but-empty values and keep timestamp precision (#272) by @danmestas in #338
- fix(deck): enforce card legality, required cards and per-type semantics (#273) by @danmestas in #339
- fix(xfer): follow the draft's card grammar, not whole-message failure (#299) by @danmestas in #340
- fix(sync): handle unknown, error and pull-only cards per the draft (#300) by @danmestas in #341
- fix(sync): frame HTTP requests and replies as fossil's http.c does (#310) by @danmestas in #342
- fix(manifest): set event.mtime from the newest date tag (#334) by @danmestas in #344
- fix(verify): rebuild derived state in one transaction (#335) by @danmestas in #345
- fix(branch): check the open branch name in the check-in transaction (#316) by @danmestas in #346
- fix(checkout): make WouldFork fossil's commit-time fork check (#347) by @danmestas in #348
- fix(sync): refuse push and pull cards naming another project (#309) by @danmestas in #353
- fix(sync): take a uvfile on y alone, without a push card (#296) by @danmestas in #354
- fix(sync): drop shunned artifacts and never ask for a shunned phantom (#302) by @danmestas in #355
- fix(sync): send pragma send-private first and keep a private basis private (#307) by @danmestas in #356
- fix(sync): end client sessions by section 3.7 and keep igot phantoms (#301) by @danmestas in #357
- fix(sync): exchange server-version and gate SHA3 content by peer release (#303) by @danmestas in #358
- fix(sync): answer pushed config, ci-unlock and req-clusters (#305) by @danmestas in #359
- fix(sync): send clone replies as fossil's page_xfer does (#306) by @danmestas in #360
- fix(sync): apply received unversioned files as fossil does (#308) by @danmestas in #361
- fix(sync): log in through the x-f-l-c cookie and accept cleartext passwords (#304) by @danmestas in #362
- fix(sync): let Clone imply Read at the server's read gates (#312) by @danmestas in #363
- fix(tag): apply bgcolor, user and comment tags to event as fossil does (#343) by @danmestas in #364
- fix(test): kill fossil server's process group before cleanup (#352) by @danmestas in #365
- fix(testutil): isolate fossil's global config in tests (#284) by @danmestas in #366
- fix(sync): server igot handling skips shunned hashes (#349) by @danmestas in #367
- fix(sync): keep the client's gimme limit as fossil's mxPhantomReq (#350) by @danmestas in #368
- fix(sync): gate xtable-hash on a direction card (#351) by @danmestas in #369
- test(conformance): check the -01 drafts of artifact, repo-state and sync by @danmestas in #377
- fix(deck): accept the full Julian-day grammar of artifact-format-01 4.6.4 by @danmestas in #378
- fix(manifest): resolve a delta manifest's baseline one level (artifact-format-01 4.7.3) by @danmestas in #379
- fix(tag): derive the check-in event time from direct date tags only (#372) by @danmestas in #380
- fix(xfer): treat a payload cut short as its card's handler failure (#373) by @danmestas in #381
- fix(sync): end card processing on refused writes and logins, count errors as fossil (#374) by @danmestas in #382
- fix(sync): answer a private gimme with igot HASH 1 for a recent peer (#375) by @danmestas in #383
- fix(sync): withhold SHA3 unversioned files from a pre-SHA3 server (#303) by @danmestas in #384
- test(conformance): cover artifact K, delta-lookup and delta-size requirements by @danmestas in #388
- fix(sync): handle server cards in request order, phantom gimme after push, clone bad cards by @danmestas in #393
- fix(sync): cover the sync-protocol-01 coverage rows by @danmestas in #394
- test(conformance): cover the repo-state GAP and PARTIAL rows by @danmestas in #395
- fix(manifest,hash): verify the R card at commit; reject an unrecognized hash-policy by @danmestas in #396
- fix(checkout): pick the no-target update target as fossil does; read untagged check-ins as the default branch by @danmestas in #399
- fix(sync): apply ci-lock and ci-unlock for any requester by @danmestas in #400
- fix(sync): send the clone reply and cluster igots in place by @danmestas in #401
- fix(sync): end card processing when a pushed file fails its handler by @danmestas in #402
- fix(sync): reclassify held artifacts and phantoms from igot by @danmestas in #403
- fix(sync): stop the client reply loop at a card with no artifact name by @danmestas in #404
- fix(manifest): link a check-in atop an absent parent despite absent files by @danmestas in #407
- feat(repo): set the hash policy by name by @danmestas in #408
- feat(resolve): resolve checkout-relative names and branch-type requests by @danmestas in #409
- feat(repo): name ...
v0.11.1
What's Changed
- test(conformance): repository-state conformance suite (#262) by @danmestas in #295
- fix(sync): send content only to readers; never follow HTTPS to HTTP (security) by @danmestas in #297
- chore(release): v0.11.1 changelog by @danmestas in #298
Full Changelog: v0.11.0...v0.11.1
v0.11.0
What's Changed
- ci(release): drop the downstream dispatch to EdgeSync by @danmestas in #251
- Merge the way fossil does, and commit merges with their parent (#244) by @danmestas in #252
- fix(annotate): credit lines through the start-version mapping (#253) by @danmestas in #254
- Annotate credits lines the way fossil annotate does (#256, #257) by @danmestas in #259
- Clone and sync exchanges follow the sync draft (#255) by @danmestas in #260
- Store check-in, link and tag rows as fossil does (#258) by @danmestas in #261
- test(conformance): harness for an RFC conformance suite (#262) by @danmestas in #264
- test(conformance): artifact-format conformance suite (#263) by @danmestas in #276
- test(conformance): delta-format conformance suite (#262) by @danmestas in #280
- fix(sync): a pull-only sync converges when the server lacks the client's artifacts (#277) by @danmestas in #281
- fix: harden sync and repository defaults (security) by @danmestas in #282
- chore(release): v0.11.0 changelog by @danmestas in #283
Full Changelog: v0.10.0...v0.11.0
v0.10.0
What's Changed
- fix(checkout): read checkouts made by the fossil binary (#228) by @danmestas in #229
- fix(checkout): check Extract's safety before replacing vfile (#230) by @danmestas in #237
- fix(blob): always inflate blob.content on load (#235) by @danmestas in #238
- fix(checkout): refuse to load a version with missing content (#231) by @danmestas in #240
- fix(checkout): classify changes in one place; report missing files (#232) by @danmestas in #241
- refactor(vfile): give the checkout's vfile encoding one owner (#233) by @danmestas in #243
- fix(cli): add, rm, rename and revert call the library (#234) by @danmestas in #245
- fix(checkout): dry runs change nothing; switching ends a merge (#236) by @danmestas in #246
- fix(content): report database faults from the availability check (#239) by @danmestas in #247
- fix(checkout): revert undoes a pending rename (#242) by @danmestas in #249
- chore(release): v0.10.0 by @danmestas in #250
Full Changelog: v0.9.0...v0.10.0
v0.9.0
What's Changed
- fix(blob): name new artifacts by the repo's hash-policy by @danmestas in #224
- fix(db): seed hash-policy so new repos name artifacts like fossil init by @danmestas in #226
- docs: backfill 0.8.0/0.8.1 and add the 0.9.0 changelog entry by @danmestas in #227
Full Changelog: v0.8.1...v0.9.0
v0.8.1
What's Changed
- chore: untrack generated and local-only files by @danmestas in #219
- fix(test): reap fossil servers before temp-dir cleanup; raise unit-test timeout by @danmestas in #220
- fix(manifest): preserve crosslink failure cause by @danmestas in #222
Full Changelog: v0.8.0...v0.8.1
v0.8.0
What's Changed
- docs: reconcile CHANGELOG with the 15-tag release history by @danmestas in #181
- test: build the chain-bound fixture in one transaction instead of ~65k by @danmestas in #182
- fix: defer cascade-linked check-ins referencing unavailable blobs by @danmestas in #183
- test: add an opt-in corpus-parity gate against canonical fossil by @danmestas in #191
- fix: crosslink ticket artifacts and stop warning for ordinary file blobs by @danmestas in #192
- fix: pin submodules to v0.7.0 instead of an orphaned pseudo-version by @danmestas in #195
- fix(sync): retry a dropped exchange round instead of aborting the clone by @danmestas in #196
- fix: derive leaf by canonical's branch rule, in both the sweep and the commit path by @danmestas in #197
- fix(sync): derive the project code, and write artifact visibility inside the storing transaction by @danmestas in #204
- ci: gate the js/wasm build on every PR by @danmestas in #205
- fix: stop tag propagation from crossing branch boundaries by @danmestas in #206
- refactor(tag): give the three tag-apply paths one propagation helper by @danmestas in #209
- fix: make authenticated sync interoperate with canonical fossil by @danmestas in #207
- perf: stop the post-sync crosslink sweep re-examining the whole repository (#202) by @danmestas in #210
- fix: derive mlink, plink, tagxref and leaf the way canonical fossil does (#193) by @danmestas in #211
- perf: stop clone re-seeking blob.uuid per F-card and over-allocating delta output (#187) by @danmestas in #212
- manifest: unify direct and crosslinked mlink derivation by @danmestas in #216
- perf(sync): reuse received content in crosslink by @danmestas in #217
- feat(cli): select SQLite driver by build tag by @danmestas in #218
Full Changelog: v0.7.0...v0.8.0
v0.7.0
What's Changed
- fix: DSN _txlock=immediate to serialize concurrent writers (#33) by @danmestas in #34
- Fix checkout portability under ncruces by @danmestas in #39
- Rebrand to go-libfossil + add acknowledgements by @danmestas in #40
- chore(deps): bump the go_modules group across 2 directories with 1 update by @dependabot[bot] in #42
- Provision ticket schema at repo creation by @danmestas in #46
- fix: tolerate NULL event.user/comment in manifest.Log by @danmestas in #47
- fix: capture executable bit at Add/Manage time and propagate to commit by @danmestas in #48
- fix: separate blob existence from blob availability (#43) by @danmestas in #52
- fix: split repository enumeration from ancestry walking by @danmestas in #54
- fix: make Timeline pagination cursor an exact total order by @danmestas in #62
- checkout: Update returns UpdateResult so conflicts are visible by @danmestas in #61
- fix: populate mlink parent columns on the Crosslink check-in path by @danmestas in #63
- Remove unused UpdateOpts.Force field by @danmestas in #69
- Remove unused CloneOpts.ProjectCode and ServerCode fields by @danmestas in #77
- fix: give Timeline its own result type so an Ancestry cursor cannot compile into it by @danmestas in #78
- checkout: re-stat executable bit at commit time by @danmestas in #80
- fix: store delta content against a phantomized base instead of discarding it by @danmestas in #83
- fix: distinguish absent, empty, and valued U-cards in manifest parsing by @danmestas in #73
- cli: add repo serve command wiring the xfer HTTP server by @danmestas in #72
- Deltify predecessors on the commit path by @danmestas in #87
- Enforce card occurrence classes and intra-run ordering by @danmestas in #94
- fix: clone_seqno is server-to-client only by @danmestas in #96
- fix: remove StatusOpts, MergeOpts, CheckoutOpts — no call sites by @danmestas in #97
- Add libfossil version command by @danmestas in #99
- fix: bound clone batches by output size, not artifact count by @danmestas in #100
- perf: memoize delta-chain interiors during crosslink by @danmestas in #107
- fix: never parse a compressed body as cards (#104) by @danmestas in #111
- content: unify delta-chain walk bound on maxDeltaChainDepth by @danmestas in #115
- fix: correct go.mod module path to go-libfossil (#76) by @danmestas in #117
- fix: J/T card escape-encoding symmetry and T-card §4.7.16 validation (#90, #91, #93) by @danmestas in #116
- fix: correct stale module path broken by concurrent module-rename and #93 merges by @danmestas in #122
- fix: xfer parse guards — degrade unparseable clone tokens (#95) and reject oversized §4.1 length before zlib (#110) by @danmestas in #124
- test: route every fossil-binary gate through one REQUIRE_FOSSIL_BIN helper by @danmestas in #125
- sync: store received wire frames verbatim instead of re-encoding by @danmestas in #132
- manifest: visit Crosslink candidates in delta-chain order by @danmestas in #126
- delta: bound Apply growth per-command, cut ~5x allocation overhead by @danmestas in #127
- clone: emit cfile with stored content per §7.2, not expanded file cards by @danmestas in #131
- fix: zero-length file commit panic and stale missing-file carry-forward by @danmestas in #128
- fix: return error when clone stalls with phantoms outstanding by @danmestas in #129
- db: keep ScanJulianDay's float64 branch exact, close driver-divergence coverage gap by @danmestas in #121
- xfer: select framing by Content-Type; bound clone rounds by client decode limit by @danmestas in #133
- manifest: wire AfterDephantomize into the phantom fill path by @danmestas in #130
- sync: send explicit Content-Length on xfer replies so fossil <=2.23 can clone by @danmestas in #134
- ci: build all packages so broken imports fail loud by @danmestas in #135
- deck: complete the §4.3 escape table in FossilEncode/FossilDecode by @danmestas in #137
- test(sync): guard clone against expanded-file-card wire amplification by @danmestas in #139
- clone: add --timeout override and make the deadline reliably fire by @danmestas in #144
- content: add delta-chain depth benchmark for #85 re-measurement by @danmestas in #146
- checkin: emit renames as a single F-card with the w placeholder by @danmestas in #147
- ci: gate docs/site Hugo module with a build job by @danmestas in #148
- sync: emit clone push card after clone_seqno to stop real-client re-clone by @danmestas in #149
- content: cut sub-64KiB delta-chain expansion allocation ~18x by @danmestas in #150
- perf: route history-walking expansions through content.Cache by @danmestas in #153
- sync: retransmit deltas during clone instead of expanding them by @danmestas in #154
- fix: frame cfile wire payload as fossil on-disk blob [4-byte size][zlib] by @danmestas in #155
- manifest: fix crosslink's WAL/availability/mlink working-set problems by @danmestas in #158
- manifest: run leaf/tag repair on interrupted crosslink sweep by @danmestas in #159
- deck: strip PGP/SSH clearsign framing before VerifyZ by @danmestas in #160
- manifest: emit delete rows for omitted files and fix rename pid by @danmestas in #163
- chore: drop go.mod replace directives, unblock release by @danmestas in #161
- fix: decode sync replies by the wire's real Content-Type, not a hardcoded assumption by @danmestas in #165
- fix: make the mid-round phantom-fill crosslink cascade honor the clone deadline by @danmestas in #168
- sync: thread the general sync path's deadline to the phantom-fill crosslink cascade by @danmestas in #169
- perf: cache prepared statements in db.Querier to stop per-call SQL re-parse by @danmestas in #171
- ci: pin canonical fossil to 2.28 instead of the distro package by @danmestas in #173
- perf: batch the phantom-fill crosslink cascade onto a shared content cache by @danmestas in #175
- ci: warm fossil's global config database once before the test steps by @danmestas in #177
- perf: bound the delta encoder's hash-collision chain walk by @danmestas in #178
New Contributors
- @dependabot[bot] made their first contribution in #42
Full Changelog: v0.6.2...v0.7.0
v0.6.3
Bug fixes
-
Concurrent-writer SQLITE_BUSY race (#33, #34):
db.WithTxopenedBEGIN DEFERRED, so under WAL two concurrent writers raced the SHARED→RESERVED upgrade and SQLite's deadlock-avoidance returnedSQLITE_BUSYimmediately — bypassingbusy_timeoutentirely.DSN now sets
_txlock=immediatein bothdb/driver/moderncanddb/driver/ncrucesdrivers so everyBEGINacquires RESERVED upfront. The second concurrent writer blocks atBEGIN(wherebusy_timeoutapplies) instead of racing at the upgrade.Verified empirically: 50/50 fail without fix, 0/50 with fix.
Downstream impact
Unblocks sesh's --scope=project mode for symmetric-concurrent-write workloads. Sesh consumers should bump to github.com/danmestas/libfossil@v0.6.3 and remove any single-writer caveats from --scope=project documentation.
What's Changed
- fix: DSN
_txlock=immediateto serialize concurrent writers (#33) by @danmestas in #34
Full Changelog: v0.6.2...v0.6.3
v0.6.2
What's Changed
- fix: Repo.Commit preserves parent's tracked files (#30) by @danmestas in #32
Full Changelog: v0.6.1...v0.6.2