versioning strategy

hi all-

upgrading some apps from 1.2.3 -->> 1.2.5 and having all kinds of issues. lot's of functions have disappeared between versions, for instance #default_value in the pg connection adapter which breaks drysql, render_action disappearing (as indicated in past versions of course) which breaks active scaffold... etc.

none of this is a big deal or hard to fix, but it did surprise me given that it's only a minor version number which, in most circles would allow api additions and fixes, but no deletions or changes to calling signatures.

what is the rails' versioning number policy?

if this is posted somewhere i didn't have success finding it, apologies in advance.

cheers.

a @ http://codeforpeople.com/

If you remember, Rails 1.2.x releases where tagged from the “1.2 stable” branch. The name itself implies that there should be no breaking API changes. What happened here, IMO, is an overlook while applying bugfixes. Deprecated methods were meant to disappear in 2.0, not 1.2.x …

Are you sure you are really upgrading to 1.2.5, and not 1.2.5.blah? If you are using RAILS_GEM_VERSION to set your rails version (not vendor/rails), you may actually be using the 2.0 prerelease if you aren't careful.

There was a fix that went into 1.2.5 to boot.rb to fix this issue...

- Rob

Yes. First, see if you have a gem rails-1.2.5.xxxx installed on your machine. If you do, then you probably have a problem. To confirm, do a 'p $:' at the end of environment.rb. If you see that gem on your load path, then that's definitely the problem.

Uninstall the offending beta gem, then upgrade to the real 1.2.5 (not 1.2.5.xxxx), and also update your boot.rb using 'rake rails:update:configs' to avoid the problem in the future.

FYI, this ticket [ http://dev.rubyonrails.org/ticket/10074 ] seeks to avoid this issue in the future, and seems to have helped, since the new beta gem is 1.99.0. I think 2.0.0.<revision> would have been a better choice myself, but oh well :slight_smile:

-- Chad

Well then it would've loaded in front of 2.0.0, right? I think that's why 1.99 was chosen.

> what is the rails' versioning number policy?

If you remember, Rails 1.2.x releases where tagged from the "1.2 stable" branch. The name itself implies that there should be no breaking API changes. What happened here, IMO, is an overlook while applying bugfixes. Deprecated methods were meant to disappear in 2.0, not 1.2.x ...

The intention with the stable releases is that no part of our public api (the stuff documented in the api docs) breaks. If there are changes which have broken that, let us know by opening a ticket or mailing this list, we're already intending on another 1.2.x release to fix an associations regression introduced when fixing a performance issue with unsaved associations.

Plugins *will* break if they're messing with private methods, there's no way we can guess what private / implementation methods are being overridden. In the event that we keep busting a non-intrusive plugin, we can look at providing a stable API which will remain unbroken during a point release.

The changes like render_action disappearing only happened in trunk, so you're obviously running the 'fake' 1.2.x releases which are now labeled more clearly.

Yes, but I proposed incrementing the "TINY" component in the "real" release - so you'd get 2.0.1 as the first final release that you push to RubyForge. This would have the benefit of making the beta release versions more indicitive of what the actual release will be. e.g., 2.0.0.<x> seems closer to 2.0.1 than 1.99.<x> is to 2.0.0. When you refer to "2.0 RC1", it makes sense for the version to start with "2.0". As long as you aren't stuck on having the final release have a zero TINY component, this works fine. I describe this in more detail in the ticket.

Regardless, they versioning is now at least sequential with regard to branch/trunk chronology, and doesn't mix branch and trunk versions sequentially, so that's the main point. Thanks for making the change!

-- Chad

bingo. thanks all - problem solved.

i'm still pretty unclear about the versioning policy though (arbitrary svn tags which are not embeded in gems aside). i was after something a bit more concrete such as

   http://rubygems.org/read/chapter/7#page26

or, quoting from

   http://www.gnu.org/software/libtool/manual.html#Libtool-versioning

" So, libtool library versions are described by three integers:

current      The most recent interface number that this library implements. revision      The implementation number of the current interface. age      The difference between the newest and oldest interfaces that this library implements. In other words, the library implements all the interface numbers in the range from number current - age to current.

If two libraries have identical current and age numbers, then the dynamic linker chooses the library with the greater revision number. "

and the comments on a 1.99 version that is not backward compatible with 1.2.x make me wonder: what is

   this.that.andthat

supposed to mean in a rails version tag *exactly* ??

kind regards.

a @ http://codeforpeople.com/

and the comments on a 1.99 version that is not backward compatible with 1.2.x make me wonder: what is

   this.that.andthat

I can't help with a specific definition or a URL to point you at, but in practice code which used documented apis on 1.2.x should work on 1.2.y for all y > x. It's intended to be a drop in replacement, and when we introduce regressions we tend to fix them with a follow up release.

The choice between calling something 1.5 or 2.0 is a little more vague, but basically don't expect a drop in upgrade if the major number changes. The most important thing is to pay attention to the deprecation warnings you receive, the next major release will have that code removed.

As for 1.99, it's just a way to say 'not quite 2.0', it's not intended for production use and has no backwards or forwards compatibility guarantees, though obviously we hope it works just fine :).

fair enough - that's enough info to know which upgrades are ok to do on a friday night and which are not :wink:

thx

a @ http://codeforpeople.com/

upgrading some apps from 1.2.3 -->> 1.2.5 and having all kinds of
issues. lot's of functions have disappeared between versions, for
instance #default_value in the pg connection adapter which breaks
drysql, render_action disappearing (as indicated in past versions of
course) which breaks active scaffold... etc.

Public method changes within a major version are usually bugs. If you find any, please do report or even fix it.

Private methods are considered implementation details and can be changed in any version.