Documentation: add lint-fsck-msgids

During the initial development of the fsck-msgids.txt feature, it
has become apparent that it is very much error prone to make sure
the description in the documentation file are sorted and correctly
match what is in the fsck.h header file.

Add a quick-and-dirty Perl script and doc-lint target to sanity
check that the fsck-msgids.txt is consistent with the error type
list in the fsck.h header file.

Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Junio C Hamano 2022-10-25 15:42:24 -07:00
parent f6534dbda4
commit 3882a0d3ad
2 changed files with 81 additions and 0 deletions

View file

@ -476,8 +476,19 @@ $(LINT_DOCS_MAN_SECTION_ORDER): .build/lint-docs/man-section-order/%.ok: %.txt
.PHONY: lint-docs-man-section-order
lint-docs-man-section-order: $(LINT_DOCS_MAN_SECTION_ORDER)
.PHONY: lint-docs-fsck-msgids
LINT_DOCS_FSCK_MSGIDS = .build/lint-docs/fsck-msgids.ok
$(LINT_DOCS_FSCK_MSGIDS): lint-fsck-msgids.perl
$(LINT_DOCS_FSCK_MSGIDS): ../fsck.h fsck-msgids.txt
$(call mkdir_p_parent_template)
$(QUIET_GEN)$(PERL_PATH) lint-fsck-msgids.perl \
../fsck.h fsck-msgids.txt $@
lint-docs-fsck-msgids: $(LINT_DOCS_FSCK_MSGIDS)
## Lint: list of targets above
.PHONY: lint-docs
lint-docs: lint-docs-fsck-msgids
lint-docs: lint-docs-gitlink
lint-docs: lint-docs-man-end-blurb
lint-docs: lint-docs-man-section-order

View file

@ -0,0 +1,70 @@
#!/usr/bin/perl
my ($fsck_h, $fsck_msgids_txt, $okfile) = @ARGV;
my (%in_fsck_h, $fh, $bad);
open($fh, "<", "$fsck_h") or die;
while (<$fh>) {
if (/^\s+FUNC\(([0-9A-Z_]+), ([A-Z]+)\)/) {
my ($name, $severity) = ($1, $2);
my ($first) = 1;
$name = join('',
map {
y/A-Z/a-z/;
if (!$first) {
s/^(.)/uc($1)/e;
} else {
$first = 0;
}
$_;
}
split(/_/, $name));
$in_fsck_h{$name} = $severity;
}
}
close($fh);
open($fh, "<", "$fsck_msgids_txt") or die;
my ($previous, $current);
while (<$fh>) {
if (!defined $current) {
if (/^\`([a-zA-Z0-9]*)\`::/) {
$current = $1;
if ((defined $previous) &&
($current le $previous)) {
print STDERR "$previous >= $current in doc\n";
$bad = 1;
}
}
} elsif (/^\s+\(([A-Z]+)\) /) {
my ($level) = $1;
if (!exists $in_fsck_h{$current}) {
print STDERR "$current does not exist in fsck.h\n";
$bad = 1;
} elsif ($in_fsck_h{$current} eq "") {
print STDERR "$current defined twice\n";
$bad = 1;
} elsif ($in_fsck_h{$current} ne $level) {
print STDERR "$current severity $level != $in_fsck_h{$current}\n";
$bad = 1;
}
$previous = $current;
$in_fsck_h{$current} = ""; # mark as seen.
undef $current;
}
}
close($fh);
for my $key (keys %in_fsck_h) {
if ($in_fsck_h{$key} ne "") {
print STDERR "$key not explained in doc.\n";
$bad = 1;
}
}
die if ($bad);
open($fh, ">", "$okfile");
print $fh "good\n";
close($fh);