Release management of SigScheme
===============================

Versioning scheme
-----------------

A SigScheme version number is built up as follows:

----------------------------------------------------------------
  major.minor.patchlevel
----------------------------------------------------------------

The 'patchlevel' number is incremented after every release by
`rake version:bump`. The 'major' and 'minor' numbers are incremented
manually when needed. As an example: 1.0.0 will become 1.0.1 after the
release. 1.0.1 may become 1.1.0 manually for a release that has large
changes.

There's no limit to each number, it will continue past 9 with 10, in other
words: after release 1.0.9 we will see release 1.0.10.

The version is written in the following files:

  - `AC_INIT()` in `configure.ac`
  - `version` of `project()` in `meson.build`
  - `SSCM_VERSION_*` in `include/sigscheme/sigscheme.h`

`rake version:bump` updates all of them. Update them manually when the
'major' or the 'minor' number is incremented.


Release procedures
------------------

Documents update
~~~~~~~~~~~~~~~~

Add a section for the new version at the top of `NEWS.md`. The release note
of GitHub Releases is generated from the section. Update `RELNOTE` too.

Versioning
~~~~~~~~~~

Confirm the version numbers described in "Versioning scheme".

And do not forget updating `src/libtool-version.mk` if `libsscm` ABI has been
altered from previous version. Meson also uses it.

Test
~~~~

Make all tests passed.

----------------------------------------------------------------
$ meson setup -Dconf=full build
$ meson test -C build
$ meson compile -C build r7rs-tests
----------------------------------------------------------------

Push the changes and confirm that CI is passed.

Tagging
~~~~~~~

----------------------------------------------------------------
$ rake release
----------------------------------------------------------------

It does the followings:

  1. Creates the `x.y.z` tag and pushes it
  2. Bumps the 'patchlevel' number and pushes it

Packaging and publishing
~~~~~~~~~~~~~~~~~~~~~~~~

The "Release" job of CI (`.github/workflows/linux.yml`) is run for the pushed
tag. It does the followings:

  1. Creates source archives by `make distcheck` and `make sum`
     (`ci/release.sh`)
  2. Creates a release on GitHub Releases with the source archives and the
     release note generated from `NEWS.md`

The source archives are the followings:

----------------------------------------------------------------
sigscheme-x.y.z.tar.gz
sigscheme-x.y.z.tar.bz2
sigscheme-x.y.z.sum
----------------------------------------------------------------

The release is announced in GitHub Discussions too.
