diff --git a/lib/MetaCPAN/Util.pm b/lib/MetaCPAN/Util.pm index 1a8027679..b6fefae85 100644 --- a/lib/MetaCPAN/Util.pm +++ b/lib/MetaCPAN/Util.pm @@ -17,24 +17,28 @@ sub digest { sub numify_version { my $version = shift; - use warnings FATAL => 'numeric'; - eval { $version = version->parse($version)->numify + 0; } or do { - $version = fix_version($version); - $version = eval { version->parse( $version || 0 )->numify + 0 }; - }; + $version = fix_version($version); + $version =~ s/_//g; + if ($version =~ s/^v//i || $version =~ tr/.// > 1) { + my @parts = split /\./, $version; + my $n = shift @parts; + $version = sprintf(join('.', '%s', ('%03s' x @parts)), $n, @parts); + } + $version += 0; return $version; } sub fix_version { my $version = shift; - return undef unless ( defined $version ); - if ( $version =~ /^v/ ) { - eval { $version = eval( version->parse($version)->numify ) }; - return $version + 0 unless ($@); - } - $version =~ s/[^\d\._]//g; - $version =~ s/_/00/g; - return $version; + return 0 unless defined $version; + my $v = ($version =~ s/^v//i); + $version =~ s/[^\d\._].*//; + $version =~ s/\.[._]+/./; + $version =~ s/[._]*_[._]*/_/g; + $version =~ s/\.{2,}/./g; + $v ||= $version =~ tr/.// > 1; + $version ||= 0; + return (($v ? 'v' : '') . $version); } sub author_dir { diff --git a/t/util.t b/t/util.t index 3c712232f..bbc6d041f 100644 --- a/t/util.t +++ b/t/util.t @@ -10,15 +10,15 @@ is( MetaCPAN::Util::numify_version('v2.1.1'), 2.001001 ); is( MetaCPAN::Util::numify_version(undef), 0.000 ); is( MetaCPAN::Util::numify_version('LATEST'), 0.000 ); is( MetaCPAN::Util::numify_version('0.20_8'), 0.208 ); -is( MetaCPAN::Util::numify_version('0.20_88'), 0.200088 ); -is( MetaCPAN::Util::numify_version('0.208_8'), 0.208008 ); -is( MetaCPAN::Util::numify_version('0.20_108'), 0.2000108 ); -is( MetaCPAN::Util::numify_version('v0.9_9'), 0.009009 ); +is( MetaCPAN::Util::numify_version('0.20_88'), 0.2088 ); +is( MetaCPAN::Util::numify_version('0.208_8'), 0.2088 ); +is( MetaCPAN::Util::numify_version('0.20_108'), 0.20108 ); +is( MetaCPAN::Util::numify_version('v0.9_9'), 0.099 ); lives_ok { is( version("2a"), 2 ) }; -lives_ok { is( version("V0.01"), 0.01 ) }; -lives_ok { is( version('0.99_1'), '0.99001' ) }; -lives_ok { is( version('0.99.01'), '0.99.01' ) }; +lives_ok { is( version("V0.01"), 'v0.01' ) }; +lives_ok { is( version('0.99_1'), '0.99_1' ) }; +lives_ok { is( version('0.99.01'), 'v0.99.01' ) }; is( MetaCPAN::Util::strip_pod('hello L foo'), 'hello link foo' );