Skip to content

Commit d4a27ab

Browse files
committed
Fix regression with small fractional numeric versions (#267)
If a version number is passed in numeric form, C::M::R will use its stringified form for all its processing. This doesn't play well with small fractional versions like 0.000005, which will be stringified as '5e-06', and thus rejected as invalid. EUMM then proceeded misparse the rejected number, so in the above case it became '5' Also added test-case to vstrings.t
1 parent 38a3b15 commit d4a27ab

File tree

2 files changed

+24
-9
lines changed

2 files changed

+24
-9
lines changed

lib/ExtUtils/MakeMaker.pm

Lines changed: 23 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -452,9 +452,14 @@ sub new {
452452
{
453453
bad_version_hook => sub {
454454
#no warnings 'numeric'; # module doesn't use warnings
455-
my ($fallback) = $_[0] ? ($_[0] =~ /^([0-9.]+)/) : 0;
456-
$fallback += 0;
457-
carp "Unparsable version '$_[0]' for prerequisite $_[1] treated as $fallback";
455+
my $fallback;
456+
if ( $_[0] =~ m!^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$! ) {
457+
$fallback = sprintf "%f", $_[0];
458+
} else {
459+
($fallback) = $_[0] ? ($_[0] =~ /^([0-9.]+)/) : 0;
460+
$fallback += 0;
461+
carp "Unparsable version '$_[0]' for prerequisite $_[1] treated as $fallback";
462+
}
458463
version->new($fallback);
459464
},
460465
},
@@ -472,9 +477,13 @@ sub new {
472477
next;
473478
}
474479
else {
475-
my ($fallback) = $_[0] ? ($_[0] =~ /^([0-9.]+)/) : 0;
476-
$fallback += 0;
477-
carp "Unparsable version '$version' for prerequisite $module treated as $fallback (CPAN::Meta::Requirements not available)";
480+
if ( $version =~ m!^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$! ) {
481+
$fallback = sprintf "%f", $version;
482+
} else {
483+
($fallback) = $version ? ($version =~ /^([0-9.]+)/) : 0;
484+
$fallback += 0;
485+
carp "Unparsable version '$version' for prerequisite $module treated as $fallback (CPAN::Meta::Requirements not available)";
486+
}
478487
}
479488
$self->{$key}->{$module} = $fallback;
480489
}
@@ -585,9 +594,14 @@ END
585594
$pr_version = 0 if $pr_version eq 'undef';
586595
if ( !eval { version->new( $pr_version ); 1 } ) {
587596
#no warnings 'numeric'; # module doesn't use warnings
588-
my ($fallback) = $pr_version ? ($pr_version =~ /^([0-9.]+)/) : 0;
589-
$fallback += 0;
590-
carp "Unparsable version '$pr_version' for installed prerequisite $prereq treated as $fallback";
597+
my $fallback;
598+
if ( $pr_version =~ m!^[-+]?[0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?$! ) {
599+
$fallback = sprintf '%f', $pr_version;
600+
} else {
601+
($fallback) = $pr_version ? ($pr_version =~ /^([0-9.]+)/) : 0;
602+
$fallback += 0;
603+
carp "Unparsable version '$pr_version' for installed prerequisite $prereq treated as $fallback";
604+
}
591605
$pr_version = $fallback;
592606
}
593607
}

t/vstrings.t

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ my @DATA = (
4141
[ V2DecimalString => 'v1.2', qr/^$/, '2-part v-decimal string', $UNPARSABLERE ],
4242
[ V3DecimalString => 'v1.2.3', qr/^$/, '3-part v-Decimal String', $UNPARSABLERE ],
4343
[ RangeString => '>= 5.0, <= 6.0', qr/^$/, 'Version range', $UNPARSABLERE ],
44+
[ Scientific => 0.000005, qr/^$/, 'Scientific Notation' ],
4445
);
4546

4647
plan tests => (1 + (@DATA * 4));

0 commit comments

Comments
 (0)