Releasing Xdelta
June 20, 2026 · View on GitHub
This document describes how to cut a new Xdelta release. Releases are infrequent, so the goal is a short, repeatable checklist that leans on GitHub Actions to do the heavy lifting.
Overview
Releases are driven entirely by annotated git tags of the form
vMAJOR.MINOR.PATCH (for example v3.2.0). Pushing such a tag triggers the
Release workflow, which:
- Verifies that the tag matches the version baked into the sources.
- Builds dependency-free prebuilt binaries for Linux, macOS, and Windows.
- Assembles a source tarball with
git archive. - Publishes a GitHub Release with auto-generated notes and all of the above attached as assets.
Branch and tag conventions
Xdelta keeps a long-lived release branch per minor series, named
releaseMAJOR_MINOR_apl (the _apl suffix records that these sources are the
Apache-licensed line). Historically:
release3_0_apl— the 3.0.x series (tagsv3.0.9,v3.0.10,v3.0.11).release3_1_apl— the 3.1.x series (tagv3.1.0).
New development happens on main. When a minor series is ready to ship, it is
branched off main into a new releaseMAJOR_MINOR_apl branch, and point
releases for that series are tagged on that branch. The 3.2.0 release
introduces release3_2_apl.
CI (.github/workflows/ci.yml) runs on main and on the active release
branches, so add new release branches to its push: trigger list when you
create them.
Versioning
The version lives in two places that must stay in sync; the release workflow fails fast if the tag disagrees with either:
xdelta3/CMakeLists.txt— theproject(... VERSION x.y.z ...)line.xdelta3/xdelta3-main.h— theXdelta version x.y.zstring inmain_version().
Cutting a new minor release (e.g. 3.2.0)
-
Make sure
mainis green. Wait for CI onmainto pass. -
Create the release branch from
main:git checkout main && git pull git checkout -b release3_2_apl -
Set the version to
3.2.0in both files listed under Versioning, then commit:git commit -am "Release 3.2.0" -
Add the branch to CI. In
.github/workflows/ci.yml, addrelease3_2_aplto theon: push: branches:list, and commit that too. -
Push the branch and let CI run:
git push -u origin release3_2_apl -
Tag and push once CI is green:
git tag -a v3.2.0 -m "Xdelta 3.2.0" git push origin v3.2.0 -
Watch the release. The
Releaseworkflow runs on the tag and creates the GitHub Release. Review the auto-generated notes and edit them if needed:gh run watch gh release view v3.2.0 --web
Cutting a point release (e.g. 3.2.1)
Point releases stay on the existing series branch:
git checkout release3_2_apl && git pull
# ... cherry-pick or commit fixes ...
# bump the version to 3.2.1 in the two files above
git commit -am "Release 3.2.1"
git push
# once CI is green:
git tag -a v3.2.1 -m "Xdelta 3.2.1"
git push origin v3.2.1
Re-running a release build
If the release job needs to be re-run for an existing tag (for example after a transient runner failure), trigger the workflow manually:
gh workflow run release.yml -f tag=v3.2.0
gh release create is not idempotent, so delete the partial release first if
one was created:
gh release delete v3.2.0 --yes
Documentation
User-facing documentation historically lived on the wiki branch (for
example CommandLineSyntax.md). That content is being migrated to a GitHub
Pages site; until that lands, the wiki branch remains the source of truth.
Keep README.md pointing at the canonical documentation location as it moves.