Re: [PATCH v2 0/2] Document fsck msg ids
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Oct 25, 2022, 04:40 UTC
- Message-ID
- <xmqqfsfcplcm.fsf@gitster.g>
- In-Reply-To
- <xmqqwn8oplsh.fsf@gitster.g>
Junio C Hamano <gitster@pobox.com> writes:
> Thanks. I did a bit of sanity checking and it made my earlier > suspicion stronger. We MUST have at least an automated checker to > check the doc against the fsck.h header, if not an automated > generator of the doc from the fsck.h header.
FYI, here are a pair of quick-and-dirty Perl scripts that I used for the sanity checking. The first one "parses" the fsck-msgs.txt and formats lines like
badTagName INFO
i.e. camelCased error message name, a TAB, and the severity.
The second one reads the FOREACH_FSCK_MSG_ID() definition in fsck.h that look like "FUNC(BAD_TAG_NAME, INFO)", camelcases the name and shows what can be compared with the output of the first one.
There are two sanity checks that must pass when a developer updates the documentation.
- The output from m.perl on the documentation must already be sorted.
- The output from n.perl on fsck.h, when sorted, must match the output from m.perl on the documentation.
$ cat >m.perl <<\EOF #!/usr/bin/perl
my ($previous, $current);
while (<>) {
if (!defined $current) {
if (/^\`([a-zA-Z0-9]*)\`::/) {
$current = $1;
if ((defined $previous) &&
($current le $previous)) {
print STDERR "$previous >= $current???\n";
}
}
} elsif (/^\s+\(([A-Z]+)\) /) {
print "$current $1\n";
$previous = $current;
undef $current;
}
}
EOF
$ cat >n.perl <<\EOF
#!/usr/bin/perlwhile (<>) {
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));
print "$name $severity\n";
}
}
EOF
$ perl m.perl Documentation/fsck-msgids.txt >/var/tmp/1
$ sort /var/tmp/1 >/var/tmp/2
$ diff -u /var/tmp/1 /var/tmp/2
#### no output should appear in the above comparison
$ perl n.perl fsck.h | sort >/var/tmp/2
$ diff -u /var/tmp/1 /var/tmp/2
#### no output should appear in the above comparison