# Release procedure

**This page is WIP. The following procedure is not yet approved for use**

# Trunk

Meson operates under the principle that trunk should (in theory) be always
good enough for release. That is, all code merged in trunk must pass all unit
tests. Any broken code should either be fixed or reverted immediately.

People who are willing to tolerate the occasional glitch should be able to
use Meson trunk for their day to day development if they so choose.

# Major releases

Major releases are currently in the form 0.X.0, where X is an increasing
number. We aim to do a major release roughly once a month, though the
schedule is not set in stone.

Before a major release is made a stable branch will be made, and 0.X.0-rc1
release candidate will be made. A new milestone for 0.X.0 will be made, and
all bugs effecting the RC will be assigned to this milestone. Patches fixing
bugs in the milestone will be picked to the stable branch, and normal
development will continue on the master branch. Every week after after this a
new release candidate will be made until all bugs are resolved in that
milestone. When all of the bugs are fixed the 0.X.0 release will be made.

# Bugfix releases

Bugfix releases contain only minor fixes to major releases and are designated
by incrementing the last digit of the version number. The criteria for a bug
fix release is one of the following:

 - release has a major regression compared to the previous release (making
   existing projects unbuildable)
 - the release has a serious bug causing data loss or equivalent
 - other unforeseen major issue

In these cases a bug fix release can be made. It shall contain _only_ the fix
for the issue (or issues) in question and other minor bug fixes. Only changes
that have already landed in trunk will be considered for inclusion. No new
functionality shall be added.

# Requesting a bug fix release

The process for requesting that a bug fix release be made goes roughly as follows:

 - file a bug about the core issue
 - file a patch fixing it if possible
 - contact the development team and request a bug fix release (IRC is the
   preferred contact medium)

The request should contain the following information:

 - the issue in question
 - whether it has already caused problems for real projects
 - an estimate of how many people and projects will be affected

There is no need to write a long and complicated request report. Something like the following is sufficient:

> The latest release has a regression where trying to do Foo using Bar
breaks. This breaks all projects that use both, which includes at least [list
of affected projects]. This causes problems for X amount of people and
because of this we should do a bugfix release.
