Blame test/htest-man.pl

Packit e4b6da
#!/usr/bin/perl
Packit e4b6da
Packit e4b6da
# Heuristic tests (necessary conditions) for a man page to be good.
Packit e4b6da
#
Packit e4b6da
# This script checks for:
Packit e4b6da
# 1. the file ends in a newline 
Packit e4b6da
#    (detects some cases where a man-page got cut off from a processing error)
Packit e4b6da
# 2. no consecutive blank lines except in verbatim environments
Packit e4b6da
# 3. whitespace is collapsed except in verbatim environments
Packit e4b6da
#
Packit e4b6da
# Synopsis:
Packit e4b6da
#  htest-man.pl [man-page files...]
Packit e4b6da
#
Packit e4b6da
# Potential errors in the given files will be logged to standard output.
Packit e4b6da
# The return status will be non-zero whenever they occur.
Packit e4b6da
Packit e4b6da
use strict;
Packit e4b6da
Packit e4b6da
unshift(@ARGV, '-') unless @ARGV;
Packit e4b6da
Packit e4b6da
my $has_error = 0;
Packit e4b6da
Packit e4b6da
foreach my $ARGV (@ARGV) {
Packit e4b6da
Packit e4b6da
  my $has_name = 0;
Packit e4b6da
  my $has_description = 0;
Packit e4b6da
  my $in_verbatim = 0;
Packit e4b6da
  my $last_line_is_blank = 0;
Packit e4b6da
  my $line_num = 0;
Packit e4b6da
  my $newline_exists = 1;
Packit e4b6da
Packit e4b6da
  open(IN, $ARGV);
Packit e4b6da
Packit e4b6da
  while (<IN>) {
Packit e4b6da
    $line_num++;
Packit e4b6da
Packit e4b6da
    if(chomp == 0) {
Packit e4b6da
      print STDERR "$0:$ARGV:${line_num}: no newline at end of file\n";
Packit e4b6da
      $has_error = 1;
Packit e4b6da
    }
Packit e4b6da
Packit e4b6da
    $in_verbatim = 1  if /^.nf\s*$/;
Packit e4b6da
    $in_verbatim = 0  if /^.fi\s*$/;
Packit e4b6da
Packit e4b6da
    # FIXME this doesn't work for non-English-language pages
Packit e4b6da
    $has_name++        if /^.SH\s+NAME$/;
Packit e4b6da
    $has_description++ if /^.SH\s+DESCRIPTION$/;
Packit e4b6da
Packit e4b6da
    unless($in_verbatim) {
Packit e4b6da
      my $line_is_blank = ($_ =~ /^(.PP)?\s*$/);
Packit e4b6da
      if($line_is_blank and $last_line_is_blank) {
Packit e4b6da
        print STDERR "$0:$ARGV:${line_num}: duplicate blank line\n";
Packit e4b6da
        $has_error = 1;
Packit e4b6da
      }
Packit e4b6da
      $last_line_is_blank = $line_is_blank or 
Packit e4b6da
                              ($_ =~ /^(.SH|.SS|.TP)(\s.*)?$/);
Packit e4b6da
    }
Packit e4b6da
Packit e4b6da
    unless($in_verbatim) {
Packit e4b6da
      if(/[ \t]{2,}/) {
Packit e4b6da
        print STDERR "$0:$ARGV:${line_num}: non-collapsed whitespace\n";
Packit e4b6da
        $has_error = 1;
Packit e4b6da
      }
Packit e4b6da
    }
Packit e4b6da
Packit e4b6da
  }
Packit e4b6da
Packit e4b6da
  if($has_name == 0) {
Packit e4b6da
    print STDERR "$0:$ARGV:${line_num}: no NAME section found\n";
Packit e4b6da
    $has_error = 1;
Packit e4b6da
  } elsif($has_name > 1) {
Packit e4b6da
    print STDERR "$0:$ARGV:${line_num}: too many NAME sections found\n";
Packit e4b6da
    $has_error = 1;
Packit e4b6da
  }
Packit e4b6da
  
Packit e4b6da
  if($has_description == 0) {
Packit e4b6da
    print STDERR "$0:$ARGV:${line_num}: no DESCRIPTION section found\n";
Packit e4b6da
    $has_error = 1;
Packit e4b6da
  } elsif($has_description > 1) {
Packit e4b6da
    print STDERR "$0:$ARGV:${line_num}: too many DESCRIPTION sections found\n";
Packit e4b6da
    $has_error = 1;
Packit e4b6da
  }
Packit e4b6da
}
Packit e4b6da
Packit e4b6da
exit $has_error;
Packit e4b6da