development.md
June 23, 2026 ยท View on GitHub
Development
In order to build and test your changes, simply run ./scripts/develop.
During development, repository source files keep INSTALL_VERSION and the
latest update SQL filenames at unreleased. CMake derives the installed
PostgreSQL extension version from that placeholder as ${PROJECT_VERSION}dev,
so a development build of project version 4.5.0 installs control, SQL, and
module metadata for 4.5.0dev. Release scripts still replace the source
placeholder with the exact release version.
For local upgrade-validation coverage, install pg_validate_extupgrade so
ctest can run the same extension-upgrade checks as CI. Without it, CTest
registers explicit *_validate_extupgrade_unavailable placeholder tests and
those placeholders fail when your worktree touches upgrade-sensitive SQL or
CMake files:
cargo install --git https://github.com/rjuju/pg_validate_extupgrade pg_validate_extupgrade
When pg_validate_extupgrade is available, the test suite runs it against a
temporary build-tree PostgreSQL cluster instead of the developer's default
local server.
Documentation is generated from the SQL files using scripts/documentation (requires poetry).
This command also validates that all extension GUCs are documented in h3/src/guc.c.
Release Process
- Prepare the release branch
- Pick
X.Y.Z. TheX.Ypart must match the bundled H3 core version; bump only the h3-pg patch when H3 core has not changed. - Start from a clean tracked worktree on the branch you want to release from.
- Run
scripts/release X.Y.Z. SetRELEASE_DATE=YYYY-MM-DDonly when the changelog and citation date should differ from today. - The script creates
release-X.Y.Zand leaves the release changes uncommitted for review.
- Pick
- Review the release diff
- Root
CMakeLists.txthasVERSION X.Y.Z, setsINSTALL_VERSIONto${PROJECT_VERSION}, and therefore installs exactlyX.Y.Zinstead of the generated development version. - The
h3andh3_postgisupdate files that ended in--unreleased.sqlhave been renamed to end in--X.Y.Z.sql, and their CMake references were renamed with them. - Installer SQL availability comments, generated API documentation,
CITATION.cff,CHANGELOG.md, and the extension upgrade regression target all refer toX.Y.Z. scripts/check-metadataandgit diff --checkpassed at the end of the script run.
- Root
- Commit and merge the release branch
- Commit the reviewed release changes.
- Push and merge
release-X.Y.Z.
- Publish the GitHub release
- This is a maintainer action, not part of
scripts/release. The release manager, or another maintainer with GitHub release permissions, publishes the release afterrelease-X.Y.Zis merged. - Create or draft release
vX.Y.Zfrom the merged release commit onmain. If GitHub creates the tag, verify that tagvX.Y.Zpoints at that commit. - Copy the
CHANGELOG.mdentry into the release description, including the link reference definitions used by that entry, and preview the rendered Markdown before publishing.
- This is a maintainer action, not part of
- Distribute the extension on PGXN
- Run
scripts/bundleto package the release - Upload the distribution on PGXN Manager
- Run
- Prepare the next development cycle
- After the release branch is merged, start from the updated main branch.
- Run
scripts/postrelease. The script restoresINSTALL_VERSIONtounreleased, creates the next emptyh3--X.Y.Z--unreleased.sqlandh3_postgis--X.Y.Z--unreleased.sqlfiles, adds them to the extension CMake files, keeps the upgrade regression target pointed at the default extension version, and runs the release metadata checks. - Review, commit, push, and merge the post-release development branch.