[Licq-devel] Proposal for new branch and release strategy

Anders Olofsson <[email protected]> Tue, 29 Dec 2009 12:36:53 +0100
Newsgroups gmane.network.licq.devel
Message-ID <[email protected]>
I've done some thinking regarding the branch and release strategy we 
(don't) have and would like to share my thoughts on the problems and 
propose a solution.
Please let me know what you think and fill in any details I might have 
missed.

BR
/Anders


Current situation:
We currently work only in the trunk and we make major changes and break 
plugin API within the same minor release series.
We have no strategy for releasing corrections or important updates on 
short notice. Example 1: when the ICQ login problem appeared last year 
we only released a patch and it took several months before we released a 
real version with the update. Example 2: Licq 1.3.7 had a broken RMS 
plugin, in this case we could release the correction as 1.3.8 but I 
consider it luck that trunk was still relatively unchanged since 1.3.7.
Since 1.3.8 was released, additional bugs have been discovered that I 
would like to release corrections for within the next months, but as 
development in the trunk has resumed I don't know whether a new release 
will be possible or if it will have to be patches this time.
To me it seems that very few people test the release candidates and 
problems aren't found until after the final release is made.

Also, due to technical reasons, Licq versions are limited to 5 digits 
with the following distribution "XX.YY.Z", i.e. whereas major and minor 
versions can go to 99, the release version only goes to 9. To me this 
indicates that the minor version should be stepped (instead of the 
release version) more frequently than we currently do.

Proposed new strategy:
* Normal development continues in trunk as today.
* When it's time for a 1.4.0 release a 1.4-branch is created from the 
current trunk (either from the point of the 1.4.0-RC1 package or some 
time earlier if the trunk is unstable and needs to be stabilized first)
* Bugfixes and other updates for the 1.4.0 release are committed to the 
1.4-branch while development of new features continue in the trunk.
* Additional RCs (if needed) and the final 1.4.0 package are built from 
the 1.4-branch.
* After the release of 1.4.0, the 1.4-branch is kept alive to take 
bugfix commits and is used for building future 1.4.1, 1.4.2, 1.4.3, etc.
* When 1.5.0 is released, bugfixes will go to the 1.5-branch instead.
* Important or critical corrections can still go to the 1.4-branch as 
well (for example if an exploit is found or a protocol update is needed) 
to make additional 1.4.x releases, however this should be a rare event.

Advantages:
* We can release bugfix versions with short notice without having to 
worry about new features or experimental changes in the trunk breaking 
the release.
* We can make pure bugfix releases, which should lead to more stable and 
bug free Licq versions for our users.
* No more code freezes in trunk, development can continue regardless of 
any ongoing releases.

Disadvantages:
* More work for developers as bugfixes needs to be committed or merged 
to both the maintenance branch and the trunk.
* As developers are likely to mostly run the trunk version there is a 
chance that the maintenance branch won't be as well tested between 
releases and faults introduced by the bugfixes aren't caught.


When do we introduce this?
* I suggest that when it's time for the next Licq version to be released 
from the trunk, it becomes version 1.4.0 and starts using the above 
strategy.
* If we want or need to make a 1.3.9 release, a 1.3-branch should be 
created from the 1.3.8 tag and only the relevant corrections be merged 
to it.

Open questions:
* Should we have another branch level to separate major and minor 
versions? (My suggestion is No. It's probably easier to create separate 
working branch when needed for major changes, like was done for cmake, 
instead of having a permanent extra level that needs merges all the time)
* Should we allow minor/simple features to be committed in the 
maintenance branch or keep it strictly to bugfixes? Example of a minor 
feature: Introducing a new keyboard shortcut in the GUI. (I can go 
either way with this one, but plugin API should never change between 
bugfix releases of the same minor version.)
* Should we have a fixed release plan for minor versions? We currently 
release once per year, do we maybe want to change it? (My suggestion is 
to not have fixed dates for the minor versions as it's better to let the 
stability and activity of the trunk decide when it's a good time to 
release.)
* Should we have a fixed release plan for the bugfix releases of each 
minor version? For example: one release every X months until the next 
minor version is released. (I'm leaning towards Yes on this one as it 
allows us to promise bugfixes to be released within a certain time even 
if there are only minor bugs corrected.)
* Should bugfixes be committed first in maintenance branch and then 
merged to trunk or vice versa? (Since I'm unfamiliar with working with 
branches in subversion, I don't know what is the normal strategy.)