Ben Tilly wrote:

> Charles Hixson <charleshixsn / earthlink.net> wrote:
> 
>> 
>> Yukihiro Matsumoto wrote:
>> 
>>> Hi,
>>> ...
>>> 
>>> |* Ruby-enforced (or at least supported) way to versioning of
>>> |  scripts/extensions. Can be used both from Ruby code ("require
>>> |  'BitVector' {VERSION >= 1.6}") and from RAA-installer ("raa-get
>>> |  Bitvector 1.6.1"). Different versions can co-exist on my Ruby set-up.
>>> 
>>> I like the basic idea.  But I still don't have concrete strategy to
>>> make it possible.
>>> ...
>>>                             matz.
>> 
>> 
... 
> They are widely enough used that version tuples make sense:
> 
>  major.minor.rev
I agree with the major.minor.rev
  version number, but that looks like a string to me 
more than like a number.

> 
> Any major rethinking of structure results in incrementing
> major, and two versions of the same libary that have a
> different major version are not expected to be compatible.
> New features can be added in a minor version, but would
> generally be assumed upwards (though not downwards)
> compatible.  Revs are bug-fixes, pure and simple.

OK.  So I guess that this says that the require'd 
file shouldn't depend on which revision number is 
used.  If this is a save assumption (which I find 
questionable, but possible) then a simple integer 
could be used for the version (= major.minor * 100). 
  But I'm not sure that this really simplifies 
things.  And it makes it more difficult to separate 
version numbers by differences between their file 
names (which I was considering).

> 
> The lookup system should not worry about having things
> that use different revs.  It should allow you to specify
> minimum version (with the rev possibly significant).
> A maximum version (major.minor only) could also be
> though it shouldn't be assumed to work.  In general it
> would be unwise to assume compatibility on a major version
> unless the software specifically said otherwise.  It
> should by default use the version that does not have a
> version name in it, and failing that use the highest
> compatible version
The problem here is if one needs to disallow certain 
specific versions.  This is a hopefully rare 
occurance, but I have experienced it in the past 
(usually with compilers, but I don't know that 
libraries would be an exception).

> 
> Any script that wound up loading things that want to use
> multiple versions of the same library should be registered
> as having an internal conflict.
The problem is not with wanting to use multiple 
versions of the same library, as with specifically 
NOT wanting to use some particular version (perhaps 
it just happens to break some small feature that you 
depend on, and this was working in both the prior 
and the succeeding versions).

> 
>> One thing that this would require is a method for keeping several
>> different versions of the same code around, probably by requiring
>> something like the filename to be embedded in the second line of the
>> file (not the first line, as that would interfere with the #!/usr/...
>> convention).
> 
> How would I keep two versions of a library in parallel?
> 
> Yes, let the code say its version.  But also let the lookup
> for a library search with the version in its name.  Now add
> in a standard naming scheme (Debian does this).
> 
> In my proposal it would be sufficient to have major.minor
> in the names.  Loading specific versions like this would
> involve searching the directory, and might be slow.  (Which
> is why in my proposal I went for the default version first.)
I can accept the major.minor (though I do think that 
minor bugs might only show up in one revision).  I 
don't see that searching the directory this way 
would be any slower than searching the directory 
anyway.  And usually one probably wouldn't specify 
the version (which would mean take the highest 
version available).

On second reading it seems like you might be talking 
about C modules.  (Though I'm having enough trouble 
trying to load the gtk module that I may just 
misunderstand the whole process.)  I have been 
assuming that the search process involved searching 
through PATH, not that it involved an internal 
table.  But if the internal table were Ruby code, 
then I can see a possible problem My first thought 
was that the reasonable approach would seem to be an 
avl tree as a hash wouldn't search in any reasonable 
order, but on second thought a hash on the name that 
lead to a list sorted by version key (highest first) 
would seem to solve the problem in short order.

> ...
> Cheers,
> Ben
> _________________________________________________________________
> Get your FREE download of MSN Explorer at http://explorer.msn.com