Junio C Hamano | ab81411 | 2016-05-04 14:34:23 -0700 | [diff] [blame] | 1 | #!/usr/bin/perl |
| 2 | |
| 3 | use File::Find; |
| 4 | use Getopt::Long; |
| 5 | |
| 6 | my $basedir = "."; |
| 7 | GetOptions("basedir=s" => \$basedir) |
| 8 | or die("Cannot parse command line arguments\n"); |
| 9 | |
| 10 | my $found_errors = 0; |
| 11 | |
| 12 | sub report { |
| 13 | my ($where, $what, $error) = @_; |
| 14 | print "$where: $error: $what\n"; |
| 15 | $found_errors = 1; |
| 16 | } |
| 17 | |
| 18 | sub 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 | |
| 28 | sub 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 | |
| 59 | sub lint_it { |
| 60 | lint($File::Find::name) if -f && /\.txt$/; |
| 61 | } |
| 62 | |
| 63 | if (!@ARGV) { |
| 64 | find({ wanted => \&lint_it, no_chdir => 1 }, $basedir); |
| 65 | } else { |
| 66 | for (@ARGV) { |
| 67 | lint($_); |
| 68 | } |
| 69 | } |
| 70 | |
| 71 | exit $found_errors; |