X-Git-Url: http://git.vpit.fr/?p=perl%2Fmodules%2FCPANPLUS-Dist-Gentoo.git;a=blobdiff_plain;f=lib%2FCPANPLUS%2FDist%2FGentoo%2FMaps.pm;h=ea136b063003f4043607d4d96eb67ecac11a5b61;hp=d118edc2361f13cbb1e7cb94f2fc9d2396998830;hb=39dcc4f5ffa5f01ec7854c63fba5c70e7b963fd8;hpb=7e2aca98057c17b7728aa3028a07dacd2fdd0d62 diff --git a/lib/CPANPLUS/Dist/Gentoo/Maps.pm b/lib/CPANPLUS/Dist/Gentoo/Maps.pm index d118edc..ea136b0 100644 --- a/lib/CPANPLUS/Dist/Gentoo/Maps.pm +++ b/lib/CPANPLUS/Dist/Gentoo/Maps.pm @@ -40,6 +40,67 @@ sub name_c2g { return $gentooisms{$name} || $name; } +=head2 C + +Converts a CPAN version to a Gentoo version. + +=cut + +sub version_c2g { + my ($v) = @_; + + $v =~ y/-/_/; + $v =~ y/0-9._//cd; + + $v =~ s/^[._]*//; + $v =~ s/[._]*$//; + $v =~ s/([._])[._]*/$1/g; + + ($v, my $patch, my @rest) = split /_/, $v; + $v .= '_p' . $patch if defined $patch; + $v .= join('.', '', @rest) if @rest; + + return $v; +} + +=head2 C + +Compares two Gentoo versions. + +=cut + +sub version_gcmp { + my ($a, $b) = map { defined() ? $_ : 0 } @_; + + for ($a, $b) { + s/^[._]+//g; + s/[._]+$//g; + if (/^([\d.]*\d)\.*(?:_p\.*(\d[\d.]*))?\.*(?:-r(\d+))?$/) { + $_ = { + v => [ split /\.+/, $1 ], + p => [ split /\.+/, $2 || 0 ], + r => [ $3 || 0 ], + }; + } else { + require Carp; + Carp::croak("Couldn't parse version string '$_'"); + } + } + + for my $k (qw/v p r/) { + my $xa = $a->{$k}; + my $xb = $b->{$k}; + while (@$xa or @$xb) { + my $na = shift(@$xa) || 0; + my $nb = shift(@$xb) || 0; + my $c = $na <=> $nb; + return $c if $c; + } + } + + return 0; +} + =head1 SEE ALSO L.