You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.4 KiB
67 lines
1.4 KiB
#!/usr/bin/perl |
|
|
|
use strict; |
|
use warnings; |
|
|
|
# Parse arguments, a simple state machine for input like: |
|
# |
|
# howto/*.txt config/*.txt --section=1 git.txt git-add.txt [...] --to-lint git-add.txt a-file.txt [...] |
|
my %TXT; |
|
my %SECTION; |
|
my $section; |
|
my $lint_these = 0; |
|
for my $arg (@ARGV) { |
|
if (my ($sec) = $arg =~ /^--section=(\d+)$/s) { |
|
$section = $sec; |
|
next; |
|
} |
|
|
|
my ($name) = $arg =~ /^(.*?)\.txt$/s; |
|
unless (defined $section) { |
|
$TXT{$name} = $arg; |
|
next; |
|
} |
|
|
|
$SECTION{$name} = $section; |
|
} |
|
|
|
my $exit_code = 0; |
|
sub report { |
|
my ($pos, $line, $target, $msg) = @_; |
|
substr($line, $pos) = "' <-- HERE"; |
|
$line =~ s/^\s+//; |
|
print "$ARGV:$.: error: $target: $msg, shown with 'HERE' below:\n"; |
|
print "$ARGV:$.:\t'$line\n"; |
|
$exit_code = 1; |
|
} |
|
|
|
@ARGV = sort values %TXT; |
|
die "BUG: Nothing to process!" unless @ARGV; |
|
while (<>) { |
|
my $line = $_; |
|
while ($line =~ m/linkgit:((.*?)\[(\d)\])/g) { |
|
my $pos = pos $line; |
|
my ($target, $page, $section) = ($1, $2, $3); |
|
|
|
# De-AsciiDoc |
|
$page =~ s/{litdd}/--/g; |
|
|
|
if (!exists $TXT{$page}) { |
|
report($pos, $line, $target, "link outside of our own docs"); |
|
next; |
|
} |
|
if (!exists $SECTION{$page}) { |
|
report($pos, $line, $target, "link outside of our sectioned docs"); |
|
next; |
|
} |
|
my $real_section = $SECTION{$page}; |
|
if ($section != $SECTION{$page}) { |
|
report($pos, $line, $target, "wrong section (should be $real_section)"); |
|
next; |
|
} |
|
} |
|
# this resets our $. for each file |
|
close ARGV if eof; |
|
} |
|
|
|
exit $exit_code;
|
|
|