Tue Aug 16 20:06:06 2022 UTC ()
lintpkgsrc: cleanup: condense invalid_version


(rillig)
diff -r1.103 -r1.104 pkgsrc/pkgtools/lintpkgsrc/files/lintpkgsrc.pl

cvs diff -r1.103 -r1.104 pkgsrc/pkgtools/lintpkgsrc/files/lintpkgsrc.pl (expand / switch to unified diff)

--- pkgsrc/pkgtools/lintpkgsrc/files/lintpkgsrc.pl 2022/08/16 19:40:24 1.103
+++ pkgsrc/pkgtools/lintpkgsrc/files/lintpkgsrc.pl 2022/08/16 20:06:05 1.104
@@ -1,15 +1,15 @@ @@ -1,15 +1,15 @@
1#!@PERL5@ 1#!@PERL5@
2# $NetBSD: lintpkgsrc.pl,v 1.103 2022/08/16 19:40:24 rillig Exp $ 2# $NetBSD: lintpkgsrc.pl,v 1.104 2022/08/16 20:06:05 rillig Exp $
3 3
4# Written by David Brownlee <abs@netbsd.org>. 4# Written by David Brownlee <abs@netbsd.org>.
5# 5#
6# Caveats: 6# Caveats:
7# The 'Makefile parsing' algorithm used to obtain package versions and 7# The 'Makefile parsing' algorithm used to obtain package versions and
8# DEPENDS information is geared towards speed rather than perfection, 8# DEPENDS information is geared towards speed rather than perfection,
9# though it has gotten somewhat better over time, it only parses the 9# though it has gotten somewhat better over time, it only parses the
10# simpler Makefile conditionals. 10# simpler Makefile conditionals.
11# 11#
12# TODO: Handle fun DEPENDS like avifile-devel with 12# TODO: Handle fun DEPENDS like avifile-devel with
13# {qt2-designer>=2.2.4,qt2-designer-kde>=2.3.1nb1} 13# {qt2-designer>=2.2.4,qt2-designer-kde>=2.3.1nb1}
14 14
15use v5.36; 15use v5.36;
@@ -697,50 +697,43 @@ sub get_default_makefile_vars() { @@ -697,50 +697,43 @@ sub get_default_makefile_vars() {
697 $mkvars = parse_makefile_vars( 697 $mkvars = parse_makefile_vars(
698 "$default_vars->{PKGSRCDIR}/mk/bsd.pkg.mk", 698 "$default_vars->{PKGSRCDIR}/mk/bsd.pkg.mk",
699 "$default_vars->{PKGSRCDIR}/mk/scripts" 699 "$default_vars->{PKGSRCDIR}/mk/scripts"
700 ); 700 );
701 foreach my $varname (keys %{$mkvars}) { 701 foreach my $varname (keys %{$mkvars}) {
702 if ($varname =~ /_REQD$/ || $varname eq 'EXTRACT_SUFX') { 702 if ($varname =~ /_REQD$/ || $varname eq 'EXTRACT_SUFX') {
703 $default_vars->{$varname} = $mkvars->{$varname}; 703 $default_vars->{$varname} = $mkvars->{$varname};
704 } 704 }
705 } 705 }
706 706
707 $default_vars->{PACKAGES} ||= $default_vars->{PKGSRCDIR} . '/packages'; 707 $default_vars->{PACKAGES} ||= $default_vars->{PKGSRCDIR} . '/packages';
708} 708}
709 709
710# Determine if a package version is current. If not, report correct version 710# Determine if a package version is current. If not, report the correct
711# if found 711# version if found.
712# 
713sub invalid_version($pkgmatch) { 712sub invalid_version($pkgmatch) {
714 my ($fail, $ok); 
715 713
716 my @pkgmatches = expand_braces($pkgmatch); 714 my @warnings;
717 foreach $pkgmatch (@pkgmatches) { 715 foreach $pkgmatch (expand_braces($pkgmatch)) {
718 my ($pkg, $badver) = package_globmatch($pkgmatch); 716 my ($pkg, $badver) = package_globmatch($pkgmatch);
 717 # If we find one match, it's good enough.
 718 return () unless defined $badver;
719 719
720 if (defined $badver) { 720 my $pkgs = $pkgdb->pkgs($pkg);
721 if (my $pkgs = $pkgdb->pkgs($pkg)) { 721 push @warnings, $pkgs
722 $fail .= 722 ? "Version mismatch: '$pkg' $badver vs "
723 "Version mismatch: '$pkg' $badver vs " 723 . join(',', $pkgs->versions)
724 . join(',', $pkgs->versions) . "\n"; 724 : "Unknown package: '$pkg' version $badver";
725 } else { 
726 $fail .= "Unknown package: '$pkg' version $badver\n"; 
727 } 
728 } else { 
729 # If we find one match, don't bitch about others 
730 $ok = 1; 
731 } 
732 } 725 }
733 $ok ? undef : $fail; 726 @warnings;
734} 727}
735 728
736sub list_installed_packages() { 729sub list_installed_packages() {
737 open(PKG_INFO, "$conf_pkg_info -e '*' |") 730 open(PKG_INFO, "$conf_pkg_info -e '*' |")
738 or fail("Unable to run $conf_pkg_info: $!"); 731 or fail("Unable to run $conf_pkg_info: $!");
739 chomp(my @pkgs = <PKG_INFO>); 732 chomp(my @pkgs = <PKG_INFO>);
740 close(PKG_INFO); 733 close(PKG_INFO);
741 map { $_ = canonicalize_pkgname($_) } @pkgs; 734 map { $_ = canonicalize_pkgname($_) } @pkgs;
742} 735}
743 736
744# List top level pkgsrc categories 737# List top level pkgsrc categories
745# 738#
746sub list_pkgsrc_categories($pkgsrcdir) { 739sub list_pkgsrc_categories($pkgsrcdir) {
@@ -1064,34 +1057,33 @@ sub scan_pkgsrc_makefiles($pkgsrcdir) { @@ -1064,34 +1057,33 @@ sub scan_pkgsrc_makefiles($pkgsrcdir) {
1064 1057
1065# Cross reference all depends 1058# Cross reference all depends
1066# 1059#
1067sub pkgsrc_check_depends() { 1060sub pkgsrc_check_depends() {
1068 foreach my $pkgver ($pkgdb->pkgvers_all) { 1061 foreach my $pkgver ($pkgdb->pkgvers_all) {
1069 my $depends = $pkgver->var('DEPENDS'); 1062 my $depends = $pkgver->var('DEPENDS');
1070 next unless defined $depends; 1063 next unless defined $depends;
1071 1064
1072 my $seen_header = 0; 1065 my $seen_header = 0;
1073 foreach my $depend (split(' ', $depends)) { 1066 foreach my $depend (split(' ', $depends)) {
1074 next unless $depend =~ s/:.*//; 1067 next unless $depend =~ s/:.*//;
1075 1068
1076 $depend = canonicalize_pkgname($depend); 1069 $depend = canonicalize_pkgname($depend);
1077 if ((my $msg = invalid_version($depend))) { 1070 next unless my @msgs = invalid_version($depend);
1078 if ($seen_header == 0) { 1071
1079 print $pkgver->pkgname . " DEPENDS errors:\n"; 1072 if ($seen_header == 0) {
1080 $seen_header = 1; 1073 print $pkgver->pkgname . " DEPENDS errors:\n";
1081 } 1074 $seen_header = 1;
1082 $msg =~ s/(\n)(.)/$1\t$2/g; 
1083 print "\t$msg"; 
1084 } 1075 }
 1076 print map { "\t$_\n" } @msgs;
1085 } 1077 }
1086 } 1078 }
1087} 1079}
1088 1080
1089sub load_distinfo($dir) { 1081sub load_distinfo($dir) {
1090 my $fname = "$dir/distinfo"; 1082 my $fname = "$dir/distinfo";
1091 open(my $f, '<', $fname) or return; 1083 open(my $f, '<', $fname) or return;
1092 chomp(my @lines = <$f>); 1084 chomp(my @lines = <$f>);
1093 close($f) or die; 1085 close($f) or die;
1094 1086
1095 my @entries; 1087 my @entries;
1096 foreach my $line (@lines) { 1088 foreach my $line (@lines) {
1097 next if $line eq '' || $line =~ m#^\$NetBSD#; 1089 next if $line eq '' || $line =~ m#^\$NetBSD#;
@@ -1535,29 +1527,29 @@ sub generate_map_file($pkgsrcdir, $fname @@ -1535,29 +1527,29 @@ sub generate_map_file($pkgsrcdir, $fname
1535 $pkgver->pkgversion; 1527 $pkgver->pkgversion;
1536 } 1528 }
1537 close(TABLE) or fail("close('$tmpfile'): $!"); 1529 close(TABLE) or fail("close('$tmpfile'): $!");
1538 rename($tmpfile, $fname) 1530 rename($tmpfile, $fname)
1539 or fail("rename('$tmpfile', '$fname'): $!"); 1531 or fail("rename('$tmpfile', '$fname'): $!");
1540} 1532}
1541 1533
1542sub check_outdated_installed_packages($pkgsrcdir) { 1534sub check_outdated_installed_packages($pkgsrcdir) {
1543 my @pkgs = list_installed_packages(); 1535 my @pkgs = list_installed_packages();
1544 scan_pkgsrc_makefiles($pkgsrcdir); 1536 scan_pkgsrc_makefiles($pkgsrcdir);
1545 1537
1546 my @update; 1538 my @update;
1547 foreach my $pkgname (sort @pkgs) { 1539 foreach my $pkgname (sort @pkgs) {
1548 next unless $_ = invalid_version($pkgname); 1540 next unless my @warnings = invalid_version($pkgname);
1549 1541
1550 print $_; 1542 print map { "$_\n" } @warnings;
1551 next unless $pkgname =~ /^([^*?[]+)-([\d*?[].*)/; 1543 next unless $pkgname =~ /^([^*?[]+)-([\d*?[].*)/;
1552 1544
1553 foreach my $pkgver ($pkgdb->pkgvers_by_pkgbase($1)) { 1545 foreach my $pkgver ($pkgdb->pkgvers_by_pkgbase($1)) {
1554 next if $pkgver->var('dir') =~ /-current/; 1546 next if $pkgver->var('dir') =~ /-current/;
1555 push @update, $pkgver; 1547 push @update, $pkgver;
1556 last; 1548 last;
1557 } 1549 }
1558 } 1550 }
1559 1551
1560 return unless $opt{u}; 1552 return unless $opt{u};
1561 1553
1562 print "\nREQUIRED details for packages that could be updated:\n"; 1554 print "\nREQUIRED details for packages that could be updated:\n";
1563 1555