Merge branch 'rs/checkout-some-states-are-const' into maint
[git] / Documentation / lint-gitlink.perl
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;