>>>>> On Tue, 22 May 2007 01:26:54 +0000, Julian Mehnle <[EMAIL PROTECTED]>
>>>>> said:
> Andreas J. Koenig wrote:
>> Julian Mehnle <[EMAIL PROTECTED]> said:
>> > For anyone who has similar problems in the future and who reads this
>> > thread, I'd like to explain the cause of the problem explicitly (as
>> > I didn't understand it myself due to the various statements in this
>> > thread being too implicit).
>> >
>> > The problem I had is that my META.yml (generated by M::B 0.26)
>> > had version numbers of the form "2.004000", which is numerically
>> > correct, but in the new version.pm regime sorts between v2.3999 and
>> > v2.4001, as opposed to between v2.3.0 and v2.4.1 (as it was
>> > intended by me).
>>
>> You seem to mean "v2.004000", not "2.004000". The latter is a floating
>> point number, the former a v-string.
> I know. But I actually did have "2.004000", not "v2.004000", in META.yml
> as generated by M::B 0.26.
But what you are saying is that "2.004000" sorts between v2.3999 and
v2.4001, right? Can you please show us the code that backs this claim?
>> > Whereas old versions of CPAN.pm (<1.8x) perform a numerical
>> > comparison only, matching 2.004000 = 2.004,
>>
>> Sorry, no, this was never the case. CPAN.pm always did a mixed
>> string/numeric compare. Specifically "2.004000" was always sorted
>> after "2.004" and still is. Both look like floating point numbers so
>> they are treated as such. Because they are numerically equal, they are
>> compared as strings again with the effect that the longer is sorted
>> after the shorter.
> I see. Is this documented anywhere?
Not much more than t/10version.t in the CPAN.pm distro. Before
version.pm entered the game there was not much interest in this part
of CPAN.pm.
> What's the rationale for treating 1.0 differently from 1.00? I mean, we're
> talking about version numbers, not dictionaries.
The rationale is that if two version strings are written differently,
then there must apparently be a version difference that shall be
visible and not be swept under the carpet.
> Anyways, considering what you're saying, why does CPAN.pm 1.7602 treat
> 2.004000 (from META.yml on CPAN) as being _equal_or_lower_ than the
> installed qv('2.004')? (Remember, `r` in older CPANs doesn't complain
> about an out-of-date Mail::SPF, whereas in newer CPANs it does!)
I'm not sure it does. I tried current bleadperl with 1.7601 and it did
not bahave as you claim:
% /home/src/perl/repoperls/installed-perls/perl/pgkFpUm/[EMAIL
PROTECTED]/bin/perl -Ilib -MCPAN -eshell
cpan shell -- CPAN exploration and modules installation (v1.7601)
ReadLine support enabled
cpan> r Mail::SPF
CPAN: Storable loaded ok
Going to read /home/k/.cpan/Metadata
Database was generated on Tue, 22 May 2007 05:55:21 GMT
Package namespace installed latest in CPAN file
Mail::SPF v2.004 2.004000
J/JM/JMEHNLE/mail-spf/Mail-SPF-2.004.tar.gz
Also, when I use CPAN::Version directly, it tells me that they are not
equal:
% /home/src/perl/repoperls/installed-perls/perl/pgkFpUm/[EMAIL
PROTECTED]/bin/perl -Ilib -MCPAN -le '
use CPAN;
print $CPAN::VERSION;
print CPAN::Version->vcmp("v2.004","2.004000");
'
1.7601
-1
So I went on a time travel using old perls I have lying around from
smoke testing.
Then I took my [EMAIL PROTECTED] which had 1.7602 and with that
perl Module::Build trips over itself and cannot be installed at all.
Then I tried [EMAIL PROTECTED] which also had 1.7602 and I installed
current Module::Build for it then tried Mail::SPF and failed miserably
with lots of failing tests.
So I called the vcmp method directly and it does not confirm what you
claim either:
% /home/src/perl/repoperls/installed-perls/perl/pWNflGz/[EMAIL
PROTECTED]/bin/perl -le '
use CPAN;
print $CPAN::VERSION;
print CPAN::Version->vcmp("v2.004","2.004000");
'
1.7602
-1
>> > newer versions of CPAN.pm apply version.pm logic and compare as
>> > 2.004000 = v2.4000 >> v2.4 = 2.004, thus always reporting the
>> > version of the package on CPAN (whose META.yml is being read) as
>> > newer than what's locally installed.
>>
>> No, CPAN.pm and version.pm were never behaving identically. There have
>> always been edge cases, specifically in the treatment of trailing
>> zeroes, underline, other non-numeric characters.
> Great! Pardon me for saying that, but what a mess!
It's not that you have not been warned;)
> (Not necessarily
> yours, though.) "Design by committee" would probably still have been
> better than "interoperability by coincidence".
Yes, please turn on your time machine and rip the whole v-string mess
out of perl. Now. Pretty Please.
>> The above equation does not represent CPAN.pm behaviour. 2.004000 is very
>> far away from v2.4000. Every float below 3 is treated smaller than
>> v2.1000 because the maximum a floating point number below 3 can reach,
>> when converted to a v-string, is 2.999.999.999....
> Are you saying that, from CPAN's PoV, v2.1000 > 3? You can't be serious!
Please read my sentence again. Note that there is the word "below"
somewhere. Twice.
> At least version.pm doesn't agree (thankfully):
> $ perl -Mversion -le 'print(qv("v2.1000") > 3 ? "yes" : "no")'
> no
>> > The solution is to upgrade M::B to at least 0.2802 (better
>> > 0.2805) so META.yml gets generated with correctly formatted version
>> > numbers (no erroneous trailing zeros) to fit the version.pm
>> > numbering regime.
>>
>> Upgrading is always a good idea but I hope you do not insist that all
>> your users must upgrade everything because not all of them will be in
>> a position to do so immediately. Perl has a very good tradition of
>> being tolerant it what it expects and conservative in what it emits.
> I should have been slightly more explicit. Since, as I tried to explain,
> the root cause of my problem was the badly formatted version numbers in my
> package's META.yml as distributed on CPAN, it is of course only the
> _developer's_ installation of Module::Build that has to be upgraded such
> that future uploads of the package will contain a properly formatted
> META.yml.
Thanks for the clarification.
--
andreas