Skip to content

Releases: usecontextlayer/pggit

v3.0.1

Choose a tag to compare

@github-actions github-actions released this 29 Aug 18:39
996ad79

3.0.1 (2026-08-29)

Bug Fixes

  • logging: silence drain notices and record refused pushes (b7f2395)

v3.0.0

Choose a tag to compare

@github-actions github-actions released this 27 Aug 19:19
f316ce2

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

  • DrainEntry no longer spreads GcResultentry.deletedObjects, entry.epoch, and entry.settled now live under entry.gc, which is nullable on a repack-only pass. GcSchedulerOptions also gains a required repackEnabled boolean, so direct createGcScheduler / resolveGcSchedulerOptions callers must pass it.
  • GitAppDeps.snapshots is renamed to GitAppDeps.projection and ReceiveBackend.syncRefSnapshot to syncRefProjection. Embedders passing snapshots to createGitApp or implementing a custom ReceiveBackend must update those names; createGitDeps callers are unaffected.
  • RepoBackend.commonHaves(haves) => Oid[] is replaced by processHaves(haves) => { common, acks }; custom backends must implement the new method.
  • RepoFileProjection.rebuildRefSnapshot(repoId, refName, fileList) is removed and replaced by applyRefAdvance(repoId, refName, newOid, planner), which takes a commit oid plus a ProjectionPlanner instead of a materialized file list and requires the repo_file_head table.
  • RepoBackend.buildPack and ObjectStore.buildPack take a trailing thinPack argument, and ObjectStore.isConnected takes an optional boundary stop-set. git_edge is gone — commit/tag structure now lives in git_commit/git_tag.
  • GcResult/DrainEntry no longer carry deletedEdges and now carry epoch; reachableClosure is renamed fullClosure and ancestryReachesCommon is renamed ancestry.
  • @/object/edges no longer exists — deriveEdges, EDGE_KIND, and treeBlobOids are removed and validateObject now 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_edge table and its GitEdge model 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

Choose a tag to compare

@github-actions github-actions released this 13 Jul 00:26
9a0bb3e

2.1.0 (2026-07-13)

Features

  • repo-admin: add whole-repo deletion with cascading teardown (9a0bb3e)

v2.0.0

Choose a tag to compare

@github-actions github-actions released this 06 Jul 13:16

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

Choose a tag to compare

@github-actions github-actions released this 27 Jun 18:22

1.2.0 (2026-06-27)

Features

  • migrate: export a consumer-runnable migrateToLatest with bundled migrations (a1e4ec5)

v1.1.0

Choose a tag to compare

@github-actions github-actions released this 27 Jun 03:02

1.1.0 (2026-06-27)

Features

  • routing: support slash-delimited repoIds via catch-all routes (fcbcbd4)

v1.0.0

Choose a tag to compare

@github-actions github-actions released this 27 Jun 02:16

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 Sql client instead of a Kysely<Database>.
  • the queryable file view moves from repo_view_files/repo_view_blobs to repo_file joined to git_object, and RepoBackend drops getObject and gains an includeTag argument on buildPack.
  • 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.