| @@ -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 | |
15 | use v5.36; | | 15 | use 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 | # | | | |
713 | sub invalid_version($pkgmatch) { | | 712 | sub 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 | |
736 | sub list_installed_packages() { | | 729 | sub 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 | # |
746 | sub list_pkgsrc_categories($pkgsrcdir) { | | 739 | sub 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 | # |
1067 | sub pkgsrc_check_depends() { | | 1060 | sub 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 | |
1089 | sub load_distinfo($dir) { | | 1081 | sub 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 | |
1542 | sub check_outdated_installed_packages($pkgsrcdir) { | | 1534 | sub 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 | |