See: Project roadmap
Doomsday's release cycle is designed around stable releases at fixed dates and a balance between feature work, productization, and bug fixing. This is intended to result in high-quality code and a decreasing known bug count in the long term.
- Stable releases at fixed dates is important because otherwise there is a high likelihood of stable releases being postponed. The ever-present snowball effect easily causes feature work to expand into unplanned areas and directions, and this tendency must be consciously kept in check. The objective is to make high-quality stable releases at a regular frequency.
- Feature work is what drives the project forward. This is the exciting stuff that motivates developers to work on the project. However, during this type of work it is difficult to do general bug fixing in other parts of the code. To keep the master branch from breaking, this type of work should generally occur in separate work branches.
- Productization is when the master branch is merged into the stable branch, and the stable branch is then cleaned up to be suitable for use by everyone. Usually this involves a lot of polishing, verifying edge cases, and generally tying up all the loose ends after the work branches have been merged.
- Bug fixing is a crucial step where reported and other known bugs are addressed. During the bug fixing phase, bugs are evaluated, and fixed if possible. Bugs may also be scheduled for upcoming unstable phases, where the fixing will occur as a by-product of some larger change or improvement.
There are three different kinds of releases: Unstable, Candidate, and Stable. For more information, see Build types.
The project's issue tracker exists as a bookkeeping and communication tool. Ideally, viewing the issues associated with a particular release should be enough to answer the question what has changed and what has been fixed in this version?
In practice, this means that all changes and fixes of high enough significance should be entered into the tracker in some way.
Especially bugs should be tracked very carefully and meticulously, so that end users and developers alike are on the same page about the status and history of known bugs.
The primary branch is called master. All builds are made from it automatically on a (usually) biweekly schedule by the automated build system. This means that all development in the master branch must be atomic enough so that the branch remains releasable at any given moment. Other branches should be used for working on new features until they are ready for merging into the master. Bug fixing should be done in the master branch so that the fixes are released immediately. (Team members should take extra care of fixing bugs on the correct branch!)
Another important branch is the stable branch that is reserved for stable releases. It can be used for applying patches to the latest stable release.
We are using two kinds of work branches.
- Alternative masters: branched from master, these are used for working on a particular (large) feature. Progress is merged back to master in small chunks over time, after which work continues in the branch. Due to the merges and the interwoven history, these branches are essentially alternative master branches that will eventually all converge back to the true master.
- Offshoots: prefixed with "work/", these branches are for longer-term/experimental work that may not end up in the master. These branches should be rebased on the master to keep them up-to-date, and eventually cherry-picked into the master if deemed useful. This way the contained changesets have a clean history. An offshoot branch could also be cherry-picked into some alternative master and then merged later to the true master. As the "work/" branches may be replaced/rebased at any time, they are best used as private work areas rather than for collaboration.