On Thu, 2019-07-04 at 11:49 -0700, Joe Perches wrote: > On Thu, 2019-07-04 at 17:40 +0800, Miles Chen wrote: > > This change adds 3 Kconfig default value tests: > [] > > diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl > [] > > @@ -3005,6 +3005,27 @@ sub process { > > "Use of boolean is deprecated, please use bool > > instead.\n" . $herecurr); > > } > > > > +# discourage redundant 'default n' > > + if ($realfile =~ /Kconfig/ && > > + $line =~ /^\+\s*default n$/) { > > + WARN("DEFAULT_VALUE_STYLE", > > + "'default n' is the default value, no need to > > write it explicitly.\n" . $herecurr); > > + } > > + > > +# discourage quote: use default [ynm], not default "[ynm]" > > + if ($realfile =~ /Kconfig/ && > > + $rawline =~ /^\+\s*default\s*"[ynm]"/) { > > + WARN("DEFAULT_VALUE_STYLE", > > + "Use default [ynm] instead of default \"[ynm]\"\n" > > . $herecurr); > > + } > > + > > +# discourage default \!?EXPERT > > + if ($realfile =~ /Kconfig/ && > > + $line =~ /^\+\s*default \!?EXPERT/) { > > + WARN("DEFAULT_VALUE_STYLE", > > + "Avoid default turn on kernel configs by default > > !?EXPERT\n" . $herecurr); > > + } > > + > > I'd prefer to create a block for all the Kconfig file tests and > avoid multiply determining if the filename includes Kconfig so > the script runs a bit faster. >
Thanks for your comments. yes, the script runs faster this way. > Also some trivial changes to the added tests with added --fix > capability. Something like: Thanks for posting the patch, I'll verify it and post as patch v3. > --- > scripts/checkpatch.pl | 139 > ++++++++++++++++++++++++++++++-------------------- > 1 file changed, 85 insertions(+), 54 deletions(-) > > diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl > index 6cb99ec62000..4780149a8d30 100755 > --- a/scripts/checkpatch.pl > +++ b/scripts/checkpatch.pl > @@ -2934,60 +2934,98 @@ sub process { > "Do not include the paragraph about > writing to the Free Software Foundation's mailing address from the sample GPL > notice. The FSF has changed addresses in the past, and may do so again. Linux > already includes a copy of the GPL.\n" . $herevet) > } > > -# check for Kconfig help text having a real description > -# Only applies when adding the entry originally, after that we do not have > -# sufficient context to determine whether it is indeed long enough. > - if ($realfile =~ /Kconfig/ && > - # 'choice' is usually the last thing on the line (though > - # Kconfig supports named choices), so use a word boundary > - # (\b) rather than a whitespace character (\s) > - $line =~ /^\+\s*(?:config|menuconfig|choice)\b/) { > - my $length = 0; > - my $cnt = $realcnt; > - my $ln = $linenr + 1; > - my $f; > - my $is_start = 0; > - my $is_end = 0; > - for (; $cnt > 0 && defined $lines[$ln - 1]; $ln++) { > - $f = $lines[$ln - 1]; > - $cnt-- if ($lines[$ln - 1] !~ /^-/); > - $is_end = $lines[$ln - 1] =~ /^\+/; > - > - next if ($f =~ /^-/); > - last if (!$file && $f =~ /^\@\@/); > - > - if ($lines[$ln - 1] =~ > /^\+\s*(?:bool|tristate|prompt)\s*["']/) { > - $is_start = 1; > - } elsif ($lines[$ln - 1] =~ > /^\+\s*(?:help|---help---)\s*$/) { > - if ($lines[$ln - 1] =~ "---help---") { > - WARN("CONFIG_DESCRIPTION", > - "prefer 'help' over > '---help---' for new help texts\n" . $herecurr); > +# Kconfig tests > + if ($realfile =~ /Kconfig/) { > + # check for Kconfig help text having a real description > + # Only applies when adding the entry originally, after > + # that we do not have sufficient context to determine > + # whether it is indeed long enough. > + # 'choice' is usually the last thing on the line (though > + # Kconfig supports named choices), so use a word > + # boundary (\b) rather than a whitespace character (\s) > + if ($line =~ /^\+\s*(?:config|menuconfig|choice)\b/) { > + my $length = 0; > + my $cnt = $realcnt; > + my $ln = $linenr + 1; > + my $f; > + my $is_start = 0; > + my $is_end = 0; > + for (; $cnt > 0 && defined $lines[$ln - 1]; > $ln++) { > + $f = $lines[$ln - 1]; > + $cnt-- if ($lines[$ln - 1] !~ /^-/); > + $is_end = $lines[$ln - 1] =~ /^\+/; > + > + next if ($f =~ /^-/); > + last if (!$file && $f =~ /^\@\@/); > + > + if ($lines[$ln - 1] =~ > /^\+\s*(?:bool|tristate|prompt)\s*["']/) { > + $is_start = 1; > + } elsif ($lines[$ln - 1] =~ > /^\+\s*(?:help|---help---)\s*$/) { > + if ($lines[$ln - 1] =~ > "---help---") { > + > WARN("CONFIG_DESCRIPTION", > + "prefer 'help' > over '---help---' for new help texts\n" . $herecurr); > + } > + $length = -1; > + } > + > + $f =~ s/^.//; > + $f =~ s/#.*//; > + $f =~ s/^\s+//; > + next if ($f =~ /^$/); > + > + # This only checks context lines in the > patch > + # and so hopefully shouldn't trigger > false > + # positives, even though some of these > are > + # common words in help texts > + if ($f =~ > /^\s*(?:config|menuconfig|choice|endchoice| > + > if|endif|menu|endmenu|source)\b/x) { > + $is_end = 1; > + last; > } > - $length = -1; > + $length++; > + } > + if ($is_start && $is_end && $length < > $min_conf_desc_length) { > + WARN("CONFIG_DESCRIPTION", > + "please write a paragraph that > describes the config symbol fully\n" . $herecurr); > } > + #print "is_start<$is_start> is_end<$is_end> > length<$length>\n"; > + } > > - $f =~ s/^.//; > - $f =~ s/#.*//; > - $f =~ s/^\s+//; > - next if ($f =~ /^$/); > - > - # This only checks context lines in the patch > - # and so hopefully shouldn't trigger false > - # positives, even though some of these are > - # common words in help texts > - if ($f =~ > /^\s*(?:config|menuconfig|choice|endchoice| > - > if|endif|menu|endmenu|source)\b/x) { > - $is_end = 1; > - last; > +# discourage the use of boolean for type definition attributes > + if ($line =~ /^\+\s*\bboolean\b/) { > + if (WARN("CONFIG_TYPE_BOOLEAN", > + "Use of boolean is deprecated, please > use bool instead\n" . $herecurr) && > + $fix) { > + $fixed[$fixlinenr] =~ > s/\bboolean\b/bool/; > + } > + } > + > +# Kconfig: discourage redundant 'default n' > + if ($line =~ /^\+\s*default\s+n$/) { > + if (WARN("CONFIG_DEFAULT_VALUE_STYLE", > + "'default n' is the default value, no > need to write it explicitly\n" . $herecurr) && > + $fix) { > + fix_delete_line($fixlinenr, $rawline); > } > - $length++; > } > - if ($is_start && $is_end && $length < > $min_conf_desc_length) { > - WARN("CONFIG_DESCRIPTION", > - "please write a paragraph that describes > the config symbol fully\n" . $herecurr); > + > +# Kconfig: discourage quoted defaults: use default [ynm], not default "[ynm]" > + if ($rawline =~ /^\+\s*default\s+"([ynm])"/) { > + if (WARN("CONFIG_DEFAULT_VALUE_STYLE", > + "Use 'default $1' not 'default > \"$1\"'\n" . $herecurr) && > + $fix) { > + $fixed[$fixlinenr] =~ > s/\b(default\s+)"(.)"/$1$2/; > + } > + } > + > +# Kconfig: discourage using default EXPERT or !EXPERT > + if ($line =~ /^\+\s*default\s+\!?\s*EXPERT\b/) { > + WARN("CONFIG_DEFAULT_VALUE_STYLE", > + "Avoid using default EXPERT\n" . > $herecurr); > } > - #print "is_start<$is_start> is_end<$is_end> > length<$length>\n"; > } > +# End of Kconfig tests > + > > # check for MAINTAINERS entries that don't have the right form > if ($realfile =~ /^MAINTAINERS$/ && > @@ -3000,13 +3038,6 @@ sub process { > } > } > > -# discourage the use of boolean for type definition attributes of Kconfig > options > - if ($realfile =~ /Kconfig/ && > - $line =~ /^\+\s*\bboolean\b/) { > - WARN("CONFIG_TYPE_BOOLEAN", > - "Use of boolean is deprecated, please use bool > instead.\n" . $herecurr); > - } > - > if (($realfile =~ /Makefile.*/ || $realfile =~ /Kbuild.*/) && > ($line =~ /\+(EXTRA_[A-Z]+FLAGS).*/)) { > my $flag = $1; > >