Skip to content

Commit

Permalink
Support rpm-4.16 version strings in expressions
Browse files Browse the repository at this point in the history
  • Loading branch information
mlschroe committed Oct 8, 2020
1 parent f46830a commit b676cde
Show file tree
Hide file tree
Showing 2 changed files with 27 additions and 8 deletions.
24 changes: 17 additions & 7 deletions Build/Rpm.pm
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,13 @@ use Digest::MD5;

sub expr_boolify {
my ($v) = @_;
return !defined($v) || $v eq '"' || $v =~ /^0*$/s ? 0 : 1;
return !defined($v) || $v eq '"' || $v =~ /^(?:0*$|v)/s ? 0 : 1;
}

sub expr_vcmp {
my ($v1, $v2, $rr) = @_;
my $r = verscmp(substr($v1, 1), substr($v2, 1));
return ($r < 0 ? 1 : $r > 0 ? 4 : 2) & $rr ? 1 : 0;
}

sub expr {
Expand All @@ -55,7 +61,11 @@ sub expr {
} elsif ($expr =~ /^([0-9]+)(.*?)$/) {
$v = $1;
$expr = $2;
} elsif ($expr =~ /^v\"(.*?)\"(.*)$/) {
$v = "v$1"; # version
$expr = $2;
} elsif ($expr =~ /^([a-zA-Z][a-zA-Z_0-9]*)(.*)$/) {
# actually no longer supported with new rpm versions
$v = "\"$1";
$expr = $2;
} elsif ($expr =~ /^(\".*?)\"(.*)$/) {
Expand All @@ -81,32 +91,32 @@ sub expr {
return ($v, $expr) if $lev >= 3;
($v2, $expr) = expr(substr($expr, 2), 3);
return undef unless defined $v2;
$v = (($v =~ /^\"/) ? $v ge $v2 : $v >= $v2) ? 1 : 0;
$v = (($v =~ /^v/) ? expr_vcmp($v, $v2, 6) : ($v =~ /^\"/) ? $v ge $v2 : $v >= $v2) ? 1 : 0;
} elsif ($expr =~ /^>/) {
return ($v, $expr) if $lev >= 3;
($v2, $expr) = expr(substr($expr, 1), 3);
return undef unless defined $v2;
$v = (($v =~ /^\"/) ? $v gt $v2 : $v > $v2) ? 1 : 0;
$v = (($v =~ /^v/) ? expr_vcmp($v, $v2, 4) : ($v =~ /^\"/) ? $v gt $v2 : $v > $v2) ? 1 : 0;
} elsif ($expr =~ /^<=/) {
return ($v, $expr) if $lev >= 3;
($v2, $expr) = expr(substr($expr, 2), 3);
return undef unless defined $v2;
$v = (($v =~ /^\"/) ? $v le $v2 : $v <= $v2) ? 1 : 0;
$v = (($v =~ /^v/) ? expr_vcmp($v, $v2, 3) : ($v =~ /^\"/) ? $v le $v2 : $v <= $v2) ? 1 : 0;
} elsif ($expr =~ /^</) {
return ($v, $expr) if $lev >= 3;
($v2, $expr) = expr(substr($expr, 1), 3);
return undef unless defined $v2;
$v = (($v =~ /^\"/) ? $v lt $v2 : $v < $v2) ? 1 : 0;
$v = (($v =~ /^v/) ? expr_vcmp($v, $v2, 1) : ($v =~ /^\"/) ? $v lt $v2 : $v < $v2) ? 1 : 0;
} elsif ($expr =~ /^==/) {
return ($v, $expr) if $lev >= 3;
($v2, $expr) = expr(substr($expr, 2), 3);
return undef unless defined $v2;
$v = (($v =~ /^\"/) ? $v eq $v2 : $v == $v2) ? 1 : 0;
$v = (($v =~ /^v/) ? expr_vcmp($v, $v2, 2) : ($v =~ /^\"/) ? $v eq $v2 : $v == $v2) ? 1 : 0;
} elsif ($expr =~ /^!=/) {
return ($v, $expr) if $lev >= 3;
($v2, $expr) = expr(substr($expr, 2), 3);
return undef unless defined $v2;
$v = (($v =~ /^\"/) ? $v ne $v2 : $v != $v2) ? 1 : 0;
$v = (($v =~ /^v/) ? expr_vcmp($v, $v2, 5) : ($v =~ /^\"/) ? $v ne $v2 : $v != $v2) ? 1 : 0;
} elsif ($expr =~ /^\+/) {
return ($v, $expr) if $lev >= 4;
($v2, $expr) = expr(substr($expr, 1), 4);
Expand Down
11 changes: 10 additions & 1 deletion t/expression.t
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#!/usr/bin/perl -w

use strict;
use Test::More tests => 36;
use Test::More tests => 45;

use Build::Rpm;

Expand Down Expand Up @@ -42,6 +42,15 @@ my @tests = (
'7 == 1 + 2 * 3' => '1',
'5 || 2 ? 3 : 4' => '3',
'"foo" + "bar"' => '"foobar',
'v"1.2" > v"1"' => '1',
'v"1.2" < v"1"' => '0',
'v"1.2" > v"1.2"' => '0',
'v"1.2" < v"1.2"' => '0',
'v"1.2" >= v"1.2"' => '1',
'v"1.2" <= v"1.2"' => '1',
'v"1.2" == v"1.2"' => '1',
'v"1.2" != v"1.2"' => '0',
'v"1.2" != v"1"' => '1',
);

while (@tests) {
Expand Down

0 comments on commit b676cde

Please sign in to comment.