X-Git-Url: http://git.vpit.fr/?a=blobdiff_plain;f=lib%2FCPANPLUS%2FDist%2FGentoo%2FVersion.pm;fp=lib%2FCPANPLUS%2FDist%2FGentoo%2FVersion.pm;h=bdfd755ad13a8a64945a66b3084a56600e66ab3a;hb=00e09b5e966914ebedb5c08927cf5a66af177171;hp=0000000000000000000000000000000000000000;hpb=0d54c05d27e53e16bc97eb47d63f11fc85e34f74;p=perl%2Fmodules%2FCPANPLUS-Dist-Gentoo.git diff --git a/lib/CPANPLUS/Dist/Gentoo/Version.pm b/lib/CPANPLUS/Dist/Gentoo/Version.pm new file mode 100644 index 0000000..bdfd755 --- /dev/null +++ b/lib/CPANPLUS/Dist/Gentoo/Version.pm @@ -0,0 +1,83 @@ +package CPANPLUS::Dist::Gentoo::Version; + +use strict; +use warnings; + +use Scalar::Util (); + +use overload ( + '<=>' => \&cmp, + '""' => \&as_string, +); + +our $VERSION = '0.08'; + +my $int_rx = qr/\d+/; +my $dotted_num_rx = qr/$int_rx(?:\.$int_rx)*/; + +our $version_rx = qr/$dotted_num_rx(?:_p$dotted_num_rx)?(?:-r$int_rx)?/; + +sub new { + my $class = shift; + $class = ref($class) || $class; + + my $vstring = shift; + if (defined $vstring) { + $vstring =~ s/^[._]+//g; + $vstring =~ s/[._]+$//g; + if ($vstring =~ /^($dotted_num_rx)(?:_p($dotted_num_rx))?(?:-r($int_rx))?$/) { + return bless { + string => $vstring, + version => [ split /\.+/, $1 ], + patch => [ defined $2 ? (split /\.+/, $2) : () ], + revision => [ defined $3 ? $3 : () ], + }, $class; + } + } + + require Carp; + Carp::croak("Couldn't parse version string '$vstring'"); +} + +my @parts; +BEGIN { + @parts = qw/version patch revision/; + eval "sub $_ { \$_[0]->{$_} }" for @parts; +} + +sub cmp { + my ($v1, $v2, $r) = @_; + + unless (Scalar::Util::blessed($v2) and $v2->isa(__PACKAGE__)) { + $v2 = $v1->new($v2); + } + + ($v1, $v2) = ($v2, $v1) if $r; + + for (@parts) { + my @a = @{ $v1->$_ }; + my @b = @{ $v2->$_ }; + while (@a or @b) { + my $x = shift(@a) || 0; + my $y = shift(@b) || 0; + my $c = $x <=> $y; + return $c if $c; + } + } + + return 0; +} + +sub as_string { + my ($v) = @_; + + my ($version, $patch, $revision) = map $v->$_, @parts; + + $version = join '.', @$version; + $version .= '_p' . join('.', @$patch) if @$patch; + $version .= '-r' . join('.', @$revision) if @$revision; + + $version; +} + +1;