summaryrefslogtreecommitdiff
path: root/pkgtools/pkglint/files/pkglint.pl
diff options
context:
space:
mode:
Diffstat (limited to 'pkgtools/pkglint/files/pkglint.pl')
-rw-r--r--pkgtools/pkglint/files/pkglint.pl73
1 files changed, 40 insertions, 33 deletions
diff --git a/pkgtools/pkglint/files/pkglint.pl b/pkgtools/pkglint/files/pkglint.pl
index 2b197419b51..5ab66dd9b61 100644
--- a/pkgtools/pkglint/files/pkglint.pl
+++ b/pkgtools/pkglint/files/pkglint.pl
@@ -11,7 +11,7 @@
# Freely redistributable. Absolutely no warranty.
#
# From Id: portlint.pl,v 1.64 1998/02/28 02:34:05 itojun Exp
-# $NetBSD: pkglint.pl,v 1.159 2005/05/20 01:36:46 rillig Exp $
+# $NetBSD: pkglint.pl,v 1.160 2005/05/21 12:29:02 rillig Exp $
#
# This version contains lots of changes necessary for NetBSD packages
# done by Hubert Feyrer <hubertf@netbsd.org>,
@@ -220,20 +220,26 @@ BEGIN {
use vars qw(@ISA @EXPORT_OK);
@ISA = qw(Exporter);
@EXPORT_OK = qw(load_file);
+
+ import PkgLint::Util qw(false true);
}
sub load_file($) {
my ($fname) = @_;
- my ($result, $line, $lineno);
+ my ($result, $line, $lineno, $seen_newline);
$result = [];
open(F, "< $fname") or return undef;
$lineno = 0;
+ $seen_newline = true;
while (defined($line = <F>)) {
$lineno++;
- $line =~ s/\r*\n*\z//;
+ $seen_newline = ($line =~ s/\n$//);
push(@$result, PkgLint::FileUtil::Line->new($fname, $lineno, $line));
}
+ if (!$seen_newline) {
+ $result->[-1]->log_error("File must end with a newline.");
+ }
close(F) or return undef;
return $result;
}
@@ -353,10 +359,9 @@ sub checkfile_Makefile($);
sub checkfile_MESSAGE($);
sub checkfile_patches_patch($);
sub checkfile_PLIST($);
+sub checkfile_other($);
sub checkperms($);
-sub checkpathname($);
-sub checklastline($);
sub readmakefile($);
sub checkextra($$);
sub checkorder($$@);
@@ -641,7 +646,7 @@ sub check_package() {
next if (defined $checker{$extra});
push(@checker, $extra);
- $checker{$extra} = \&checkpathname;
+ $checker{$extra} = \&checkfile_other;
}
}
@@ -651,10 +656,6 @@ sub check_package() {
log_error("$opt_packagedir/$i", NO_LINE_NUMBER, "file not found");
} else {
$checker{$i}->($i) || log_warning($i, NO_LINE_NUMBER, "cannot open");
- if ($i !~ /patches\/patch/) {
- &checklastline($i) ||
- log_warning($i, NO_LINE_NUMBER, "cannot open");
- }
}
log_info($i, NO_LINE_NUMBER, "finished checks ...");
}
@@ -736,6 +737,20 @@ sub checkline_trailing_whitespace($) {
return true;
}
+sub checklines_trailing_empty_lines($) {
+ my ($lines) = @_;
+ my ($last, $max);
+
+ $max = $#{$lines} + 1;
+ for ($last = $max; $last > 1 && $lines->[$last - 1]->text eq ""; ) {
+ $last--;
+ }
+ if ($last != $max) {
+ $lines->[$last]->log_warning("Trailing empty lines.");
+ }
+ return true;
+}
+
#
# Specific subroutines
#
@@ -756,6 +771,7 @@ sub checkfile_DESCR($) {
checkline_trailing_whitespace($line);
checkline_valid_characters($line, $regex_validchars);
}
+ checklines_trailing_empty_lines($descr);
if (scalar(@$descr) > $maxlines) {
log_warning($fname, NO_LINE_NUMBER, "File too long (should be no more than $maxlines lines).");
@@ -776,7 +792,7 @@ sub checkfile_distinfo($) {
}
if (scalar(@$distinfo) == 0) {
- log_error($fname, NO_LINE_NUMBER, "May not be empty.");
+ log_error($fname, NO_LINE_NUMBER, "Must not be empty.");
return true;
}
@@ -805,6 +821,7 @@ sub checkfile_distinfo($) {
$in_distinfo{$patch} = true;
}
}
+ checklines_trailing_empty_lines($distinfo);
foreach my $patch (<$opt_packagedir/$patchdir/patch-*>) {
$patch = basename($patch);
@@ -844,6 +861,7 @@ sub checkfile_MESSAGE($) {
if ($message->[-1]->text ne "=" x 75) {
$message->[-1]->log_warning("expected a line of exactly 75 \"=\" characters.");
}
+ checklines_trailing_empty_lines($message);
return true;
}
@@ -948,6 +966,7 @@ sub checkfile_PLIST($) {
$line->log_info("seen installation to share/doc.");
}
}
+ checklines_trailing_empty_lines($plist);
if (!$rcsid_seen) {
log_error($fname, NO_LINE_NUMBER, "Expected a \@comment \"\$$conf_rcsidstr\$\" line.");
@@ -967,33 +986,18 @@ sub checkperms($) {
#
# misc files
#
-sub checkpathname($) {
+sub checkfile_other($) {
my ($file) = @_;
my ($fname) = ("$opt_packagedir/$file");
- my ($whole);
-
- checkperms($fname);
-}
+ my ($lines);
-sub checklastline($) {
- my ($file) = @_;
- my ($fname) = ("$opt_packagedir/$file");
- my ($whole);
-
- if (!open(IN, "< $fname")) {
- log_error($fname, NO_LINE_NUMBER, "could not open: $!");
+ $lines = load_file($fname);
+ if (!$lines) {
+ log_error($fname, NO_LINE_NUMBER, "Could not be read.");
return false;
}
- { local $/; $whole = <IN>; }
- close(IN);
-
- if ($whole eq "") {
- log_error($fname, NO_LINE_NUMBER, "file is empty.");
- } elsif ($whole !~ /\n$/) {
- log_error($fname, NO_LINE_NUMBER, "newline expected at end of file.");
- } elsif ($whole =~ /\r*\n(?:[ \t]*\r*\n)+$/) {
- log_warning($fname, NO_LINE_NUMBER, "perhaps unnecessary blank lines at end of file.");
- }
+ checklines_trailing_empty_lines($lines);
+ checkperms($fname);
return true;
}
@@ -1071,6 +1075,7 @@ sub checkfile_patches_patch($) {
$line->log_warning("Possible RCS tag \"\$$1\$\". Use binary mode (-ko) on cvs add/import.");
}
}
+ checklines_trailing_empty_lines($lines);
check_for_multiple_patches($lines);
return true;
@@ -1129,6 +1134,7 @@ sub readmakefile($) {
$contents .= $line->text . "\n";
}
}
+ checklines_trailing_empty_lines($lines);
return $contents;
}
@@ -2121,6 +2127,7 @@ sub category_check() {
if (!$comment_seen) {
log_error($fname, NO_LINE_NUMBER, "no COMMENT line found.");
}
+ checklines_trailing_empty_lines($lines);
return true;
}