summaryrefslogtreecommitdiff
path: root/pkgtools
diff options
context:
space:
mode:
authorrillig <rillig@pkgsrc.org>2022-08-03 20:32:55 +0000
committerrillig <rillig@pkgsrc.org>2022-08-03 20:32:55 +0000
commitc4d3e1600f64f694af7265c589b729792fcd8e8e (patch)
tree9dce01ba105972b952d272e21ea10cf996840f63 /pkgtools
parent51c24d968a9be399c9cda2ab0ad47b3ad322ffe9 (diff)
downloadpkgsrc-c4d3e1600f64f694af7265c589b729792fcd8e8e.tar.gz
lintpkgsrc: clean up and condense comparison of package versions
One less 'eval' to worry about.
Diffstat (limited to 'pkgtools')
-rwxr-xr-xpkgtools/lintpkgsrc/files/lintpkgsrc.pl62
-rw-r--r--pkgtools/lintpkgsrc/files/t/pkgversion.t5
2 files changed, 24 insertions, 43 deletions
diff --git a/pkgtools/lintpkgsrc/files/lintpkgsrc.pl b/pkgtools/lintpkgsrc/files/lintpkgsrc.pl
index 822ab6338f5..cd7deaa6918 100755
--- a/pkgtools/lintpkgsrc/files/lintpkgsrc.pl
+++ b/pkgtools/lintpkgsrc/files/lintpkgsrc.pl
@@ -1,6 +1,6 @@
#!@PERL5@
-# $NetBSD: lintpkgsrc.pl,v 1.47 2022/08/03 20:14:16 rillig Exp $
+# $NetBSD: lintpkgsrc.pl,v 1.48 2022/08/03 20:32:55 rillig Exp $
# Written by David Brownlee <abs@netbsd.org>.
#
@@ -297,12 +297,13 @@ sub canonicalize_pkgname($) {
return $pkgname;
}
-sub convert_to_standard_pkgversion(@) {
- my ($elem, @temp);
+sub split_pkgversion($) {
+ my ($pkgversion) = @_;
# See pkg_install/lib/dewey.c.
- # 'nb' has already been handled when we are here.
- foreach $elem (@_) {
+ my (@temp);
+ my $nb = ($pkgversion =~ s/^(.*)nb(\d+)$/$1/) ? +$2 : 0;
+ foreach my $elem (split(/(\D+)/, lc($pkgversion))) {
if ($elem =~ /\d/) {
push(@temp, $elem);
} elsif ($elem eq "pl" || $elem eq "." || $elem eq "_") {
@@ -318,50 +319,29 @@ sub convert_to_standard_pkgversion(@) {
push(@temp, ord($elem) - ord("a") + 1);
}
}
+ push(@temp, $nb);
@temp;
}
-sub pkgversioncmp_extract($$) {
- my ($match, $val) = @_;
- my ($cmp, @matchlist, @vallist);
-
- @matchlist = convert_to_standard_pkgversion(split(/(\D+)/, lc($match)));
- @vallist = convert_to_standard_pkgversion(split(/(\D+)/, lc($val)));
- $cmp = 0;
- while ($cmp == 0 && (@matchlist || @vallist)) {
- $cmp = ((shift @matchlist || 0) <=> (shift @vallist || 0));
- }
- $cmp;
-}
-
-# Package version number matching.
-# Also handles 'nb<N>' suffix (checked iff values otherwise identical).
sub pkgversioncmp($$$) {
- my ($match, $test, $val) = @_;
- my ($cmp, $match_nb, $val_nb);
+ my ($va, $op, $vb) = @_;
- $match_nb = $val_nb = 0;
- if ($match =~ /(.*)nb(.*)/) {
- # Handle nb<N> suffix
- $match = $1;
- $match_nb = $2;
+ my @a = split_pkgversion($va);
+ my @b = split_pkgversion($vb);
+ my $cmp = 0;
+ while ($cmp == 0 && (@a || @b)) {
+ $cmp = (shift @a || 0) <=> (shift @b || 0);
}
- if ($val =~ /(.*)nb(.*)/) {
- # Handle nb<N> suffix
- $val = $1;
- $val_nb = $2;
- }
-
- $cmp = pkgversioncmp_extract($match, $val);
-
- if (!$cmp) {
- # Iff otherwise identical, check nb suffix
- $cmp = pkgversioncmp_extract($match_nb, $val_nb);
+ if ($op eq '<') {
+ $cmp < 0;
+ } elsif ($op eq '<=') {
+ $cmp <= 0;
+ } elsif ($op eq '>') {
+ $cmp > 0;
+ } else {
+ $cmp >= 0;
}
-
- debug("eval pkgversioncmp $cmp $test 0\n");
- eval "$cmp $test 0";
}
# Return a copy of $line in which trivial variable expressions are replaced
diff --git a/pkgtools/lintpkgsrc/files/t/pkgversion.t b/pkgtools/lintpkgsrc/files/t/pkgversion.t
index 1f617e8d87c..b2e36180ec2 100644
--- a/pkgtools/lintpkgsrc/files/t/pkgversion.t
+++ b/pkgtools/lintpkgsrc/files/t/pkgversion.t
@@ -1,10 +1,10 @@
-# $NetBSD: pkgversion.t,v 1.4 2022/08/03 18:51:56 rillig Exp $
+# $NetBSD: pkgversion.t,v 1.5 2022/08/03 20:32:55 rillig Exp $
use strict;
use warnings;
use Test;
-BEGIN { plan tests => 5, onfail => sub { die } }
+BEGIN { plan tests => 6, onfail => sub { die } }
require('../lintpkgsrc.pl');
@@ -13,3 +13,4 @@ ok(pkgversioncmp('3.4', '<=', '3.4'), 1);
ok(pkgversioncmp('3.4', '>=', '3.4.0.0.0'), 1);
ok(pkgversioncmp('3.4nb13', '>=', '3.4'), 1);
ok(pkgversioncmp('3.4nb13', '<', '3.4'), '');
+ok(pkgversioncmp('3.4nb13', '>', '3.4nb5'), 1);