summaryrefslogtreecommitdiff
path: root/ports-mgmt/portlint/src
diff options
context:
space:
mode:
authorJoe Marcus Clarke <marcus@FreeBSD.org>2003-11-17 20:17:46 +0000
committerJoe Marcus Clarke <marcus@FreeBSD.org>2003-11-17 20:17:46 +0000
commit1f93b36619d5f56a56153328d54b294db333c3df (patch)
tree151231957004048c248f0a01415fd078b46d059a /ports-mgmt/portlint/src
parent- take maintainership (diff)
Update to 2.5.0.
* Add some linenumbers to the whole file search * Hack the direct command use code some more * Add a check for the deprecated USE_MESA * Allow PKGCATEGORY not in CATEGORIES [1] * Allow %B in pkg-plist, as it has a valid prefix [1] * Allow simple rm -f, it needs no redirection [1] * Add portlintgrep.pl, an example on how to use portlint to find certain portlint problems in the ports tree [2] Submitted by: dinoex [1] eik [2]
Notes
Notes: svn path=/head/; revision=94190
Diffstat (limited to 'ports-mgmt/portlint/src')
-rw-r--r--ports-mgmt/portlint/src/portlint.pl120
-rw-r--r--ports-mgmt/portlint/src/portlintgrep.pl53
2 files changed, 129 insertions, 44 deletions
diff --git a/ports-mgmt/portlint/src/portlint.pl b/ports-mgmt/portlint/src/portlint.pl
index e68d26b9c163..671b150cf7b7 100644
--- a/ports-mgmt/portlint/src/portlint.pl
+++ b/ports-mgmt/portlint/src/portlint.pl
@@ -17,7 +17,7 @@
# OpenBSD and NetBSD will be accepted.
#
# $FreeBSD$
-# $Id: portlint.pl,v 1.26 2003/11/15 22:08:28 marcus Exp $
+# $Id: portlint.pl,v 1.27 2003/11/17 20:00:17 marcus Exp $
#
use vars qw/ $opt_a $opt_A $opt_b $opt_c $opt_h $opt_t $opt_v $opt_M $opt_N $opt_B $opt_V /;
@@ -39,8 +39,8 @@ $portdir = '.';
# version variables
my $major = 2;
-my $minor = 4;
-my $micro = 8;
+my $minor = 5;
+my $micro = 0;
sub l { '[{(]'; }
sub r { '[)}]'; }
@@ -171,8 +171,8 @@ my @varlist = qw(
PORTNAME PORTVERSION PORTREVISION PORTEPOCH PKGNAME PKGNAMEPREFIX
PKGNAMESUFFIX DISTNAME DISTFILES CATEGORIES MASTERDIR MAINTAINER
MASTER_SITES WRKDIR WRKSRC NO_WRKSUBDIR PATCHDIR SCRIPTDIR FILESDIR
- PKGDIR COMMENT DESCR PLIST PKGINSTALL PKGDEINSTALL PKGREQ PKGMESSAGE
- MD5_FILE .CURDIR INSTALLS_SHLIB
+ PKGDIR COMMENT DESCR PLIST PKGCATEGORY PKGINSTALL PKGDEINSTALL
+ PKGREQ PKGMESSAGE MD5_FILE .CURDIR INSTALLS_SHLIB
);
my $cmd = join(' -V ', "make $makeenv MASTER_SITE_BACKUP=''", @varlist);
@@ -453,17 +453,19 @@ sub checkplist {
if ($_ =~ /^\@(cwd|cd)[ \t]+(\S+)/) {
$curdir = $2;
} elsif ($_ =~ /^\@unexec[ \t]+rm[ \t]/) {
- if ($_ !~ /%D/) {
- &perror("WARN: pkg-plist:$. use \"%D\" to specify prefix.");
+ if ($_ !~ /%[DB]/) {
+ &perror("WARN: pkg-plist:$. use \"%D\" or \"%B\" to ".
+ "specify prefix.");
}
- if ($_ !~ /true$/) {
- &perror("WARN: pkg-plist:$. add \"2>&1 ".
- ">/dev/null || true\" ".
- "to \"\@unexec rm\".");
+ if ($_ !~ /true$/ && $_ !~ /rm -f/) {
+ &perror("WARN: pkg-plist:$. add \"2>&1 ".
+ ">/dev/null || true\" ".
+ "to \"\@unexec rm\".");
}
} elsif ($_ =~ /^\@unexec[ \t]+rmdir/) {
- if ($_ !~ /%D/) {
- &perror("WARN: pkg-plist:$. use \"%D\" to specify prefix.");
+ if ($_ !~ /%[DB]/) {
+ &perror("WARN: pkg-plist:$. use \"%D\" or \"%B\" to ".
+ "specify prefix.");
}
if ($_ !~ /true$/) {
&perror("WARN: pkg-plist:$. use \"\@dirrm\" ".
@@ -852,9 +854,8 @@ sub checkmakefile {
if ($verbose);
$i = "\n" x ($contblank + 2);
if ($whole =~ /$i/) {
- my @linesbefore = split(/\n/, $`);
&perror("FATAL: contiguous blank lines (> $contblank lines) found ".
- "in $file at line " . ($#linesbefore + 1) . ".");
+ "in $file at line " . (&linenumber($`)) . ".");
}
#
@@ -864,7 +865,7 @@ sub checkmakefile {
print "OK: checking for \$(VARIABLE).\n" if ($verbose);
if ($whole =~ /\$\([\w\d]+\)/) {
&perror("WARN: use \${VARIABLE}, instead of ".
- "\$(VARIABLE).");
+ "\$(VARIABLE) at line " . (&linenumber($`)) . ".");
}
}
@@ -898,7 +899,8 @@ sub checkmakefile {
@other_early);
while ($whole =~ /^($earlypattern)[+?:!]?=/gmo) {
- &perror("FATAL: $1 is set after including bsd.port.pre.mk.");
+ &perror("FATAL: $1 is set at line " . (&linenumber($`)) . " after ".
+ "including bsd.port.pre.mk.");
}
}
@@ -916,7 +918,8 @@ sub checkmakefile {
#
print "OK: checking for USE_* as a user-settable option.\n" if ($verbose);
while ($whole =~ /\n\s*\.\s*(?:el)?if[^\n]*?\b(\w*USE_)(\w+)(?\![^\n]*\n#?\.error)/g) {
- &perror("WARN: is $1$2 a user-settable option? ".
+ my $lineno = &linenumber($`);
+ &perror("WARN: is $1$2 a user-settable option at line $lineno? ".
"Consider using WITH_$2 instead.")
if ($1.$2 ne 'USE_GCC');
}
@@ -924,8 +927,9 @@ sub checkmakefile {
#
# whole file: NO_CHECKSUM
#
- $whole =~ s/\n#[^\n]*/\n/g;
- $whole =~ s/\n\n+/\n/g;
+ # XXX Don't compress newlines since it messes up line number calculation.
+ #$whole =~ s/\n#[^\n]*/\n/g;
+ #$whole =~ s/\n\n+/\n/g;
print "OK: checking NO_CHECKSUM.\n" if ($verbose);
if ($whole =~ /\nNO_CHECKSUM/) {
&perror("FATAL: use of NO_CHECKSUM discouraged. ".
@@ -954,7 +958,8 @@ sub checkmakefile {
}
print "OK: checking for use of NOPORTDOCS.\n" if ($verbose);
if ($whole =~ /NOPORTSDOC/) {
- &perror("WARN: NOPORTSDOC found. Do you mean NOPORTDOCS?");
+ &perror("WARN: NOPORTSDOC found at " . (&linenumber($`)) . ". Do you ".
+ "mean NOPORTDOCS?");
}
if ($sharedocused && $whole !~ /defined\s*\(?NOPORTDOCS\)?/
&& $whole !~ /def\s*\(?NOPORTDOCS\)?/
@@ -981,46 +986,55 @@ ldconfig ln md5 mkdir mv patch perl rm rmdir ruby sed sh touch tr which xargs xm
$cmdnames{'python'} = '${PYTHON_CMD}';
$cmdnames{'strip'} = '${STRIP_CMD}';
foreach my $i (qw(aclocal autoconf autoheader automake autoreconf autoupdate autoscan ifnames libtool libtoolize)) {
- $autocmdnames{$i} = "\$\{" . ( ( $i !~ /auto|aclocal/ ) ? "AUTO" : "" ) . "\U$i\E\}";
+ $autocmdnames{$i} = "\$\{" . ( ( $i !~ /auto|aclocal|libtool/ ) ? "AUTO" : "" ) . "\U$i\E\}";
}
#
# ignore parameter string to echo command.
# note that we leave the command as is, since we need to check the
# use of echo itself.
$j = $whole;
- $j =~ s/([ \t][\@\-]{0,2})(echo|\$[\{\(]ECHO[\}\)]|\$[\{\(]ECHO_MSG[\}\)])[ \t]+("(\\'|\\"|[^"])*"|'(\\'|\\"|[^'])*')[ \t]*[;\n]/$1$2;/; #"
+ $j =~ s/([ \t][\@\-]{0,2})(echo|\$[\{\(]ECHO[\}\)]|\$[\{\(]ECHO_MSG[\}\)])[ \t]+("(\\'|\\"|[^"])*"|'(\\'|\\"|[^'])*')[ \t]*[;\n]/$1$2;\n/g; #"
foreach my $i (keys %cmdnames) {
# XXX This is a hack. Really, we should break $j up into individual
# lines, and go through each one.
- if ($j =~ /([^ \t\/]*[ \t\/][\@\-]{0,2}$i[ \t\n;][^\n]*\n?)/) {
- if ($1 !~ /\n[A-Z]+_TARGET[?+]?=[^\n]+$i/
- && $1 !~ /\nIGNORE(.)?=[^\n]+$i/
- && $1 !~ /\nBROKEN(.)?=[^\n]+$i/
- && $1 !~ /\nRESTRICTED(.)?=[^\n]+$i/
- && $1 !~ /\nNO_PACKAGE(.)?=[^\n]+$i/
- && $1 !~ /\nNO_CDROM(.)?=[^\n]+$i/
- && $1 !~ /\nCOMMENT(.)?=[^\n]+$i/) {
+# if ($j =~ /([^ \t\/]*[ \t\/][\@\-]{0,2}$i[ \t\n;][^\n]*\n?)/) {
+ while ($j =~ /^(.*$i.*)$/gm) {
+ my $curline = $1;
+ my $lineno = &linenumber($`);
+ if ($curline =~ /(^|\s+)[\@\-]{0,2}$i\b/
+ && $curline !~ /^[A-Z]+_TARGET[?+]?=[^\n]+$i/m
+ && $curline !~ /^IGNORE(.)?=[^\n]+$i/m
+ && $curline !~ /^BROKEN(.)?=[^\n]+$i/m
+ && $curline !~ /^RESTRICTED(.)?=[^\n]+$i/m
+ && $curline !~ /^NO_PACKAGE(.)?=[^\n]+$i/m
+ && $curline !~ /^NO_CDROM(.)?=[^\n]+$i/m
+ && $curline !~ /^CATEGORIES(.)?=[^\n]+$i/m
+ && $curline !~ /^COMMENT(.)?=[^\n]+$i/m) {
&perror("WARN: possible direct use of command \"$i\" ".
- "found. use $cmdnames{$i} instead.");
+ "found at line $lineno. use $cmdnames{$i} instead.");
}
}
}
foreach my $i (keys %autocmdnames) {
# XXX Same hack as above.
- if ($j =~ /([^ \t\/]*[ \t\/][\@\-]{0,2}($i\d*)[ \t\n;][^\n]*\n?)/) {
+# if ($j =~ /([^ \t\/]*[ \t\/][\@\-]{0,2}($i\d*)[ \t\n;][^\n]*\n?)/) {
+ while ($j =~ /^(.*($i\d*).*)$/gm) {
my $lm = $1;
my $sm = $2;
- if ($lm !~ /\n[A-Z]+_TARGET[?+]?=[^\n]+($i\d*)/
- && $1 !~ /\nIGNORE(.)?=[^\n]+$i/
- && $1 !~ /\nBROKEN(.)?=[^\n]+$i/
- && $1 !~ /\nRESTRICTED(.)?=[^\n]+$i/
- && $1 !~ /\nNO_PACKAGE(.)?=[^\n]+$i/
- && $1 !~ /\nNO_CDROM(.)?=[^\n]+$i/
- && $lm !~ /\nCOMMENT(.)?=[^\n]+($i\d*)/) {
+ my $lineno = &linenumber($`);
+ if ($lm =~ /(^|\s+)[\@\-]{0,2}($i\d*)\b/
+ && $lm !~ /^[A-Z]+_TARGET[?+]?=[^\n]+($i\d*)/m
+ && $lm !~ /^IGNORE(.)?=[^\n]+($i\d*)/m
+ && $lm !~ /^BROKEN(.)?=[^\n]+($i\d*)/m
+ && $lm !~ /^RESTRICTED(.)?=[^\n]+($i\d*)/m
+ && $lm !~ /^NO_PACKAGE(.)?=[^\n]+($i\d*)/m
+ && $lm !~ /^NO_CDROM(.)?=[^\n]+($i\d*)/m
+ && $lm !~ /^CATEGORIES(.)?=[^\n]+($i\d*)/m
+ && $lm !~ /^COMMENT(.)?=[^\n]+($i\d*)/m) {
&perror("WARN: possible direct use of command \"$sm\" ".
- "found. Use $autocmdnames{$i} instead and ".
- "set according USE_*_VER= flag");
+ "found at line $lineno. Use $autocmdnames{$i} ".
+ "instead and set according USE_*_VER= flag");
}
}
}
@@ -1048,7 +1062,8 @@ ldconfig ln md5 mkdir mv patch perl rm rmdir ruby sed sh touch tr which xargs xm
#
if ($j =~ /\${MKDIR}\s+-p/) {
&perror("WARN: possible use of \"\${MKDIR} -p\" ".
- "found. \${MKDIR} includes \"-p\" by default.");
+ "found at line " . (&linenumber($`)) . ". \${MKDIR} includes ".
+ "\"-p\" by default.");
}
#
@@ -1083,6 +1098,14 @@ ldconfig ln md5 mkdir mv patch perl rm rmdir ruby sed sh touch tr which xargs xm
}
#
+ # whole file: check for deprecated USE_MESA
+ #
+ if ($whole =~ /^USE_MESA[?:]?=/m) {
+ &perror("WARN: USE_MESA is deprecated at line " . (&linenumber($`)) .
+ ". use USE_GL instead.");
+ }
+
+ #
# slave port check
#
my $masterdir = $makevar{MASTERDIR};
@@ -1227,7 +1250,7 @@ DISTFILES DIST_SUBDIR EXTRACT_ONLY
}
if ($committer && $makevar{'.CURDIR'} =~ m'/([^/]+)/[^/]+/?$') {
- if ($cat[0] ne $1) {
+ if ($cat[0] ne $1 && $makevar{PKGCATEGORY} ne $1 ) {
&perror("FATAL: category \"$1\" must be listed first");
}
}
@@ -1919,6 +1942,15 @@ sub checkearlier {
}
}
+sub linenumber {
+ my $text = shift;
+ my @lines;
+
+ @lines = split /\n/, $text;
+
+ return scalar(@lines);
+}
+
sub abspathname {
my($str, $file) = @_;
my($s, $i, %cmdnames);
diff --git a/ports-mgmt/portlint/src/portlintgrep.pl b/ports-mgmt/portlint/src/portlintgrep.pl
new file mode 100644
index 000000000000..1bf267e0988d
--- /dev/null
+++ b/ports-mgmt/portlint/src/portlintgrep.pl
@@ -0,0 +1,53 @@
+#!/usr/bin/perl
+#
+# Copyright (c) 2003 Oliver Eikemeier. All rights reserved.
+#
+# BSD licensed.
+#
+
+#
+# List all the ports with FATAL errors:
+#
+# portlintgrep ^FATAL:
+#
+
+require 5.005;
+use diagnostics;
+use strict;
+use Carp;
+
+my $make = $ENV{MAKE} ? $ENV{MAKE} : '/usr/bin/make';
+my $portlint = $ENV{PORTLINT} ? $ENV{PORTLINT} : '/usr/local/bin/portlint';
+my $portsdir = $ENV{PORTSDIR} ? $ENV{PORTSDIR} : '/usr/ports';
+my $portlint_args = $ENV{PORTLINT_ARGS} ? $ENV{PORTLINT_ARGS} : '';
+
+die "Usage: portlintgrep <regex>\n" if $#ARGV != 0;
+my $regex = qr/$ARGV[0]/;
+
+my %failedports;
+
+my @categories = split ' ', `cd $portsdir; $make -VSUBDIR`;
+foreach my $category (@categories) {
+ my @ports = split ' ', `cd "$portsdir/$category"; $make -VSUBDIR`;
+ foreach my $port (@ports) {
+ my @result =
+ `cd "$portsdir/$category/$port"; $portlint $portlint_args`;
+ map chomp, @result;
+ my @filteredresult = grep /$regex/o, @result;
+ if (@filteredresult) {
+ my $maintainer =
+ `cd "$portsdir/$category/$port"; $make -VMAINTAINER`;
+ chomp $maintainer;
+ push @{$failedports{$maintainer}}, "$category/$port";
+ print join("\n ",
+ "$category/$port <$maintainer>:",
+ @filteredresult),
+ "\n";
+ }
+ }
+}
+
+print "\nPorts sorted by maintainer:\n";
+foreach my $maintainer (sort { lc $a cmp lc $b } keys %failedports) {
+ print join("\n - ", $maintainer, @{$failedports{$maintainer}}), "\n";
+}