The second batch
[git] / Documentation / lint-gitlink.perl
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 # Parse arguments, a simple state machine for input like:
7 #
8 # howto/*.txt config/*.txt --section=1 git.txt git-add.txt [...] --to-lint git-add.txt a-file.txt [...]
9 my %TXT;
10 my %SECTION;
11 my $section;
12 my $lint_these = 0;
13 for my $arg (@ARGV) {
14         if (my ($sec) = $arg =~ /^--section=(\d+)$/s) {
15                 $section = $sec;
16                 next;
17         }
18
19         my ($name) = $arg =~ /^(.*?)\.txt$/s;
20         unless (defined $section) {
21                 $TXT{$name} = $arg;
22                 next;
23         }
24
25         $SECTION{$name} = $section;
26 }
27
28 my $exit_code = 0;
29 sub report {
30         my ($pos, $line, $target, $msg) = @_;
31         substr($line, $pos) = "' <-- HERE";
32         $line =~ s/^\s+//;
33         print "$ARGV:$.: error: $target: $msg, shown with 'HERE' below:\n";
34         print "$ARGV:$.:\t'$line\n";
35         $exit_code = 1;
36 }
37
38 @ARGV = sort values %TXT;
39 die "BUG: Nothing to process!" unless @ARGV;
40 while (<>) {
41         my $line = $_;
42         while ($line =~ m/linkgit:((.*?)\[(\d)\])/g) {
43                 my $pos = pos $line;
44                 my ($target, $page, $section) = ($1, $2, $3);
45
46                 # De-AsciiDoc
47                 $page =~ s/{litdd}/--/g;
48
49                 if (!exists $TXT{$page}) {
50                         report($pos, $line, $target, "link outside of our own docs");
51                         next;
52                 }
53                 if (!exists $SECTION{$page}) {
54                         report($pos, $line, $target, "link outside of our sectioned docs");
55                         next;
56                 }
57                 my $real_section = $SECTION{$page};
58                 if ($section != $SECTION{$page}) {
59                         report($pos, $line, $target, "wrong section (should be $real_section)");
60                         next;
61                 }
62         }
63         # this resets our $. for each file
64         close ARGV if eof;
65 }
66
67 exit $exit_code;