[crossfire] 2.0 release, was Re: Code restructuring

Mark Wedel mwedel at sonic.net
Fri Jul 21 00:59:54 CDT 2006


Alex Schultz wrote:
> Mark Wedel wrote:
>> One thought is to define major.minor.micro releases like this:
>>
>> major release: Changes that break compatiblity (need to start with a clean 
>> server as player files are not compatible, server/client compatibility may be an 
>> issue, and/or programs removed (x11 client goes away for example).
>>   
> I feel that changes that break compatibility should not be required in
> order for there to be a major version change, I believe that a major
> change from the gameplay point of view, would also go to major releases.

  I didn't mean to imply that is the only justification for a major release. 
Just if such a change is made, no matter how minor otherwise, that should 
warrant an increase in the major release numbering.

> Also, variability of automated conversion utilities should not
> disqualify map/arch/playerfile/etc. format changes from going towards a
> major release.

  But those can't always work and/or creates other problems.  In the past there 
have been changes that change things in various ways that would be hard to 
automate, and/or would make changes to characters that would be unexpected to 
players (try to explain to players why their stats are different now than last 
night, or why their item isn't as powerful) - you'll get a lot of upset players 
in such cases if a player who used to have no problem killing monster X is now 
killed by it because of changes made to the character.

  There is also the issue of fairness (character X created before change is made 
and is thus more powerful than new character Y can be under revised rules).

  And there is some cost in time, testing, resources of writing such conversion 
tools.  At some level, you just have to say 'hey, the game has changed, start 
over'.  We just have to be careful that doesn't happen too often.

>> stable branch:  This is where minor/micro releases come from.  When a new major 
>> release is done, a new stable (stable-2-0-0, stable-3-0-0) is done.  I really 
>> only see one stable branch per major release - the determination of micro/minor 
>> is a call of the RE at time of release based on what changes.  I think in this 
>> model, releases done on a fairly regular schedule (quarterly?  Every 6 months) 
>> since the number of changes probably won't be that big.
>>   
> This makes sense, except for one thing. Unless we set up hard cycles of
> development, or make micro releases for even fixes of things as small as
> two non-critical bugs, we will have almost no micro releases ever,
> because every time time there are enough bugfixes to be worth making a
> micro release, we most likely would also have a couple feature
> enhancements which would force it to be a minor release instead of
> micro. One option if we want micro releases to be meaningful, is on a
> frequent regular basis, check if there are a couple or more bugs that
> were fixed in the cvs stable branch, and if there were no feature
> enhancements in that same timeframe, then make a micro release.

  If there are never any micro releases, that is fine IMO.  In fact, I'd 
generally not expect there to be many micro releases, but I could see see a 
minor release made, a critical bug found a few days later, and can't really 
justify a minor release, but you need to get a new version out, so do a micro.

>>   The question is then who is responsible for updating the stable branch.  IS 
>> the developer who commits the change responsible?  Do we have some people 
>> responsible for maintaining the stable branch and they make the call on what 
>> changes to pull out of the main?  And you get that thorny issue - what level of 
>> enhancements from the main branch get put into the stable branch.  While some 
>> may be obviously incompatible, there could be other ones which are pretty 
>> significant changes.
>>   
> Well, I think that we don't have the manpower to maintain a stable
> branch separately like some larger projects may be able do, hence I
> think it should be the responsibility of the developer who commits.
> One other note you didn't really say anything about, is once a major
> release is released, the only stable branch that should be maintained
> should be the one for that major release number. What I mean is, when
> 3.0.0 is released, we should no longer bother with the 2.x.x branch, and
> the stable branch for 3.x.x will be made, and then the head branch will
> represent things for 4.0.0.

  Yes - I didn't say that in terms of major/stable, but that is how I expect it.

  It may be reasonable that right after a major release, the stable branch for 
the previous gets updated for some limited time - sort of same above - if 3.0.0 
is released, and the next day, a major bug is discovered that affects the 2.0.0 
stable branch, may want to still update that 2.0.0 stable and make a release 
simply because it may be unreasonable for everyone to switch over to the next 
major release in a few days (I'd say this overlap time would be 1 month at most, 
but then this also sort of depends on how often major releases are done - if 
major releases are done every 6 months, then updating to major releases 
shouldn't be seen as such a big deal).

>>   Under this model, I don't think you want to go too long between making major 
>> releases - simply because as more time passes, the code from major and stable 
>> will drift farther and farther apart, making it harder and harder to take any 
>> fixes from the main branch to the stable branch - this then basically amounts to 
>> having two different programs to maintain (and/or the stable branch stops 
>> getting change as if I fix a bug in the head branch and can't easily see in the 
>> code where that belongs in the stable branch, I may not be inclined to get the 
>> stable branch, compile, spend the time to debug, etc to try and fix that problem).
>>   
> Agreed. For that reason, I also believe that a major code restructure
> should be done in a major release, and the major release should happen
> immediately after the restructure is done in order to minimize headaches.

  But that can then lead to rapid turnover of major releases. Eg, I do major 
code restructure, make 3.0.0 release.  Then some other change is made (maybe 
compatibility breakage, maybe some other code restructure) - do you make a 4.0.0 
release 3 months later then?  I think there needs to be some minimum/maximum gap 
between major releases.


> As it stands now, there is just as much danger running a CVS server,
> except that nobody makes compatibility breaks even when there may be a
> good reason, hence I think so long as conversion utilities are made and
> the protocol stays reasonably stable, it should be just fine.

  but IMO, allowing breakage is one of the advantages of major cycles.

  There is lots of old code related to protocol handling to support old clients. 
  That should get pulled, but may break some number of clients.

  And conversion routines, as mentioned above, can still be problematic.

  Now there is no technical reason multiple servers can't be run on the same 
physical box (don't even need virtual hosts, but that could be one of the easier 
  ways - another would be to use different port numbers) - that could help 
server admins - they could set up the new server on some new port, and use 
different set of player files, etc.

  but I think it is desirable to periodically start with a clean slate.  While 
conversion scripts are nice, if the changes are significant, we shouldn't be 
afraid to force a restart.  We should limit how often we do this (and/or try to 
consolidate as many of those changes into one major release vs stringing it out 
accross several major releases).



More information about the crossfire mailing list