Documentation / lint-gitlink.perlon commit Documentation/git-status: clarify status table for porcelain mode (e4e5da2)
   1#!/usr/bin/perl
   2
   3use File::Find;
   4use Getopt::Long;
   5
   6my $basedir = ".";
   7GetOptions("basedir=s" => \$basedir)
   8        or die("Cannot parse command line arguments\n");
   9
  10my $found_errors = 0;
  11
  12sub report {
  13        my ($where, $what, $error) = @_;
  14        print "$where: $error: $what\n";
  15        $found_errors = 1;
  16}
  17
  18sub grab_section {
  19        my ($page) = @_;
  20        open my $fh, "<", "$basedir/$page.txt";
  21        my $firstline = <$fh>;
  22        chomp $firstline;
  23        close $fh;
  24        my ($section) = ($firstline =~ /.*\((\d)\)$/);
  25        return $section;
  26}
  27
  28sub lint {
  29        my ($file) = @_;
  30        open my $fh, "<", $file
  31                or return;
  32        while (<$fh>) {
  33                my $where = "$file:$.";
  34                while (s/linkgit:((.*?)\[(\d)\])//) {
  35                        my ($target, $page, $section) = ($1, $2, $3);
  36
  37                        # De-AsciiDoc
  38                        $page =~ s/{litdd}/--/g;
  39
  40                        if ($page !~ /^git/) {
  41                                report($where, $target, "nongit link");
  42                                next;
  43                        }
  44                        if (! -f "$basedir/$page.txt") {
  45                                report($where, $target, "no such source");
  46                                next;
  47                        }
  48                        $real_section = grab_section($page);
  49                        if ($real_section != $section) {
  50                                report($where, $target,
  51                                        "wrong section (should be $real_section)");
  52                                next;
  53                        }
  54                }
  55        }
  56        close $fh;
  57}
  58
  59sub lint_it {
  60        lint($File::Find::name) if -f && /\.txt$/;
  61}
  62
  63if (!@ARGV) {
  64        find({ wanted => \&lint_it, no_chdir => 1 }, $basedir);
  65} else {
  66        for (@ARGV) {
  67                lint($_);
  68        }
  69}
  70
  71exit $found_errors;