File Coverage

blib/lib/CPAN/Version.pm
Criterion Covered Total %
statement 56 66 84.8
branch 22 36 61.1
condition 15 19 78.9
subroutine 9 10 90.0
pod 0 8 0.0
total 102 139 73.3


line stmt bran cond sub pod time code
1             package CPAN::Version;
2              
3 14     14   595 use strict;
  14         33  
  14         462  
4 14     14   69 use vars qw($VERSION);
  14         25  
  14         15399  
5             $VERSION = "5.5003";
6              
7             # CPAN::Version::vcmp courtesy Jost Krieger
8             sub vcmp {
9 145     145 0 3748 my($self,$l,$r) = @_;
10 145         332 local($^W) = 0;
11 145 50       266 CPAN->debug("l[$l] r[$r]") if $CPAN::DEBUG;
12              
13             # treat undef as zero
14 145 100       246 $l = 0 if $l eq 'undef';
15 145 100       278 $r = 0 if $r eq 'undef';
16              
17 145 100       261 return 0 if $l eq $r; # short circuit for quicker success
18              
19 139         239 for ($l,$r) {
20 278         466 s/_//g;
21             }
22 139 50       218 CPAN->debug("l[$l] r[$r]") if $CPAN::DEBUG;
23 139         207 for ($l,$r) {
24 278 100 100     912 next unless tr/.// > 1 || /^v/;
25 106         314 s/^v?/v/;
26 106         386 1 while s/\.0+(\d)/.$1/; # remove leading zeroes per group
27             }
28 139 50       257 CPAN->debug("l[$l] r[$r]") if $CPAN::DEBUG;
29 139 100       386 if ($l=~/^v/ <=> $r=~/^v/) {
30 76         122 for ($l,$r) {
31 152 100       291 next if /^v/;
32 76         132 $_ = $self->float2vv($_);
33             }
34             }
35 139 50       224 CPAN->debug("l[$l] r[$r]") if $CPAN::DEBUG;
36 139         214 my $lvstring = "v0";
37 139         169 my $rvstring = "v0";
38 139 100 66     619 if ($] >= 5.006
      66        
39             && $l =~ /^v/
40             && $r =~ /^v/) {
41 91         173 $lvstring = $self->vstring($l);
42 91         164 $rvstring = $self->vstring($r);
43 91 50       195 CPAN->debug(sprintf "lv[%vd] rv[%vd]", $lvstring, $rvstring) if $CPAN::DEBUG;
44             }
45              
46             return (
47 139   100     950 ($l ne "undef") <=> ($r ne "undef")
48             ||
49             $lvstring cmp $rvstring
50             ||
51             $l <=> $r
52             ||
53             $l cmp $r
54             );
55             }
56              
57             sub vgt {
58 61     61 0 1742 my($self,$l,$r) = @_;
59 61         105 $self->vcmp($l,$r) > 0;
60             }
61              
62             sub vlt {
63 22     22 0 70 my($self,$l,$r) = @_;
64 22         37 $self->vcmp($l,$r) < 0;
65             }
66              
67             sub vge {
68 2     2 0 11 my($self,$l,$r) = @_;
69 2         10 $self->vcmp($l,$r) >= 0;
70             }
71              
72             sub vle {
73 0     0 0 0 my($self,$l,$r) = @_;
74 0         0 $self->vcmp($l,$r) <= 0;
75             }
76              
77             sub vstring {
78 182     182 0 280 my($self,$n) = @_;
79 182 50       510 $n =~ s/^v// or die "CPAN::Version::vstring() called with invalid arg [$n]";
80 182         688 pack "U*", split /\./, $n;
81             }
82              
83             # vv => visible vstring
84             sub float2vv {
85 76     76 0 130 my($self,$n) = @_;
86 76         187 my($rev) = int($n);
87 76   100     165 $rev ||= 0;
88 76         257 my($mantissa) = $n =~ /\.(\d{1,12})/; # limit to 12 digits to limit
89             # architecture influence
90 76   100     156 $mantissa ||= 0;
91 76         192 $mantissa .= "0" while length($mantissa)%3;
92 76         130 my $ret = "v" . $rev;
93 76         121 while ($mantissa) {
94 120 50       373 $mantissa =~ s/(\d{1,3})// or
95             die "Panic: length>0 but not a digit? mantissa[$mantissa]";
96 120         342 $ret .= ".".int($1);
97             }
98             # warn "n[$n]ret[$ret]";
99 76         163 $ret =~ s/(\.0)+/.0/; # v1.0.0 => v1.0
100 76         180 $ret;
101             }
102              
103             sub readable {
104 1     1 0 5 my($self,$n) = @_;
105 1         4 $n =~ /^([\w\-\+\.]+)/;
106              
107 1 50 33     8 return $1 if defined $1 && length($1)>0;
108             # if the first user reaches version v43, he will be treated as "+".
109             # We'll have to decide about a new rule here then, depending on what
110             # will be the prevailing versioning behavior then.
111              
112 0 0         if ($] < 5.006) { # or whenever v-strings were introduced
113             # we get them wrong anyway, whatever we do, because 5.005 will
114             # have already interpreted 0.2.4 to be "0.24". So even if he
115             # indexer sends us something like "v0.2.4" we compare wrongly.
116              
117             # And if they say v1.2, then the old perl takes it as "v12"
118              
119 0 0         if (defined $CPAN::Frontend) {
120 0           $CPAN::Frontend->mywarn("Suspicious version string seen [$n]\n");
121             } else {
122 0           warn("Suspicious version string seen [$n]\n");
123             }
124 0           return $n;
125             }
126 0           my $better = sprintf "v%vd", $n;
127 0 0         CPAN->debug("n[$n] better[$better]") if $CPAN::DEBUG;
128 0           return $better;
129             }
130              
131             1;
132              
133             __END__