blob: 1c61dd9512b9e3db1768416ede49686020d38662 [file] [log] [blame]
Junio C Hamanoab814112016-05-04 14:34:23 -07001#!/usr/bin/perl
2
Ævar Arnfjörð Bjarmason3951eeb2021-04-09 17:02:46 +02003use strict;
4use warnings;
Junio C Hamanoab814112016-05-04 14:34:23 -07005
Ævar Arnfjörð Bjarmasond2c99082021-04-09 17:02:47 +02006# Parse arguments, a simple state machine for input like:
7#
Ævar Arnfjörð Bjarmason8650c622021-10-15 14:39:14 +02008# <file-to-check.txt> <valid-files-to-link-to> --section=1 git.txt git-add.txt [...] --to-lint git-add.txt a-file.txt [...]
Ævar Arnfjörð Bjarmasond2c99082021-04-09 17:02:47 +02009my %TXT;
10my %SECTION;
11my $section;
12my $lint_these = 0;
Ævar Arnfjörð Bjarmason8650c622021-10-15 14:39:14 +020013my $to_check = shift @ARGV;
Ævar Arnfjörð Bjarmasond2c99082021-04-09 17:02:47 +020014for my $arg (@ARGV) {
15 if (my ($sec) = $arg =~ /^--section=(\d+)$/s) {
16 $section = $sec;
17 next;
18 }
Junio C Hamanoab814112016-05-04 14:34:23 -070019
Ævar Arnfjörð Bjarmasond2c99082021-04-09 17:02:47 +020020 my ($name) = $arg =~ /^(.*?)\.txt$/s;
21 unless (defined $section) {
22 $TXT{$name} = $arg;
23 next;
24 }
Junio C Hamanoab814112016-05-04 14:34:23 -070025
Ævar Arnfjörð Bjarmasond2c99082021-04-09 17:02:47 +020026 $SECTION{$name} = $section;
27}
28
29my $exit_code = 0;
Junio C Hamanoab814112016-05-04 14:34:23 -070030sub report {
Ævar Arnfjörð Bjarmasond2c99082021-04-09 17:02:47 +020031 my ($pos, $line, $target, $msg) = @_;
32 substr($line, $pos) = "' <-- HERE";
33 $line =~ s/^\s+//;
Ævar Arnfjörð Bjarmasonf0055932021-10-15 14:39:12 +020034 print STDERR "$ARGV:$.: error: $target: $msg, shown with 'HERE' below:\n";
35 print STDERR "$ARGV:$.:\t'$line\n";
Ævar Arnfjörð Bjarmasond2c99082021-04-09 17:02:47 +020036 $exit_code = 1;
Junio C Hamanoab814112016-05-04 14:34:23 -070037}
38
Ævar Arnfjörð Bjarmasond2c99082021-04-09 17:02:47 +020039@ARGV = sort values %TXT;
Ævar Arnfjörð Bjarmason8650c622021-10-15 14:39:14 +020040die "BUG: No list of valid linkgit:* files given" unless @ARGV;
41@ARGV = $to_check;
Ævar Arnfjörð Bjarmasond2c99082021-04-09 17:02:47 +020042while (<>) {
43 my $line = $_;
44 while ($line =~ m/linkgit:((.*?)\[(\d)\])/g) {
45 my $pos = pos $line;
46 my ($target, $page, $section) = ($1, $2, $3);
Junio C Hamanoab814112016-05-04 14:34:23 -070047
Ævar Arnfjörð Bjarmasond2c99082021-04-09 17:02:47 +020048 # De-AsciiDoc
49 $page =~ s/{litdd}/--/g;
Junio C Hamanoab814112016-05-04 14:34:23 -070050
Ævar Arnfjörð Bjarmasond2c99082021-04-09 17:02:47 +020051 if (!exists $TXT{$page}) {
52 report($pos, $line, $target, "link outside of our own docs");
53 next;
54 }
55 if (!exists $SECTION{$page}) {
56 report($pos, $line, $target, "link outside of our sectioned docs");
57 next;
58 }
59 my $real_section = $SECTION{$page};
60 if ($section != $SECTION{$page}) {
61 report($pos, $line, $target, "wrong section (should be $real_section)");
62 next;
Junio C Hamanoab814112016-05-04 14:34:23 -070063 }
64 }
Ævar Arnfjörð Bjarmasond2c99082021-04-09 17:02:47 +020065 # this resets our $. for each file
66 close ARGV if eof;
Junio C Hamanoab814112016-05-04 14:34:23 -070067}
68
Ævar Arnfjörð Bjarmasond2c99082021-04-09 17:02:47 +020069exit $exit_code;