74 lines
1.6 KiB
Perl
74 lines
1.6 KiB
Perl
package CPAN::Audit::Version;
|
|
use strict;
|
|
use warnings;
|
|
use version;
|
|
|
|
sub new {
|
|
my $class = shift;
|
|
|
|
my $self = {};
|
|
bless $self, $class;
|
|
|
|
return $self;
|
|
}
|
|
|
|
sub in_range {
|
|
my $self = shift;
|
|
my ( $version, $range ) = @_;
|
|
|
|
return unless defined $version && defined $range;
|
|
|
|
my @ands = split /\s*,\s*/, $range;
|
|
|
|
return unless defined( $version = eval { version->parse($version) } );
|
|
|
|
foreach my $and (@ands) {
|
|
my ( $op, $range_version ) = $and =~ m/^(<=|<|>=|>|==|!=)?\s*([^\s]+)$/;
|
|
|
|
return
|
|
unless defined( $range_version = eval { version->parse($range_version) } );
|
|
|
|
$op = '>=' unless defined $op;
|
|
|
|
if ( $op eq '<' ) {
|
|
return unless $version < $range_version;
|
|
}
|
|
elsif ( $op eq '<=' ) {
|
|
return unless $version <= $range_version;
|
|
}
|
|
elsif ( $op eq '>' ) {
|
|
return unless $version > $range_version;
|
|
}
|
|
elsif ( $op eq '>=' ) {
|
|
return unless $version >= $range_version;
|
|
}
|
|
elsif ( $op eq '==' ) {
|
|
return unless $version == $range_version;
|
|
}
|
|
elsif ( $op eq '!=' ) {
|
|
return unless $version != $range_version;
|
|
}
|
|
else {
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
sub affected_versions {
|
|
my $self = shift;
|
|
my ( $available_versions, $range ) = @_;
|
|
|
|
my @affected_versions;
|
|
foreach my $version (@$available_versions) {
|
|
if ( $self->in_range( $version, $range ) ) {
|
|
push @affected_versions, $version;
|
|
}
|
|
}
|
|
|
|
return @affected_versions;
|
|
}
|
|
|
|
1;
|