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.)