[GNC-dev] Git branches
Geert Janssens
geert.gnucash at kobaltwit.be
Tue Nov 15 12:25:42 EST 2022
Op maandag 14 november 2022 19:59:24 CET schreef john:
> I guess we could do that as long as we continue the no-backports policy, but
> it's something you argued against when we started using git-flow a few
> years ago.
>
I don't have a clear memory of what I argued against way back then. It doesn't matter much.
In reality we have continued to avoid backporting anyway, which is just fine for the small
team that we are.
> But what about the opposite approach, having only one permanent branch and
> no major releases? Instead of 5.0 next spring we'll release 2023.1 and the
> spring after that 2024.1, with .2 in June, .3 in September, and .4 in
> December every year? Major changes, like c++options, get merged when ready;
> we might do a beta release (e.g. 2023.2beta) a month before a release with
> a major change to get better user testing. We'd have to work out policies
> for API and schema changes because it would blow up the file upgrade path
> for users who've skipped some releases. There's a very dense exposition on
> this pattern at http://dymitruk.com/blog/2012/02/05/branch-per-feature/.
It's actually a branch and release pattern I had been considering but was hesitant to bring
up as perhaps to radical. Since you now bring it up for consideration, let's evaluate it after all.
1. I like the idea of only a single release branch and all development happening on feature or
bugfix branches that get merged into this release branch when ready.
2. I also like the idea of dropping distinction between a stable and development series. It
would bring improvements to users much faster in general - it will be released when ready,
not queued for the next major release (which could be only in 2 years worst case).
It's a bit what fast moving projects such as webbrowsers currently do.
3. Year based release numbering is also very clear. And always gives a reasonable indication
of how old a given version of gnucash is.
On the flip side
1. This does do away with semantic versioning completely. But that's the whole point of
having only one release branch. Each release can be a mix of bugfixes and new features.
2. I imagine this only works well if newly added code (features or bugfixes alike) is well
tested, implying having tests written for it. And that the existing code base is well tested as
well. While slowly improving, the gnucash code is still not very well covered.
I also read through the dymitruk article you linked to. There are a few other elements that
are not fully clear to me yet:
* he talks about an integration branch. Is that a branch that people continue to merge their
new work in, and that just serves
a. to discover and resolve merge conflicts early on and
b. to run an integration test suite on
Will this branch ever be cleaned or just merge upon merge be added to it ? I have no clear
example of how such a branch is used really.
* there's a separate release branch. Which can be reset from time to time if bad features are
to be skipped for the most recent release. Resetting a branch seems to conflict with
distributed repositories in my mind. But perhaps this is not a problem if it's commonly
known this a a resettable branch. And no devs except for the release manager should really
check out this branch and then even only while preparing for releases ? It's a bit vague to
me.
* handling merge conflicts and sharing the resolutions seem to be an important part of the
solution. Otherwise these conflicts continue to trip up different devs. There was a suggestion
as to how to do this, but nothing concrete. Something to figure out as well.
As for the API and schema changes, that would indeed require some reconsideration.
I have a few first thoughts, but nothing well structured:
* For API the important change to keep in mind is deprecation. New API won't be an issue.
Do we support function signature changes or should a new function be defined in that case ?
Current policy is that we deprecate in a stable series and remove in a future major release.
As our current schedule is a two-year cycle for major releases, we could make the policy "a
deprecated feature/function will be kept around for 2 years, after which it will be definitely
removed". Other durations can be chosen as well, as long as it's clear. So consumers of the
api could at most jump two years ahead from the version they currently use with a
guarantee their own code continues to work. At that point they should do the work of
updating their code to cope with deprecated api.
More information about the gnucash-devel
mailing list