X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCPAN%2FVersion.pm;h=d2791349be94dacb46ab4d5887efa9237bfebaaa;hb=917f17002097ee577163787c18abe1a911b23f4e;hp=68a4fec690e296c2868cc69adf12e414e80964eb;hpb=f3fe0ae60051c4c73dd9f21d0864f94a81c10245;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/CPAN/Version.pm b/lib/CPAN/Version.pm index 68a4fec..d279134 100644 --- a/lib/CPAN/Version.pm +++ b/lib/CPAN/Version.pm @@ -1,35 +1,9 @@ -=head1 NAME - -CPAN::Version - utility functions to compare CPAN versions - -=head1 SYNOPSIS - - use CPAN::Version; - - CPAN::Version->vgt("1.1","1.1.1"); # 1 - - CPAN::Version->vcmp("1.1","1.1.1"); # 1 - - CPAN::Version->readable(v1.2.3); # "v1.2.3" - - CPAN::Version->vstring("v1.2.3"); # v1.2.3 - - CPAN::Version->float2vv(1.002003); # "v1.2.3" - -=head1 DESCRIPTION - -This module mediates between some version that perl sees in a package -and the version that is published by the CPAN indexer. - -It's only written as a helper module for both CPAN.pm and CPANPLUS.pm. - -As it stands it predates version.pm but has the same goal: make -version strings visible and comparable. - -=cut - package CPAN::Version; +use strict; +use vars qw($VERSION); +$VERSION = sprintf "%.6f", substr(q$Rev: 1387 $,4)/1000000 + 5.4; + # CPAN::Version::vcmp courtesy Jost Krieger sub vcmp { my($self,$l,$r) = @_; @@ -39,26 +13,39 @@ sub vcmp { return 0 if $l eq $r; # short circuit for quicker success for ($l,$r) { + s/_//g; + } + CPAN->debug("l[$l] r[$r]") if $CPAN::DEBUG; + for ($l,$r) { next unless tr/.// > 1; s/^v?/v/; - 1 while s/\.0+(\d)/.$1/; + 1 while s/\.0+(\d)/.$1/; # remove leading zeroes per group } + CPAN->debug("l[$l] r[$r]") if $CPAN::DEBUG; if ($l=~/^v/ <=> $r=~/^v/) { for ($l,$r) { next if /^v/; $_ = $self->float2vv($_); } } + CPAN->debug("l[$l] r[$r]") if $CPAN::DEBUG; + my $lvstring = "v0"; + my $rvstring = "v0"; + if ($] >= 5.006 + && $l =~ /^v/ + && $r =~ /^v/) { + $lvstring = $self->vstring($l); + $rvstring = $self->vstring($r); + CPAN->debug(sprintf "lv[%vd] rv[%vd]", $lvstring, $rvstring) if $CPAN::DEBUG; + } return ( - ($l ne "undef") <=> ($r ne "undef") || - ( - $] >= 5.006 && - $l =~ /^v/ && - $r =~ /^v/ && - $self->vstring($l) cmp $self->vstring($r) - ) || - $l <=> $r || + ($l ne "undef") <=> ($r ne "undef") + || + $lvstring cmp $rvstring + || + $l <=> $r + || $l cmp $r ); } @@ -68,6 +55,11 @@ sub vgt { $self->vcmp($l,$r) > 0; } +sub vlt { + my($self,$l,$r) = @_; + 0 + ($self->vcmp($l,$r) < 0); +} + sub vstring { my($self,$n) = @_; $n =~ s/^v// or die "CPAN::Version::vstring() called with invalid arg [$n]"; @@ -109,7 +101,11 @@ sub readable { # And if they say v1.2, then the old perl takes it as "v12" - $CPAN::Frontend->mywarn("Suspicious version string seen [$n]\n"); + if (defined $CPAN::Frontend) { + $CPAN::Frontend->mywarn("Suspicious version string seen [$n]\n"); + } else { + warn("Suspicious version string seen [$n]\n"); + } return $n; } my $better = sprintf "v%vd", $n; @@ -121,6 +117,45 @@ sub readable { __END__ +=head1 NAME + +CPAN::Version - utility functions to compare CPAN versions + +=head1 SYNOPSIS + + use CPAN::Version; + + CPAN::Version->vgt("1.1","1.1.1"); # 1 bc. 1.1 > 1.001001 + + CPAN::Version->vlt("1.1","1.1"); # 0 bc. 1.1 not < 1.1 + + CPAN::Version->vcmp("1.1","1.1.1"); # 1 bc. first is larger + + CPAN::Version->vcmp("1.1.1","1.1"); # -1 bc. first is smaller + + CPAN::Version->readable(v1.2.3); # "v1.2.3" + + CPAN::Version->vstring("v1.2.3"); # v1.2.3 + + CPAN::Version->float2vv(1.002003); # "v1.2.3" + +=head1 DESCRIPTION + +This module mediates between some version that perl sees in a package +and the version that is published by the CPAN indexer. + +It's only written as a helper module for both CPAN.pm and CPANPLUS.pm. + +As it stands it predates version.pm but has the same goal: make +version strings visible and comparable. + +=head1 LICENSE + +This program is free software; you can redistribute it and/or +modify it under the same terms as Perl itself. + +=cut + # Local Variables: # mode: cperl # cperl-indent-level: 2