On Wed, 2020-06-03 at 16:19 -0700, Kees Cook wrote: > My codespell dictionary has a lot of capitalized words. For example: > > MSDOS->MS-DOS > > Since checkpatch uses case-insensitive matching, I get an undefined > variable warning and then empty suggestions for things like this: > > Use of uninitialized value $typo_fix in concatenation (.) or string at > ./scripts/checkpatch.pl line 2958. > > WARNING: 'msdos' may be misspelled - perhaps ''? > + struct msdos_dir_entry *de; > > This fixes the matcher to avoid the warning, but it's still a rather > silly suggestion: > > WARNING: 'msdos' may be misspelled - perhaps 'MS-DOS'? > + struct msdos_dir_entry *de; > > So I'm not really sure what to do with this ... filter out bad > suggestions instead?
Hey Kees. Maybe this? btw: My codespell dictionary file moved to /usr/lib/python3/dist-packages/codespell_lib/data/dictionary.txt and I had to use --codespell --codespellfile=(above) so maybe there should be multiple lookups for this file like the array below. Are there other standard codespell dictionary locations? --- scripts/checkpatch.pl | 31 ++++++++++++++++++++++++++----- 1 file changed, 26 insertions(+), 5 deletions(-) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 5f00df2c3f59..52aa0dd53d80 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -59,7 +59,7 @@ my $minimum_perl_version = 5.10.0; my $min_conf_desc_length = 4; my $spelling_file = "$D/spelling.txt"; my $codespell = 0; -my $codespellfile = "/usr/share/codespell/dictionary.txt"; +my $codespellfile; my $conststructsfile = "$D/const_structs.checkpatch"; my $typedefsfile = ""; my $color = "auto"; @@ -716,7 +716,20 @@ if (open(my $spelling, '<', $spelling_file)) { } if ($codespell) { - if (open(my $spelling, '<', $codespellfile)) { + if (!defined($codespellfile)) { + my @csfiles = ("/usr/share/codespell/dictionary.txt", + "/usr/lib/python3/dist-packages/codespell_lib/data/dictionary.txt"); + foreach my $csfile (@csfiles) { + if (-f $csfile) { + $codespellfile = $csfile; + last; + } + } + } + + if (!defined($codespellfile)) { + warn "No codespell typos will be found - codespell dictionary not found\n"; + } elsif (open(my $spelling, '<', $codespellfile)) { while (<$spelling>) { my $line = $_; @@ -2963,13 +2976,21 @@ sub process { while ($rawline =~ /(?:^|[^a-z@])($misspellings)(?:\b|$|[^a-z@])/gi) { my $typo = $1; my $typo_fix = $spelling_fix{lc($typo)}; - $typo_fix = ucfirst($typo_fix) if ($typo =~ /^[A-Z]/); - $typo_fix = uc($typo_fix) if ($typo =~ /^[A-Z]+$/); + $typo_fix = $spelling_fix{$typo} if (!defined($typo_fix)); + $typo_fix = $spelling_fix{uc($typo)} if (!defined($typo_fix)); + $typo_fix = 'unknown typo fix' if (!defined($typo_fix)); + if ($typo =~ /^[A-Z]+$/) { + $typo_fix = uc($typo_fix); + } elsif ($typo =~ /^[A-Z]/) { + $typo_fix = ucfirst($typo_fix); + } + my $msg_level = \&WARN; $msg_level = \&CHK if ($file); if (&{$msg_level}("TYPO_SPELLING", "'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $herecurr) && - $fix) { + $fix && + $typo_fix ne 'unknown typo fix') { $fixed[$fixlinenr] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/; } }