Release Engineering
The processes used in our current software development lifecycle is riddled with problems and clearly resembles an immature development model.
Versioning
Every release after celeron55 passed Minetest off, only the patch version number has been incremented. I suppose the major version number stayed 0 to serve as a reminder that MT is not a finished game.
Minetest is not quite an 'indy' game (nevermind a game) any longer. Instead, as an engine hosting a plethora of games, the goal becomes a moving target with no end in mind, so this sort of pre-alpha nomenclature isn't quite valid any longer.
I'm not sure if the game-to-engine transition was anybody's vision, and surely was not celeron's, but it is what naturally evolved from the inclusion of such a powerful scripting API and people mostly seem to like it.
Nevertheless, the version string is being used incorrectly and we can't indicate a patch release because that's being used as the minor version.
Releasing
The master branch goes into an indefinitely long feature freeze in which only bugfixes or cosmetic changes may be committed. They usually last 1 week but they may be extended based on the whims of a couple people who object. After this period of waiting, several developers relevant to the release process, often the only ones with control over some portion of it, must gather together to follow a set of established guidelines and perform the release. Development then resumes after this.
Maintenance
No patches for a release unless there's something very wrong to prevent it from working.
This results in Minetest hanging in a state perpetual bugginess. Problems that don't get fixed or show up during the feature freeze are left broken until the next release, where there are new bugs.
A Modest Proposal
First, fix the version number fiasco. The next release of Minetest should be 5.0 and with each subsequent release the minor version number is incremented instead of the patch level. The patch level should instead be incremented with each update a version gets after release. I want to clarify that 5.0 was chosen this way: 0.5.0 would probably be a good place to restart at since it's even, and let's be honest, the current version's codebase has little to do with 0.4.3. Then, shift each number to the left one decimal place. Therefore, 5.0.
Let's use a modified version of the FreeBSD release model. Each release will result in a bump of the minor version number. Separate branches will be maintained for each release; bugfixes and worthwhile performance improvements will be continually backported to the previous release.
Feature freezes should involve creating the branch that is to be released, mark it as an -RC version, and simply not push new features to that branch (but, by all means, keep working on upstream master).
And please, let's have the binary building process standardized so that it can be done by any one single person. More dependencies is bad. I want to see builds more often. Because builds will be more common and current, there won't be any stress or failures to deliver when a holiday release is made (when the needed developers probably won't be around)
So to recap, it'd work like this:
5.0.0 is the current version
upstream/master is 5.1-dev
Let's say we fix some sort of big bug that existed in 5.0 - we backport the fix to 5.0 to the "5.0" branch and mark the version 5.0.1. We won't backport the fix to any versions older than that, however.
A release should come, so we create the 5.1 branch and call it 5.1-RC1. The feature freeze is in effect for this branch, but new features can still be added to upstream. Bugfixes should be pushed to both upstream and the release candidate fork. After a week or two (with several builds in between), 5.1 should be released. The patch number gets set to 0 and the version is called 5.1.0.
Versioning
Every release after celeron55 passed Minetest off, only the patch version number has been incremented. I suppose the major version number stayed 0 to serve as a reminder that MT is not a finished game.
Minetest is not quite an 'indy' game (nevermind a game) any longer. Instead, as an engine hosting a plethora of games, the goal becomes a moving target with no end in mind, so this sort of pre-alpha nomenclature isn't quite valid any longer.
I'm not sure if the game-to-engine transition was anybody's vision, and surely was not celeron's, but it is what naturally evolved from the inclusion of such a powerful scripting API and people mostly seem to like it.
Nevertheless, the version string is being used incorrectly and we can't indicate a patch release because that's being used as the minor version.
Releasing
The master branch goes into an indefinitely long feature freeze in which only bugfixes or cosmetic changes may be committed. They usually last 1 week but they may be extended based on the whims of a couple people who object. After this period of waiting, several developers relevant to the release process, often the only ones with control over some portion of it, must gather together to follow a set of established guidelines and perform the release. Development then resumes after this.
Maintenance
No patches for a release unless there's something very wrong to prevent it from working.
This results in Minetest hanging in a state perpetual bugginess. Problems that don't get fixed or show up during the feature freeze are left broken until the next release, where there are new bugs.
A Modest Proposal
First, fix the version number fiasco. The next release of Minetest should be 5.0 and with each subsequent release the minor version number is incremented instead of the patch level. The patch level should instead be incremented with each update a version gets after release. I want to clarify that 5.0 was chosen this way: 0.5.0 would probably be a good place to restart at since it's even, and let's be honest, the current version's codebase has little to do with 0.4.3. Then, shift each number to the left one decimal place. Therefore, 5.0.
Let's use a modified version of the FreeBSD release model. Each release will result in a bump of the minor version number. Separate branches will be maintained for each release; bugfixes and worthwhile performance improvements will be continually backported to the previous release.
Feature freezes should involve creating the branch that is to be released, mark it as an -RC version, and simply not push new features to that branch (but, by all means, keep working on upstream master).
And please, let's have the binary building process standardized so that it can be done by any one single person. More dependencies is bad. I want to see builds more often. Because builds will be more common and current, there won't be any stress or failures to deliver when a holiday release is made (when the needed developers probably won't be around)
So to recap, it'd work like this:
5.0.0 is the current version
upstream/master is 5.1-dev
Let's say we fix some sort of big bug that existed in 5.0 - we backport the fix to 5.0 to the "5.0" branch and mark the version 5.0.1. We won't backport the fix to any versions older than that, however.
A release should come, so we create the 5.1 branch and call it 5.1-RC1. The feature freeze is in effect for this branch, but new features can still be added to upstream. Bugfixes should be pushed to both upstream and the release candidate fork. After a week or two (with several builds in between), 5.1 should be released. The patch number gets set to 0 and the version is called 5.1.0.