Releases: usecontextlayer/pggit
Releases · usecontextlayer/pggit
Release list
v3.0.1
v3.0.0
3.0.0 (2026-08-27)
- feat(fetch)!: serve thin packs with serve-time warm tree deltas (337a91f)
- feat(gc-scheduler)!: run repack as a phase of the GC drain (81db202)
- feat(ingest)!: reject non-UTF-8 refnames and tree paths at the push boundary (50ff103)
- feat(object)!: derive commit/tag rows and generations, replacing edge derivation (0f26fa5)
- feat(reachability)!: replace the edge-CTE closure with row-driven walks and a bitmap reachability epoch (d81dbc9)
- feat(repo-view)!: advance repo_file by tree diff from a recorded per-branch basis (8a59797)
- fix(protocol)!: match canonical git on ack suppression, zero-have fetch, and d/f conflicts (fc29e42)
- refactor(repo-file)!: rename repo-view to repo-file and collapse snapshot vocabulary into projection (1cf2272)
Bug Fixes
- crash on impossible states instead of silently defaulting (8b558ed)
- deps: patch postgres driver to surface connection death to copy streams (d5ca6b2)
- gc: keep a repo eligible until a GC pass runs past its grace horizon (d703472)
- gc: make the encoding tier's hygiene structural instead of a sweep (95b8f7f)
- match canonical git on negotiation readiness, delta minimums, and typed-edge policy (f0d70f1)
- pack: reject malformed delta programs instead of synthesizing zero bytes (750ff99)
- protocol: emit in-band ERR with canonical git's exact framing (bba0071)
- protocol: enforce git's refname and typed-graph policies at the receive boundary (7e97b38)
- reachability,receive-pack: count commit-bit misses even when the oid is also a tag (fe6db6f)
- reachability: classify tag-parent edges as violations instead of corruption (e882749)
- reachability: judge a stored tag once across every role at a level (ecd6d0d)
- receive-pack: judge directory/file conflicts in two ordered phases (0e9328a)
Features
- gc-scheduler: couple the repack arm to gc-due so a sweep re-covers encodings (7986e02)
- gc-scheduler: export the drain as a self-contained block with its own pool (5bd8fb1)
- index: export the offline repack builder from the package entrypoint (4d14c81)
- pack: derive a delta encoding tier and serve packs from it (ab5c06d)
- schema: add the derived-state spine tables and retire git_edge (ab4664a)
Performance Improvements
- fetch: expand client-held content only at the negotiation edges (f23ca33)
- fetch: seed client-held expansion from boundary parents only (9fd1566)
- test: raise the vitest worker cap from 3 to 6 (8ec5c13)
BREAKING CHANGES
DrainEntryno longer spreadsGcResult—entry.deletedObjects,entry.epoch, andentry.settlednow live underentry.gc, which is nullable on a repack-only pass.GcSchedulerOptionsalso gains a requiredrepackEnabledboolean, so directcreateGcScheduler/resolveGcSchedulerOptionscallers must pass it.GitAppDeps.snapshotsis renamed toGitAppDeps.projectionandReceiveBackend.syncRefSnapshottosyncRefProjection. Embedders passingsnapshotstocreateGitAppor implementing a customReceiveBackendmust update those names;createGitDepscallers are unaffected.RepoBackend.commonHaves(haves) => Oid[]is replaced byprocessHaves(haves) => { common, acks }; custom backends must implement the new method.RepoFileProjection.rebuildRefSnapshot(repoId, refName, fileList)is removed and replaced byapplyRefAdvance(repoId, refName, newOid, planner), which takes a commit oid plus aProjectionPlannerinstead of a materialized file list and requires therepo_file_headtable.RepoBackend.buildPackandObjectStore.buildPacktake a trailingthinPackargument, andObjectStore.isConnectedtakes an optionalboundarystop-set.git_edgeis gone — commit/tag structure now lives ingit_commit/git_tag.GcResult/DrainEntryno longer carrydeletedEdgesand now carryepoch;reachableClosureis renamedfullClosureandancestryReachesCommonis renamedancestry.@/object/edgesno longer exists —deriveEdges,EDGE_KIND, andtreeBlobOidsare removed andvalidateObjectnow lives in@/object/derive. Pushes containing tree entries with noncanonical modes are rejected at the ingest boundary and now fail where they previously succeeded.- schema: the
git_edgetable and itsGitEdgemodel are removed, and migration 0010 cannot be rolled back — edge derivation no longer exists, so reverting would leave a permanently empty table that pre-spine readers would silently trust. - pggit refnames and tree-entry paths must be valid UTF-8. Pushes that canonical git accepts — a refname or path containing arbitrary non-UTF-8 bytes — are now rejected outright rather than stored U+FFFD-mangled.
v2.1.0
v2.0.0
2.0.0 (2026-07-06)
- feat(receive-pack)!: deny non-fast-forward pushes and ref deletions (246ee6b)
BREAKING CHANGES
- receive-pack now enforces a deny-non-FF policy — non-fast-forward force-pushes and ref deletions that were previously accepted via CAS are refused; clients must fast-forward ref updates and can no longer delete branches over the wire.
v1.2.0
v1.1.0
v1.0.0
1.0.0 (2026-06-27)
- feat(db)!: adopt kysely, kanel codegen, and kysely-owned migrations (3f6878a)
- feat(protocol)!: serve full git clone over smart-HTTP v2 (9dd0aea)
- feat(storage)!: stream ingest through binary COPY and lift the push-size ceilings (259c210)
- refactor(storage)!: collapse the repo_view projection onto git_object (77aa854)
- refactor(storage)!: replace pack-blob storage with a postgres-native object schema (cff466f)
Bug Fixes
- gc: stamp last_pushed_at after the ingest commits, not inside the txn (b83a768)
- http: decode gzip-compressed request bodies (406e304)
- http: return git smart-HTTP responses as arraybuffer bodies (d08aae5)
- object: fail loud on malformed or truncated git trees (35b5ec7)
- pack: resolve delta bases by fixpoint to handle chained ref-deltas (df939a4)
- protocol: serve empty pack for zero-want fetch to match git's oracle (11961e4)
- protocol: surface wire-fault and missing-want conditions as clean client errors, not 500 (5e3c7e7)
- release: drop npm provenance so scoped token publish works (49b80a8), closes npm/cli#8976
- testing: apply migrations directly to isolated schemas to avoid drop races (3701286)
- testing: handle benign git stdin EPIPE so the worker no longer crashes (8f40902)
Features
- add git object id and packfile object-header codecs (ee1c879)
- gc: add self-scheduling background GC drain (d45f191)
- gc: implement per-repo reachability garbage collection (4773eb4)
- generative: add extendRepoFromCommands seam for incremental differentials (dcf8cad)
- graph: enumerate reachable objects for fetch packing (ff8d7f6)
- instrument: add opt-in request-scoped performance instrumentation (a41e3d5)
- pack: add undeltified v2 packfile writer (99a691c)
- pack: add v2 packfile reader for base-type objects (9289994)
- pack: resolve OFS and REF deltas when reading v2 packfiles (2b3cdef)
- pkt-line: add git wire-protocol pkt-line framing codec (6e2f0e7)
- protocol: accept git push over smart-HTTP via receive-pack (febea7e)
- protocol: map client wire errors to clean 400s and harden request validation (49f669c)
- protocol: negotiate incremental fetch and serve blob:none partial clones (f50ab53)
- push: apply ref updates atomically for --atomic pushes (48f7eae)
- push: delete refs via delete-only pushes (3829d39)
- push: ingest thin packs and update refs via compare-and-swap (6022e27)
- push: reject pushes whose pack omits reachable objects (6cd57bf)
- repo-view: project pushed working trees into queryable Postgres rows (35c31ae)
- scaffold pggit git-remote-over-postgres server (f1e5903)
- storage: derive and store the commit/tree/tag DAG as queryable edges (fb33d41)
- store: add postgres-backed git object store (1a560f6)
- store: add postgres-backed git refs store (6df21c0)
Performance Improvements
- harness: add diagnostic clone-performance harness (dbc180f)
- storage: replace the O(N) connectivity walk with bounded SQL queries (25c7a1f)
BREAKING CHANGES
- the store factories createObjectStore, createRefStore, and createSnapshotStore now accept a porsager
Sqlclient instead of aKysely<Database>. - the queryable file view moves from
repo_view_files/repo_view_blobstorepo_filejoined togit_object, andRepoBackenddropsgetObjectand gains anincludeTagargument onbuildPack. - migration 0001_init is rewritten to the postgres-native schema (repos/git_object/git_ref) and drops the pack-blob model (packs/objects/refs, the dead_at soft-delete reaper, the offline repack worker); existing databases must be recreated.
- createObjectStore and createRefStore now require a Kysely rather than a postgres Sql and no longer provide migrate(); apply schema via db.manage or migrateToLatest.
- createGitApp now requires injected object/ref stores (GitAppDeps) and no longer accepts CreateGitAppOptions/databaseUrl; the removed AppEnv type and the old startServer-builds-app behavior are replaced by serveOnPort.