@ -7,9 +7,12 @@
use strict ;
use POSIX ;
use File::Basename ;
use Cwd 'abs_path' ;
my $ P = $ 0 ;
$ P =~ s@.*/@@g ;
my $ D = dirname ( abs_path ( $ P ) ) ;
my $ V = '0.32' ;
@ -42,6 +45,9 @@ my $configuration_file = ".checkpatch.conf";
my $ max_line_length = 80 ;
my $ ignore_perl_version = 0 ;
my $ minimum_perl_version = 5.10 .0 ;
my $ spelling_file = "$D/spelling.txt" ;
my $ codespell = 0 ;
my $ codespellfile = "/usr/share/codespell/dictionary.txt" ;
sub help {
my ( $ exitcode ) = @ _ ;
@ -82,6 +88,9 @@ Options:
file . It 's your fault if there' s no backup or git
- - ignore - perl - version override checking of perl version . expect
runtime errors .
- - codespell Use the codespell dictionary for spelling / typos
( default: /usr/ local /share/co despell / dictionary . txt )
- - codespellfile Use this codespell dictionary
- h , - - help , - - version display this help and exit
When FILE is - read standard input .
@ -139,6 +148,8 @@ GetOptions(
'ignore-perl-version!' = > \ $ ignore_perl_version ,
'debug=s' = > \ % debug ,
'test-only=s' = > \ $ tst_only ,
'codespell!' = > \ $ codespell ,
'codespellfile=s' = > \ $ codespellfile ,
'h|help' = > \ $ help ,
'version' = > \ $ help
) or help ( 1 ) ;
@ -387,6 +398,56 @@ our $allowed_asm_includes = qr{(?x:
) } ;
# memory.h: ARM has a custom one
# Load common spelling mistakes and build regular expression list.
my $ misspellings ;
my % spelling_fix ;
if ( open ( my $ spelling , '<' , $ spelling_file ) ) {
while ( <$spelling> ) {
my $ line = $ _ ;
$ line =~ s/\s*\n?$//g ;
$ line =~ s/^\s*//g ;
next if ( $ line =~ m/^\s*#/ ) ;
next if ( $ line =~ m/^\s*$/ ) ;
my ( $ suspect , $ fix ) = split ( /\|\|/ , $ line ) ;
$ spelling_fix { $ suspect } = $ fix ;
}
close ( $ spelling ) ;
} else {
warn "No typos will be found - file '$spelling_file': $!\n" ;
}
if ( $ codespell ) {
if ( open ( my $ spelling , '<' , $ codespellfile ) ) {
while ( <$spelling> ) {
my $ line = $ _ ;
$ line =~ s/\s*\n?$//g ;
$ line =~ s/^\s*//g ;
next if ( $ line =~ m/^\s*#/ ) ;
next if ( $ line =~ m/^\s*$/ ) ;
next if ( $ line =~ m/, disabled/i ) ;
$ line =~ s/,.*$// ;
my ( $ suspect , $ fix ) = split ( /->/ , $ line ) ;
$ spelling_fix { $ suspect } = $ fix ;
}
close ( $ spelling ) ;
} else {
warn "No codespell typos will be found - file '$codespellfile': $!\n" ;
}
}
$ misspellings = join ( "|" , sort keys % spelling_fix ) if keys % spelling_fix ;
sub build_types {
my $ mods = "(?x: \n" . join ( "|\n " , @ modifierList ) . "\n)" ;
my $ all = "(?x: \n" . join ( "|\n " , @ typeList ) . "\n)" ;
@ -528,6 +589,8 @@ my @rawlines = ();
my @ lines = ( ) ;
my @ fixed = ( ) ;
my $ vname ;
my $ fixlinenr = - 1 ;
for my $ filename ( @ ARGV ) {
my $ FILE ;
if ( $ file ) {
@ -1950,6 +2013,24 @@ sub process {
"8-bit UTF-8 used in possible commit log\n" . $ herecurr ) ;
}
# Check for various typo / spelling mistakes
if ( defined ( $ misspellings ) &&
( $ in_commit_log || $ line =~ /^(?:\+|Subject:)/i ) ) {
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]+$/ ) ;
my $ msg_type = \ & WARN ;
$ msg_type = \ & CHK if ( $ file ) ;
if ( & { $ msg_type } ( "TYPO_SPELLING" ,
"'$typo' may be misspelled - perhaps '$typo_fix'?\n" . $ herecurr ) &&
$ fix ) {
$ fixed [ $ fixlinenr ] =~ s/(^|[^A-Za-z@])($typo)($|[^A-Za-z@])/$1$typo_fix$3/ ;
}
}
}
# ignore non-hunk lines and lines being removed
next if ( ! $ hunk_line || $ line =~ /^-/ ) ;