| #!/usr/bin/perl |
| |
| use File::Find; |
| use Getopt::Long; |
| |
| my $basedir = "."; |
| GetOptions("basedir=s" => \$basedir) |
| or die("Cannot parse command line arguments\n"); |
| |
| my $found_errors = 0; |
| |
| sub report { |
| my ($where, $what, $error) = @_; |
| print "$where: $error: $what\n"; |
| $found_errors = 1; |
| } |
| |
| sub grab_section { |
| my ($page) = @_; |
| open my $fh, "<", "$basedir/$page.txt"; |
| my $firstline = <$fh>; |
| chomp $firstline; |
| close $fh; |
| my ($section) = ($firstline =~ /.*\((\d)\)$/); |
| return $section; |
| } |
| |
| sub lint { |
| my ($file) = @_; |
| open my $fh, "<", $file |
| or return; |
| while (<$fh>) { |
| my $where = "$file:$."; |
| while (s/linkgit:((.*?)\[(\d)\])//) { |
| my ($target, $page, $section) = ($1, $2, $3); |
| |
| # De-AsciiDoc |
| $page =~ s/{litdd}/--/g; |
| |
| if ($page !~ /^git/) { |
| report($where, $target, "nongit link"); |
| next; |
| } |
| if (! -f "$basedir/$page.txt") { |
| report($where, $target, "no such source"); |
| next; |
| } |
| $real_section = grab_section($page); |
| if ($real_section != $section) { |
| report($where, $target, |
| "wrong section (should be $real_section)"); |
| next; |
| } |
| } |
| } |
| close $fh; |
| } |
| |
| sub lint_it { |
| lint($File::Find::name) if -f && /\.txt$/; |
| } |
| |
| if (!@ARGV) { |
| find({ wanted => \&lint_it, no_chdir => 1 }, $basedir); |
| } else { |
| for (@ARGV) { |
| lint($_); |
| } |
| } |
| |
| exit $found_errors; |