aboutsummaryrefslogtreecommitdiff
path: root/ports-mgmt/portlint
diff options
context:
space:
mode:
Diffstat (limited to 'ports-mgmt/portlint')
-rw-r--r--ports-mgmt/portlint/Makefile7
-rw-r--r--ports-mgmt/portlint/src/portlint.pl541
2 files changed, 322 insertions, 226 deletions
diff --git a/ports-mgmt/portlint/Makefile b/ports-mgmt/portlint/Makefile
index af1951f13d4d..673f054e5450 100644
--- a/ports-mgmt/portlint/Makefile
+++ b/ports-mgmt/portlint/Makefile
@@ -5,16 +5,17 @@
#
# $FreeBSD$
#
+# This port is self contained in the src directory.
+#
PORTNAME= portlint
-PORTVERSION= 2.1.3
+PORTVERSION= 2.2.0
CATEGORIES= devel
-DISTFILES= # empty
+DISTFILES= # none
MAINTAINER= mharo@FreeBSD.org
NO_BUILD= yes
-NO_CHECKSUM= yes
NO_WRKSUBDIR= yes
SRC= ${.CURDIR}/src
diff --git a/ports-mgmt/portlint/src/portlint.pl b/ports-mgmt/portlint/src/portlint.pl
index 505e5552f459..429e4de129f9 100644
--- a/ports-mgmt/portlint/src/portlint.pl
+++ b/ports-mgmt/portlint/src/portlint.pl
@@ -10,42 +10,67 @@
# All rights reserved.
# Freely redistributable. Absolutely no warranty.
#
-# Please note that this perl code MUST be able to handle (Open|Net|Free)BSD
+# Please note that this perl code used to be able to handle (Open|Net|Free)BSD
# bsd.port.mk. There are significant differences in those so you'll have
# hard time upgrading this...
+# This code now mainly supports FreeBSD, but patches to update support for
+# OpenBSD and NetBSD will be accepted.
#
# $FreeBSD$
-# $Id: portlint.pl,v 1.4 2000/03/28 05:36:07 mharo Exp $
+# $Id: portlint.pl,v 1.14 2000/04/16 19:58:15 mharo Exp $
#
+use vars qw/ $opt_a $opt_b $opt_c $opt_h $opt_v $opt_N $opt_B $opt_V /;
+use Getopt::Std;
+#use strict;
+
+my ($err, $warn);
+my ($extrafile, $parenwarn, $committer, $verbose, $newport);
+my $contblank;
+my $portdir;
+
$err = $warn = 0;
$extrafile = $parenwarn = $committer = $verbose = $newport = 0;
$contblank = 1;
$portdir = '.';
-$l = '[{(]';
-$r = '[)}]';
-$s = '[ \t]';
+# version variables
+my $major = 2;
+my $minor = 2;
+
+sub l { '[{(]'; }
+sub r { '[)}]'; }
+sub s { '[ \t]'; }
+
+my $l = &l;
+my $r = &r;
+my $s = &s;
+
# default setting - for FreeBSD
-$portsdir = '/usr/ports';
-$rcsidstr = 'FreeBSD';
-$multiplist = 0;
-$ldconfigwithtrue = 0;
-$rcsidinplist = 0;
-$mancompress = 1;
-$manstrict = 0;
-$newxdef = 1;
-$automan = 1;
-$manchapters = '123456789ln';
-$localbase = '/usr/local';
-
-#select(STDERR);
-while (@ARGV > 0) {
- $_ = shift;
- /^-h/ && do {
- ($prog) = ($0 =~ /([^\/]+)$/);
- print STDERR <<EOF;
+my $portsdir = '/usr/ports';
+my $rcsidstr = 'FreeBSD';
+my $multiplist = 0;
+my $ldconfigwithtrue = 0;
+my $rcsidinplist = 0;
+my $mancompress = 1;
+my $manstrict = 0;
+my $newxdef = 1;
+my $automan = 1;
+my $manchapters = '123456789ln';
+my $localbase = '/usr/local';
+
+my @lang_cat = split(/\s+/, <<EOF);
+chinese german japanese korean russian vietnamese
+EOF
+my @lang_pref = split(/\s+/, <<EOF);
+de ja ko ru vi zh
+EOF
+my $re_lang_pref = '(' . join('|', @lang_pref) . ')';
+
+my ($prog) = ($0 =~ /([^\/]+)$/);
+sub usage {
+ print STDERR <<EOF;
usage: $prog [-abcvN] [-B#] [port_directory]
-a additional check for scripts/* and pkg/*
-b warn \$(VARIABLE)
@@ -55,33 +80,36 @@ usage: $prog [-abcvN] [-B#] [port_directory]
-B# allow # contiguous blank lines (default: $contblank line)
EOF
exit 0;
- };
- /^-a/ && do {$extrafile = 1; next;};
- /^-b/ && do {$parenwarn = 1; next;};
- /^-c/ && do {$committer = 1; next;};
- /^-v/ && do {$verbose = 1; next;};
- /^-N/ && do {$newport = 1; next;};
- /^-B(\d+)$/ && do { $contblank = $1; next; };
- @ARGV > 0 && /^-B$/ && do {
- $contblank = shift;
- if ($contblank !~ /^\d+$/) {
- print STDERR "FATAL: -B must come with number.\n";
- exit 1;
- }
- next;
- };
- $portdir = $_;
}
+sub version {
+ print "$prog version $major.$minor\n";
+ exit $major;
+}
+
+
+getopts('abchvNB:V');
+
+&usage if $opt_h;
+&version if $opt_V;
+$extrafile = 1 if $opt_a;
+$parenwarn = 1 if $opt_b;
+$committer = 1 if $opt_c;
+$verbose = 1 if $opt_v;
+$newport = 1 if $opt_N;
+$contblank = $opt_B if $opt_B;
+
+$portdir = $ARGV[0] ? $ARGV[0] : '.';
+
# OS dependent configs
# os portsdir rcsid mplist ldcfg plist-rcsid mancompresss strict localbase newxdef automan
-@osdep = split(/\n/, <<EOF);
+my @osdep = split(/\n/, <<EOF);
FreeBSD /usr/ports FreeBSD 0 0 0 1 0 /usr/local 1 1
NetBSD /usr/pkgsrc NetBSD 1 1 1 0 1 /usr/pkg 0 0
EOF
-$osname = `uname -s`;
+my $osname = `uname -s`;
$osname =~ s/\n$//;
-foreach $i (@osdep) {
+foreach my $i (@osdep) {
if ($i =~ /^$osname\t(.*)/) {
print "OK: found OS config for $osname.\n" if ($verbose);
($portsdir, $rcsidstr, $multiplist, $ldconfigwithtrue,
@@ -114,15 +142,15 @@ if (! -d $portdir) {
#
# variables for global checks.
#
-$sharedocused = 0;
-%plistmanall = ();
-%plistmangz = ();
-%plistman = ();
-%manlangs = ();
+my $sharedocused = 0;
+my %plistmanall = ();
+my %plistmangz = ();
+my %plistman = ();
+my %manlangs = ();
-%predefined = ();
+my %predefined = ();
# historical, no longer in FreeBSD's bsd.port.mk
-foreach $i (split("\n", <<EOF)) {
+foreach my $i (split("\n", <<EOF)) {
XCONTRIB ftp://ftp.x.org/contrib/
GNU ftp://prep.ai.mit.edu/pub/gnu/
GNU ftp://wuarchive.wustl.edu/systems/gnu/
@@ -132,12 +160,12 @@ SUNSITE ftp://ftp.funet.fi/pub/mirrors/sunsite.unc.edu/pub/Linux/
TEX_CTAN ftp://ftp.cdrom.com/pub/tex/ctan/
TEX_CTAN ftp://ftp.tex.ac.uk/public/ctan/tex-archive/
EOF
- ($j, $k) = split(/\t+/, $i);
+ my ($j, $k) = split(/\t+/, $i);
$predefined{$k} = $j;
}
# This list should be in sync with bsd.port.mk
-foreach $i (split("\n", <<EOF)) {
+foreach my $i (split("\n", <<EOF)) {
XCONTRIB ftp://crl.dec.com/pub/X11/contrib/
XCONTRIB ftp://uiarchive.uiuc.edu/pub/X11/contrib/
XCONTRIB ftp://ftp.duke.edu/pub/X11/contrib/
@@ -197,18 +225,18 @@ TCLTK ftp://ftp.cs.tu-berlin.de/pub/tcl/distrib/
TCLTK ftp://ftp.srcc.msu.su/mirror/ftp.scriptics.com/pub/tcl/
TCLTK ftp://ftp.lip6.fr/pub/tcl/distrib/
EOF
- ($j, $k) = split(/\t+/, $i);
+ my ($j, $k) = split(/\t+/, $i);
$predefined{$k} = $j;
}
#
# check for files.
#
-@checker = ('pkg/COMMENT', 'pkg/DESCR', 'Makefile', 'files/md5');
-%checker = ('pkg/COMMENT', 'checkdescr', 'pkg/DESCR', 'checkdescr',
+my @checker = ('pkg/COMMENT', 'pkg/DESCR', 'Makefile', 'files/md5');
+my %checker = ('pkg/COMMENT', 'checkdescr', 'pkg/DESCR', 'checkdescr',
'Makefile', 'checkmakefile', 'files/md5', 'TRUE');
if ($extrafile) {
- foreach $i ((<$portdir/scripts/*>, <$portdir/pkg/*>)) {
+ foreach my $i ((<$portdir/scripts/*>, <$portdir/pkg/*>)) {
next if (! -T $i);
$i =~ s/^$portdir\///;
next if (defined $checker{$i});
@@ -222,19 +250,19 @@ if ($extrafile) {
}
}
}
-foreach $i (<$portdir/patches/patch-??>) {
+foreach my $i (<$portdir/patches/patch-??>) {
next if (! -T $i);
$i =~ s/^$portdir\///;
next if (defined $checker{$i});
push(@checker, $i);
$checker{$i} = 'checkpatch';
}
-foreach $i (@checker) {
+foreach my $i (@checker) {
print "OK: checking $i.\n";
if (! -f "$portdir/$i") {
&perror("FATAL: no $i in \"$portdir\".");
} else {
- $proc = $checker{$i};
+ my $proc = $checker{$i};
&$proc($i) || &perror("Cannot open the file $i\n");
if ($i !~ /^patches\//) {
&checklastline($i)
@@ -244,16 +272,16 @@ foreach $i (@checker) {
}
if ($committer) {
if (scalar(@_ = <$portdir/work/*>) || -d "$portdir/work") {
- &perror("WARN: be sure to cleanup $portdir/work ".
+ &perror("FATAL: be sure to cleanup $portdir/work ".
"before committing the port.");
}
if (scalar(@_ = <$portdir/*/*~>) || scalar(@_ = <$portdir/*~>)) {
- &perror("WARN: for safety, be sure to cleanup ".
- "emacs backup files before committing the port.");
+ &perror("FATAL: for safety, be sure to cleanup ".
+ "editor backup files before committing the port.");
}
if (scalar(@_ = <$portdir/*/*.orig>) || scalar(@_ = <$portdir/*.orig>)
|| scalar(@_ = <$portdir/*/*.rej>) || scalar(@_ = <$portdir/*.rej>)) {
- &perror("WARN: for safety, be sure to cleanup ".
+ &perror("FATAL: for safety, be sure to cleanup ".
"patch backup files before committing the port.");
}
}
@@ -268,18 +296,18 @@ exit $err;
# pkg/COMMENT, pkg/DESCR
#
sub checkdescr {
- local($file) = @_;
- local(%maxchars) = ('pkg/COMMENT', 70, 'pkg/DESCR', 80);
- local(%maxlines) = ('pkg/COMMENT', 1, 'pkg/DESCR', 24);
- local(%errmsg) = ('pkg/COMMENT', "must be one-liner.",
+ my($file) = @_;
+ my(%maxchars) = ('pkg/COMMENT', 70, 'pkg/DESCR', 80);
+ my(%maxlines) = ('pkg/COMMENT', 1, 'pkg/DESCR', 24);
+ my(%errmsg) = ('pkg/COMMENT', "must be one-liner.",
'pkg/DESCR', "exceeds $maxlines{'pkg/DESCR'} ".
"lines, make it shorter if possible.");
- local($longlines, $linecnt, $tmp) = (0, 0, "");
+ my($longlines, $linecnt, $tmp) = (0, 0, "");
open(IN, "< $portdir/$file") || return 0;
while (<IN>) {
$linecnt++;
- $longlines++ if ($maxchars{$file} < length($_));
+ $longlines++ if ($maxchars{$file} < length(chomp($_)));
$tmp .= $_;
}
if ($linecnt > $maxlines{$file}) {
@@ -289,7 +317,7 @@ sub checkdescr {
print "OK: $file has $linecnt lines.\n" if ($verbose);
}
if ($longlines > 0) {
- &perror("WARN: $i includes lines that exceed $maxchars{$file} ".
+ &perror("WARN: $file includes lines that exceed $maxchars{$file} ".
"characters.");
}
if ($tmp =~ /[\033\200-\377]/) {
@@ -309,16 +337,16 @@ sub checkdescr {
# pkg/PLIST
#
sub checkplist {
- local($file) = @_;
- local($curdir) = ($localbase);
- local($inforemoveseen, $infoinstallseen, $infoseen) = (0, 0, 0);
- local($infobeforeremove, $infoafterinstall) = (0, 0);
- local($infooverwrite) = (0);
- local($rcsidseen) = (0);
+ my($file) = @_;
+ my($curdir) = ($localbase);
+ my($inforemoveseen, $infoinstallseen, $infoseen) = (0, 0, 0);
+ my($infobeforeremove, $infoafterinstall) = (0, 0);
+ my($infooverwrite) = (0);
+ my($rcsidseen) = (0);
- local(@exec_info) = ();
- local(@unexec_info) = ();
- local(@infofile) = ();
+ my(@exec_info) = ();
+ my(@unexec_info) = ();
+ my(@infofile) = ();
open(IN, "< $portdir/$file") || return 0;
while (<IN>) {
@@ -432,12 +460,14 @@ sub checkplist {
}
# check that every infofile has an exec install-info and unexec install-info
- $exec_install = join(/ /, @exec_info);
- $exec_install .= ' ';
- $unexec_install = join(/ /, @unexec_info);
- $unexec_install .= ' ';
- foreach $if (@infofile) {
- if ($exec_install !~ m/\%D\/$if/) {
+ my $exec_install = join(/ /, @exec_info);
+ my $exec_install .= ' ';
+ my $unexec_install = join(/ /, @unexec_info);
+ my $unexec_install .= ' ';
+
+ foreach my $if (@infofile) {
+ next if ($if =~ m/info-/);
+ if ($exec_install !~ m/\%D\/\Q$if\E/) {
&perror("FATAL: you need an '\@exec install-info \%D/$if \%D/info/dir' line in your PLIST");
}
if ($unexec_install !~ m/\%D\/$if/) {
@@ -482,8 +512,8 @@ sub checkplist {
# misc files
#
sub checkpathname {
- local($file) = @_;
- local($whole);
+ my($file) = @_;
+ my($whole);
open(IN, "< $portdir/$file") || return 0;
$whole = '';
@@ -495,8 +525,8 @@ sub checkpathname {
}
sub checklastline {
- local($file) = @_;
- local($whole);
+ my($file) = @_;
+ my($whole);
open(IN, "< $portdir/$file") || return 0;
$whole = '';
@@ -516,8 +546,8 @@ sub checklastline {
}
sub checkpatch {
- local($file) = @_;
- local($whole);
+ my($file) = @_;
+ my($whole);
if (-z "$portdir/$file") {
&perror("FATAL: $file has no content. should be removed ".
@@ -542,15 +572,17 @@ sub checkpatch {
# Makefile
#
sub checkmakefile {
- local($file) = @_;
- local($rawwhole, $whole, $idx, @sections);
- local($tmp);
- local($i, $j, $k, $l);
- local(@varnames) = ();
- local($distfiles, $pkgname, $distname, $extractsufx) = ('', '', '', '');
- local($bogusdistfiles) = (0);
- local($realwrksrc, $wrksrc, $nowrksubdir) = ('', '', '');
- local(@mman, @pman);
+ my($file) = @_;
+ my($rawwhole, $whole, $idx, @sections);
+ my($i, $j, $k, $l);
+ my @cat = ();
+ my $has_lang_cat = 0;
+ my $tmp;
+ my $bogusdistfiles = 0;
+ my @varnames = ();
+ my($portname, $portversion, $distfiles, $distname, $extractsufx) = ('', '', '', '', '');
+ my($realwrksrc, $wrksrc, $nowrksubdir) = ('', '', '');
+ my(@mman, @pman);
open(IN, "< $portdir/$file") || return 0;
$rawwhole = '';
@@ -621,10 +653,29 @@ sub checkmakefile {
}
#
- # whole file: IS_INTERACTIVE/NOPORTDOCS
+ # whole file: NO_CHECKSUM
#
$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. ".
+ "it is intended to be a user variable.");
+ }
+
+ #
+ # whole file: PKGNAME
+ #
+ print "OK: checking PKGNAME.\n" if ($verbose);
+ if ($whole =~ /\nPKGNAME/) {
+ &perror("FATAL: PKGNAME is obsoleted by PORTNAME, ".
+ "PORTVERSION, PKGNAMEPREFIX and PKGNAMESUFFIX.");
+ }
+
+
+ #
+ # whole file: IS_INTERACTIVE/NOPORTDOCS
+ #
print "OK: checking IS_INTERACTIVE.\n" if ($verbose);
if ($whole =~ /\nIS_INTERACTIVE/) {
if ($whole !~ /defined\((BATCH|FOR_CDROM)\)/) {
@@ -643,8 +694,9 @@ sub checkmakefile {
#
# whole file: direct use of command names
#
+ my %cmdnames = ();
print "OK: checking direct use of command names.\n" if ($verbose);
- foreach $i (split(/\s+/, <<EOF)) {
+ foreach my $i (split(/\s+/, <<EOF)) {
awk basename cat chmod chown cp echo expr false gmake grep gzcat
ldconfig ln md5 mkdir mv patch rm rmdir sed sh touch tr which xmkmf
EOF
@@ -660,7 +712,7 @@ EOF
# use of echo itself.
$j = $whole;
$j =~ s/([ \t][\@-]?)(echo|\$[\{\(]ECHO[\}\)]|\$[\{\(]ECHO_MSG[\}\)])[ \t]+("(\\'|\\"|[^"])*"|'(\\'|\\"|[^'])*')[ \t]*[;\n]/$1$2;/;
- foreach $i (keys %cmdnames) {
+ foreach my $i (keys %cmdnames) {
if ($j =~ /[ \t\/]$i[ \t\n;]/
&& $j !~ /\n[A-Z]+_TARGET[?+]?=[^\n]+$i/) {
&perror("WARN: possible direct use of command \"$i\" ".
@@ -717,9 +769,8 @@ EOF
# section 1: comment lines.
#
print "OK: checking comment section of $file.\n" if ($verbose);
- @linestocheck = split("\n", <<EOF);
+ my @linestocheck = split("\n", <<EOF);
Whom
-Version [rR]equired
Date [cC]reated
EOF
if ($osname eq 'NetBSD') {
@@ -733,18 +784,27 @@ EOF
if ($tmp =~ /\n[^#]/) {
&perror("FATAL: non-comment line in comment section of $file.");
}
- foreach $i (@linestocheck) {
+ foreach my $i (@linestocheck) {
$j = $i;
$j =~ s/\(.*\)\?//g;
$j =~ s/\[(.)[^\]]*\]/$1/g;
if ($tmp !~ /# $i:[ \t]+\S+/) {
- &perror("FATAL: no \"$j\" line in ".
- "comment section of $file.");
+ &perror("FATAL: no \"$j\" line in comment section of $file.");
} else {
print "OK: \"$j\" seen in $file.\n" if ($verbose);
}
}
- if ($tmp !~ /#\n#(\s+)\$$rcsidstr([^\$]*)\$\n/) {
+ foreach my $i (@linestocheck) {
+ if ($i =~ m/Version [rR]equired/) {
+ &perror("FATAL: Version required is no longer needed in the comment section of $file.");
+ }
+ }
+ my $tmp2 = "";
+ for (split(/\n/, $tmp)) {
+ $tmp2 = $_ if (m/$rcsidstr/);
+ }
+ if ($tmp2 !~ /#(\s+)\$$rcsidstr([^\$]*)\$$/) {
+
&perror("FATAL: no \$$rcsidstr\$ line in $file comment ".
"section.");
} else {
@@ -777,48 +837,68 @@ EOF
#
#
- # section 2: DISTNAME/PKGNAME/...
+ # section 2: PORTNAME/PORTVERSION/...
#
- print "OK: checking first section of $file. (DISTNAME/...)\n"
+ print "OK: checking first section of $file. (PORTNAME/...)\n"
if ($verbose);
$tmp = $sections[$idx++];
# check the order of items.
- &checkorder('DISTNAME', $tmp, split(/\s+/, <<EOF));
-DISTNAME PKGNAME CATEGORIES MASTER_SITES MASTER_SITE_SUBDIR
-EXTRACT_SUFX DISTFILES
+ &checkorder('PORTNAME', $tmp, split(/\s+/, <<EOF));
+PORTNAME PORTVERSION CATEGORIES MASTER_SITES MASTER_SITE_SUBDIR
+PKGNAMEPREFIX PKGNAMESUFFIX DISTNAME EXTRACT_SUFX DISTFILES
EOF
# check the items that has to be there.
$tmp = "\n" . $tmp;
- print "OK: checking DISTNAME.\n" if ($verbose);
- if ($tmp !~ /\nDISTNAME=/) {
- &perror("FATAL: DISTNAME has to be there.");
+ print "OK: checking PORTNAME/PORTVERSION.\n" if ($verbose);
+ if ($tmp !~ /\nPORTNAME=/) {
+ &perror("FATAL: PORTNAME has to be there.");
}
- if ($tmp =~ /\nDISTNAME(\?=)/) {
- &perror("FATAL: DISTNAME has be set by \"=\", ".
+ if ($tmp =~ /\nPORTNAME(\?=)/) {
+ &perror("FATAL: PORTNAME has be set by \"=\", ".
"not by \"$1\".");
}
+ if ($tmp !~ /\nPORTVERSION=/) {
+ &perror("FATAL: PORTVERSION has to be there.");
+ }
print "OK: checking CATEGORIES.\n" if ($verbose);
- if ($tmp !~ /\nCATEGORIES[+?]?=/) {
+#MICHAEL: do we want to use [^\n] here?
+ if ($tmp !~ /\nCATEGORIES(.)?=[ \t]*([^\n]*)/) {
&perror("FATAL: CATEGORIES has to be there.");
}
- if ($tmp =~ /\nCATEGORIES([^?+]=)/) {
+ @cat = split(/\s+/, $2);
+ $i = $1;
+ if ($i ne '' && $i =~ /[^?+]/) {
&perror("WARN: CATEGORIES should be set by \"=\", \"?=\", or \"+=\", ".
- "not by \"$1\".");
+ "not by \"$i\".");
+ }
+
+ if (@cat == 0) {
+ &perror("FATAL: CATEGORIES left blank. set it to \"misc\"".
+ " if nothing seems apropriate.");
+ }
+
+#MICHAEL: can these three lang cat checks be combined?
+ # skip the first category specification if it's a language specific one.
+ if (grep($_ eq $cat[0], @lang_cat)) {
+ $has_lang_cat = 1;
+ shift @cat;
+ }
+
+ # skip further if more language specific ones follow.
+ if (@cat && grep($_ eq $cat[0], @lang_cat)) {
+ &perror("WARN: multiple language specific categories detected. ".
+ "are you sure?");
+ do {
+ shift @cat;
+ } while (@cat && grep($_ eq $cat[0], @lang_cat));
}
# check x11 in CATEGORIES
- if ($newxdef
- && $tmp =~ /\nCATEGORIES[+?]?=[ \t]*([^\n]*)\n/
- && ($foo = $1) =~ /x11/) {
- print "OK: checking x11 in CATEGORIES.\n" if ($verbose);
- @i = split(/\s+/, $foo);
- if ($i[0] =~ /^x11\-?/) {
- ; # okay
- } elsif ($i[0] =~ /(chinese|japanese|korean|german|russian)/) {
- ; # okay
- } else {
+ if ($newxdef) {
+#MICHAEL: I don't understand this line
+ if (2 <= @cat && $cat[1] eq "x11") {
&perror("WARN: only specific kind of apps should ".
"specify \"x11\" in CATEGORIES. ".
"Do you mean just USE_XLIB? ".
@@ -826,13 +906,25 @@ EOF
}
}
+ if (2 <= @cat) {
+ # skip the first one that we know is _not_ language specific.
+ shift @cat;
+
+ # any language specific one after non language specific ones?
+ if (grep(do { my $cat = $_; grep($_ eq $cat, @cat) }, @lang_cat)) {
+ $has_lang_cat = 1;
+ &perror("WARN: when you specify multiple categories, ".
+ "language specific category should come first.");
+ }
+ }
+
# check the URL
if ($tmp =~ /\nMASTER_SITES[+?]?=[ \t]*([^\n]*)\n/
&& $1 !~ /^[ \t]*$/) {
print "OK: seen MASTER_SITES, sanity checking URLs.\n"
if ($verbose);
- @sites = split(/\s+/, $1);
- foreach $i (@sites) {
+ my @sites = split(/\s+/, $1);
+ foreach my $i (@sites) {
if ($i =~ m#^\w+://#) {
if ($i !~ m#/$#) {
&perror("FATAL: URL \"$i\" should ".
@@ -862,7 +954,8 @@ EOF
# check DISTFILES and related items.
$distfiles = $1 if ($tmp =~ /\nDISTFILES[+?]?=[ \t]*([^\n]+)\n/);
- $pkgname = $1 if ($tmp =~ /\nPKGNAME[+?]?=[ \t]*([^\n]+)\n/);
+ $portname = $1 if ($tmp =~ /\nPORTNAME[+?]?=[ \t]*([^\n]+)\n/);
+ $portversion = $1 if ($tmp =~ /\nPORTVERSION[+?]?=[ \t]*([^\n]+)\n/);
$distname = $1 if ($tmp =~ /\nDISTNAME[+?]?=[ \t]*([^\n]+)\n/);
$extractsufx = $1 if ($tmp =~ /\nEXTRACT_SUFX[+?]?=[ \t]*([^\n]+)\n/);
@@ -883,47 +976,38 @@ EOF
$extractsufx = '.tar.gz';
}
- print "OK: sanity checking PKGNAME.\n" if ($verbose);
- if ($pkgname ne '' && $pkgname eq $distname) {
- &perror("WARN: PKGNAME is \${DISTNAME} by default, ".
- "you don't need to define PKGNAME.");
- }
- $i = ($pkgname eq '') ? $distname : $pkgname;
- if ($i =~ /-([^-]+)$/) {
- $j = $`;
- $k = $1;
- if ($j =~ /[0-9]$/) {
- &perror("WARN: is \"$j\" correct as package name ".
- "WITHOUT version number? ".
- "if not, avoid \"-\" in version number ".
- "part of ".
- (($pkgname eq '') ? "DISTNAME." : "PKGNAME."));
- }
- if ($k =~ /^pl[0-9]*$/
- || $k =~ /^[0-9]*[A-Za-z]?[0-9]*(\.[0-9]*[A-Za-z]?[0-9]*)*$/) {
- print "OK: trailing part of PKGNAME\"-$k\" ".
- "looks fine.\n" if ($verbose);
- } elsif ($k =~ /\$\{.+\}$/) {
- &perror("WARN: using variable, \"$k\", as verison number");
- } else {
- &perror("FATAL: version number part of PKGNAME".
- (($pkgname eq '')
- ? ', which is derived from DISTNAME, '
- : ' ').
- "looks illegal. should modify \"-$k\".");
- }
+ print "OK: sanity checking PORTNAME/PORTVERSION.\n" if ($verbose);
+ if ($distname ne '' && $distname eq "$portname-$portversion") {
+ &perror("WARN: DISTNAME is \${PORTNAME}-\${PORTVERSION} by default, ".
+ "you don't need to define DISTNAME.");
+ }
+ if ($portname =~ /^$re_lang_pref-/) {
+ &perror("FATAL: language prefix is automatically".
+ " set by PKGNAMEPREFIX.".
+ " you must remove it from PORTNAME.");
+ }
+ if ($portname =~ /\$[\{\(].+[\}\)]/) {
+ &perror("WARN: using variable in PORTNAME.".
+ " consider using PKGNAMEPREFIX and/or PKGNAMESUFFIX.");
+ } elsif ($portname =~ /-/ && $distname ne '') {
+ &perror("WARN: using hyphen in PORTNAME.".
+ " consider using PKGNAMEPREFIX and/or PKGNAMESUFFIX.");
+ }
+ if ($portversion eq '') {
+ &perror("FATAL: PORTVERSION must be specified");
+ }
+ if ($portversion =~ /^pl[0-9]*$/
+ || $portversion =~ /^[0-9]*[A-Za-z]?[0-9]*(\.[0-9]*[A-Za-z]?[0-9]*)*$/) {
+ print "OK: PORTVERSION \"$portversion\" looks fine.\n" if ($verbose);
+ } elsif ($portversion =~ /^[^\-]*\$[{\(].+[\)}][^\-]*$/) {
+ &perror("WARN: using variable, \"$portversion\", as version number");
+ } elsif ($portversion =~ /-/) {
+ &perror("FATAL: PORTVERSION should not contain a hyphen.".
+ "should modify \"$portversion\".");
} else {
- &perror("FATAL: PKGNAME".
- (($pkgname eq '')
- ? ', which is derived from DISTNAME, '
- : ' ').
- "must come with version number, like \"foobaa-1.0\".");
- if ($i =~ /_pl[0-9]*$/
- || $i =~ /_[0-9]*[A-Za-z]?[0-9]*(\.[0-9]*[A-Za-z]?[0-9]*)*$/) {
- &perror("FATAL: you seem to using underline ".
- "before version number in PKGNAME. ".
- "it has to be hyphen.");
- }
+ &perror("FATAL: PORTVERSION looks illegal. ".
+ "should modify \"$portversion\".");
+
}
# if DISTFILES have only single item, it is better to avoid DISTFILES
@@ -940,36 +1024,46 @@ EOF
&perror("WARN: use of DISTFILES with single file ".
"discouraged. distribution filename should be set by ".
"DISTNAME and EXTRACT_SUFX.");
- if ($distfiles eq $distname . $extractsufx) {
+ if ($distfiles eq (($distname ne '') ? $distname : "$portname-$portversion") . $extractsufx) {
&perror("WARN: definition of DISTFILES not necessery. ".
"DISTFILES is \${DISTNAME}/\${EXTRACT_SUFX} ".
"by default.");
}
- # make an advice only in certain cases.
- if ($pkgname ne '' && $distfiles =~ /^\Q$pkgname\E([-\.].+)$/) {
- &perror("WARN: how about \"DISTNAME=$pkgname\"".
- (($1 eq '.tar.gz')
- ? ""
- : " and \"EXTRACT_SUFX=$1\"").
+ # display advice only in certain cases.
+#MICHAEL: will this work with multiple distfiles in this list? what about
+# doing the same sort of thing for DISTNAME, is it needed?
+ if ($distfiles =~ /^\Q$i\E([\-.].+)$/) {
+ &perror("WARN: how about \"EXTRACT_SUFX=$1\"".
", instead of DISTFILES?");
}
}
# additional checks for committer.
- $i = ($pkgname eq '') ? $distname : $pkgname;
- if ($committer && $i =~ /^(de|ja|ko|ru|vi|zh)-/) {
+ if ($committer && $has_lang_cat) {
&perror("WARN: be sure to include country code \"$1-\" ".
"in the module alias name.");
}
- if ($committer && -f "$portdir/$i.tgz") {
- &perror("WARN: be sure to remove $portdir/$i.tgz ".
- "before committing the port.");
+
+ if ($committer) {
+ if (opendir(DIR, $portdir)) {
+ my @tgz = grep(/\.tgz$/, readdir(DIR));
+ closedir(DIR);
+
+ if (@tgz) {
+ my $tgz = (2 <= @tgz)
+ ? '{' . join(',', @tgz) . '}'
+ : @tgz[0];
+
+ &perror("WARN: be sure to remove $portdir/$tgz ".
+ "before committing the port.");
+ }
+ }
}
push(@varnames, split(/\s+/, <<EOF));
-DISTNAME PKGNAME CATEGORIES MASTER_SITES MASTER_SITE_SUBDIR
-EXTRACT_SUFX DISTFILES
+PORTNAME PORTVERSION CATEGORIES MASTER_SITES MASTER_SITE_SUBDIR
+PKGNAMEPREFIX PKGNAMESUFFIX DISTNAME EXTRACT_SUFX DISTFILES
EOF
#
@@ -980,7 +1074,7 @@ EOF
$tmp = $sections[$idx];
if ($tmp =~ /(PATCH_SITES|PATCH_SITE_SUBDIR|PATCHFILES|PATCH_DIST_STRIP)/) {
- &checkearlier($tmp, @varnames);
+ &checkearlier($file, $tmp, @varnames);
if ($tmp =~ /^PATCH_SITES=/) {
print "OK: seen PATCH_SITES.\n" if ($verbose);
@@ -1015,7 +1109,7 @@ EOF
if ($verbose);
$tmp = $sections[$idx++];
- &checkearlier($tmp, @varnames);
+ &checkearlier($file, $tmp, @varnames);
$tmp = "\n" . $tmp;
if ($tmp =~ /\nMAINTAINER\??=[^\n]+/) {
$tmp =~ s/\nMAINTAINER\??=[^\n]+//;
@@ -1040,18 +1134,18 @@ EOF
LIB_DEPENDS BUILD_DEPENDS RUN_DEPENDS FETCH_DEPENDS DEPENDS DEPENDS_TARGET
EOF
if ($tmp =~ /(LIB_|BUILD_|RUN_|FETCH_)?DEPENDS/) {
- &checkearlier($tmp, @varnames);
+ &checkearlier($file, $tmp, @varnames);
if (!defined $ENV{'PORTSDIR'}) {
$ENV{'PORTSDIR'} = $portsdir;
}
- foreach $i (grep(/^[A-Z_]*DEPENDS[?+]?=/, split(/\n/, $tmp))) {
+ foreach my $i (grep(/^[A-Z_]*DEPENDS[?+]?=/, split(/\n/, $tmp))) {
$i =~ s/^([A-Z_]*DEPENDS)[?+]?=[ \t]*//;
$j = $1;
print "OK: checking ports listed in $j.\n"
if ($verbose);
- foreach $k (split(/\s+/, $i)) {
- @l = split(':', $k);
+ foreach my $k (split(/\s+/, $i)) {
+ my @l = split(':', $k);
print "OK: checking dependency value for $j.\n"
if ($verbose);
@@ -1067,7 +1161,7 @@ EOF
"colon-separated tuples.");
next;
}
- %m = ();
+ my %m = ();
if ($j eq 'DEPENDS') {
$m{'dir'} = $l[0];
$m{'tgt'} = $l[1];
@@ -1130,7 +1224,7 @@ EOF
}
}
}
- foreach $i (@linestocheck) {
+ foreach my $i (@linestocheck) {
$tmp =~ s/$i[?+]?=[^\n]+\n//g;
}
@@ -1140,7 +1234,7 @@ EOF
}
push(@varnames, @linestocheck);
- &checkearlier($tmp, @varnames);
+ &checkearlier($file, $tmp, @varnames);
#
# Makefile 6: check the rest of file
@@ -1150,7 +1244,7 @@ EOF
$tmp = "\n" . $tmp; # to make the begin-of-line check easier
- &checkearlier($tmp, @varnames);
+ &checkearlier($file, $tmp, @varnames);
# check WRKSRC/NO_WRKSUBDIR
#
@@ -1158,7 +1252,6 @@ EOF
# DISTNAME is for controlling distribution filename.
# example:
# DISTNAME= package
- # PKGNAME= package-1.0
# DISTFILES=package-1.0.tgz
# should be
# DISTNAME= package-1.0
@@ -1221,21 +1314,21 @@ EOF
# check MAN[1-9LN]
print "OK: checking MAN[0-9LN].\n" if ($verbose);
- foreach $i (keys %plistmanall) {
+ foreach my $i (keys %plistmanall) {
print "OK: PLIST MAN$i=$plistmanall{$i}\n" if ($verbose);
}
- foreach $i (split(//, $manchapters)) {
+ foreach my $i (split(//, $manchapters)) {
if ($tmp =~ /MAN\U$i\E=\s*([^\n]*)\n/) {
print "OK: Makefile MAN$i=$1\n" if ($verbose);
}
}
- foreach $i (split(//, $manchapters)) {
+ foreach my $i (split(//, $manchapters)) {
next if ($i eq '');
if ($tmp =~ /MAN\U$i\E=\s*([^\n]*)\n/) {
@mman = grep($_ !~ /^\s*$/, split(/\s+/, $1));
@pman = grep($_ !~ /^\s*$/,
split(/\s+/, $plistmanall{$i}));
- foreach $j (@mman) {
+ foreach my $j (@mman) {
print "OK: checking $j (Makefile)\n"
if ($verbose);
if ($automan && grep($_ eq $j, @pman)) {
@@ -1248,7 +1341,7 @@ EOF
"MAN$i but not in PLIST.");
}
}
- foreach $j (@pman) {
+ foreach my $j (@pman) {
print "OK: checking $j (PLIST)\n" if ($verbose);
if (!grep($_ eq $j, @mman)) {
&perror("WARN: manpage $j in PLIST ".
@@ -1316,7 +1409,7 @@ EOF
}
sub perror {
- local(@msg) = @_;
+ my(@msg) = @_;
if ($msg[0] =~ /^FATAL/) {
$err++;
} else {
@@ -1326,7 +1419,7 @@ sub perror {
}
sub checkextra {
- local($str, $section) = @_;
+ my($str, $section) = @_;
$str = "\n" . $str if ($str !~ /^\n/);
$str =~ s/\n#[^\n]*/\n/g;
@@ -1346,13 +1439,13 @@ sub checkextra {
}
sub checkorder {
- local($section, $str, @order) = @_;
- local(@items, $i, $j, $k, $invalidorder);
+ my($section, $str, @order) = @_;
+ my(@items, $i, $j, $k, $invalidorder);
print "OK: checking the order of $section section.\n" if ($verbose);
@items = ();
- foreach $i (split("\n", $tmp)) {
+ foreach my $i (split("\n", $str)) {
$i =~ s/[+?]?=.*$//;
push(@items, $i);
}
@@ -1374,7 +1467,9 @@ sub checkorder {
print "OK: seen $i, in order.\n" if ($verbose);
}
$j = $k;
- } else {
+ # This if condition tests for .if, .else (in all forms),
+ # .for and .endfor and .include
+ } elsif ($i !~ m/^\.(if|el|endif|for|endfor|include)/) {
&perror("FATAL: extra item \"$i\" placed in the ".
"$section section.");
}
@@ -1388,11 +1483,11 @@ sub checkorder {
}
sub checkearlier {
- local($str, @varnames) = @_;
- local($i);
+ my($file, $str, @varnames) = @_;
+ my($i);
print "OK: checking items that has to appear earlier.\n" if ($verbose);
- foreach $i (@varnames) {
+ foreach my $i (@varnames) {
if ($str =~ /\n$i[?+]?=/) {
&perror("WARN: \"$i\" has to appear earlier in $file.");
}
@@ -1400,16 +1495,16 @@ sub checkearlier {
}
sub abspathname {
- local($str, $file) = @_;
- local($s, $i, %cmdnames);
- local($pre);
+ my($str, $file) = @_;
+ my($s, $i, %cmdnames);
+ my($pre);
# ignore parameter string to echo command
$str =~ s/[ \t][\@-]?(echo|\$[\{\(]ECHO[\}\)]|\$[\{\(]ECHO_MSG[\}\)])[ \t]+("(\\'|\\"|[^"])*"|'(\\'|\\"|[^"])*')[ \t]*[;\n]//;
print "OK: checking direct use of full pathnames in $file.\n"
if ($verbose);
- foreach $s (split(/\n+/, $str)) {
+ foreach my $s (split(/\n+/, $str)) {
$i = '';
if ($s =~ /(^|[ \t\@'"-])(\/[\w\d])/) {
# suspected pathnames are recorded.
@@ -1426,7 +1521,7 @@ sub abspathname {
$i =~ s/['"].*$//;
$i = substr($i, 0, 20) . '...' if (20 < length($i));
&perror("WARN: possible use of absolute pathname ".
- "\"$i\", in $file.");
+ "\"$i\", in $file.") unless ($i =~ m,^/compat/,);
}
}
@@ -1437,7 +1532,7 @@ $portsdir \${PORTSDIR} instead
$localbase \${PREFIX} or \${LOCALBASE}, as appropriate
/usr/X11 \${PREFIX} or \${X11BASE}, as appropriate
EOF
- foreach $i (keys %cmdnames) {
+ foreach my $i (keys %cmdnames) {
if ($str =~ /$i/) {
&perror("WARN: possible direct use of \"$&\" ".
"found in $file. if so, use $cmdnames{$i}.");
@@ -1453,7 +1548,7 @@ scripts \${SCRIPTDIR} instead
patches \${PATCHDIR} instead
work \${WRKDIR} instead
EOF
- foreach $i (keys %cmdnames) {
+ foreach my $i (keys %cmdnames) {
if ($str =~ /(\.\/|\$[\{\(]\.CURDIR[\}\)]\/|[ \t])(\b$i)\//) {
&perror("WARN: possible direct use of \"$i\" ".
"found in $file. if so, use $cmdnames{$i}.");
@@ -1462,9 +1557,9 @@ EOF
}
sub is_predefined {
- local($url) = @_;
- local($site);
- local($subdir);
+ my($url) = @_;
+ my($site);
+ my($subdir);
if ($site = (grep($url =~ $_, keys %predefined))[0]) {
$url =~ /$site/;
$subdir = $';