2021-01-28 14:41:33

by Dwaipayan Ray

[permalink] [raw]
Subject: [PATCH v2 0/3] checkpatch: add verbose mode

Add a new verbose mode to checkpatch. The verbose test
descriptions are read from the checkpatch documentation
file at `Documentation/dev-tools/checkpatch.rst`.

The verbose mode is optional and can be enabled by the
flag -v or --verbose.

The documentation file is only parsed by checkpatch.pl
if the verbose mode is enabled. The verbose mode is also
suppressed when the --terse option is specified.

Changes in v2:
- Use .rst Field Lists to specify the type descriptions.
- Add a few more type descriptions to documentation.


Dwaipayan Ray (3):
checkpatch: add verbose mode
docs: add documentation for checkpatch
docs: add documentation for checkpatch

Documentation/dev-tools/checkpatch.rst | 269 +++++++++++++++++++++++++
Documentation/dev-tools/index.rst | 1 +
scripts/checkpatch.pl | 54 ++++-
3 files changed, 323 insertions(+), 1 deletion(-)
create mode 100644 Documentation/dev-tools/checkpatch.rst

--
2.30.0


2021-01-28 14:42:25

by Dwaipayan Ray

[permalink] [raw]
Subject: [PATCH v2 1/3] checkpatch: add verbose mode

Add a new verbose mode to checkpatch.pl to emit additional verbose
test descriptions. The verbose mode is optional and can be enabled
by the flag -v or --verbose.

The test descriptions are parsed from the checkpatch documentation
file at `Documentation/dev-tools/checkpatch.rst`. The test
descriptions in the docs are kept in a fixed format, an example
of which is as follows:

:LINE_SPACING:
Vertical space is wasted given the limited number of lines an
editor window can display when multiple blank lines are used.

:MISSING_SIGN_OFF:
The patch is missing a Signed-off-by line. A signed-off-by
line should be added according to Developer's certificate of
Origin.
ref: `Documentation/process/submitting-patches.rst`

The verbose descriptions are not shown when the --terse option
is enabled.

Signed-off-by: Dwaipayan Ray <[email protected]>
---
scripts/checkpatch.pl | 54 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 53 insertions(+), 1 deletion(-)

diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index 05e908dcf0a0..2011d90c3e97 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -23,6 +23,8 @@ my $V = '0.32';
use Getopt::Long qw(:config no_auto_abbrev);

my $quiet = 0;
+my $verbose = 0;
+my %verbose_messages = ();
my $tree = 1;
my $chk_signoff = 1;
my $chk_patch = 1;
@@ -61,6 +63,7 @@ my $spelling_file = "$D/spelling.txt";
my $codespell = 0;
my $codespellfile = "/usr/share/codespell/dictionary.txt";
my $conststructsfile = "$D/const_structs.checkpatch";
+my $docsfile = "$D/../Documentation/dev-tools/checkpatch.rst";
my $typedefsfile;
my $color = "auto";
my $allow_c99_comments = 1; # Can be overridden by --ignore C99_COMMENT_TOLERANCE
@@ -78,6 +81,7 @@ Version: $V

Options:
-q, --quiet quiet
+ -v, --verbose verbose mode
--no-tree run without a kernel tree
--no-signoff do not check for 'Signed-off-by' line
--patch treat FILE as patchfile (default)
@@ -198,6 +202,45 @@ if (-f $conf) {
unshift(@ARGV, @conf_args) if @conf_args;
}

+sub load_docs {
+ open(my $docs, '<', "$docsfile")
+ or warn "$P: Can't read the documentation file $docsfile $!\n";
+
+ my @lines = ();
+ while (<$docs>) {
+ my $line = $_;
+
+ $line =~ s/\s*\n?$//g;
+ push (@lines, $line);
+ }
+ close($docs);
+
+ my $linenr = 0;
+ my $cnt = scalar @lines;
+ while ($linenr < $cnt) {
+ while ($linenr < $cnt &&
+ $lines[$linenr++] !~ /^\:(.+)\:$/)
+ {
+ }
+
+ last if ($linenr >= $cnt);
+
+ my $type = $lines[$linenr - 1];
+ $type =~ s/^\:(.+)\:$/$1/;
+ my $message = '';
+
+ while ($linenr < $cnt &&
+ $lines[$linenr] =~ /^(?:\s+(.+)$|$)/) {
+ $message .= $1 if (defined $1);
+ $message .= "\n";
+ $linenr++;
+ }
+
+ $message = trim($message);
+ $verbose_messages{$type} = $message;
+ }
+}
+
# Perl's Getopt::Long allows options to take optional arguments after a space.
# Prevent --color by itself from consuming other arguments
foreach (@ARGV) {
@@ -208,6 +251,7 @@ foreach (@ARGV) {

GetOptions(
'q|quiet+' => \$quiet,
+ 'v|verbose!' => \$verbose,
'tree!' => \$tree,
'signoff!' => \$chk_signoff,
'patch!' => \$chk_patch,
@@ -249,6 +293,8 @@ help(0) if ($help);

list_types(0) if ($list_types);

+load_docs() if ($verbose && !$terse);
+
$fix = 1 if ($fix_inplace);
$check_orig = $check;

@@ -2209,7 +2255,13 @@ sub report {
splice(@lines, 1, 1);
$output = join("\n", @lines);
}
- $output = (split('\n', $output))[0] . "\n" if ($terse);
+
+ if ($terse) {
+ $output = (split('\n', $output))[0] . "\n";
+ } elsif ($verbose &&
+ exists $verbose_messages{$type}) {
+ $output .= $verbose_messages{$type} . "\n\n";
+ }

push(our @report, $output);

--
2.30.0

2021-01-28 14:42:40

by Dwaipayan Ray

[permalink] [raw]
Subject: [PATCH v2 2/3] docs: add documentation for checkpatch

Add documentation for kernel script checkpatch.pl.
This documentation is also parsed by checkpatch to
enable a verbose mode.

Only a few test descriptions are added and the rest
will be added later over time to document all the
message types emitted by checkpatch.

Signed-off-by: Dwaipayan Ray <[email protected]>
---
Documentation/dev-tools/checkpatch.rst | 269 +++++++++++++++++++++++++
1 file changed, 269 insertions(+)
create mode 100644 Documentation/dev-tools/checkpatch.rst

diff --git a/Documentation/dev-tools/checkpatch.rst b/Documentation/dev-tools/checkpatch.rst
new file mode 100644
index 000000000000..bb23f4dad11e
--- /dev/null
+++ b/Documentation/dev-tools/checkpatch.rst
@@ -0,0 +1,269 @@
+.. SPDX-License-Identifier: GPL-2.0-only
+
+==========
+Checkpatch
+==========
+
+This document describes the kernel script checkpatch.pl.
+
+.. Table of Contents
+
+ === 1 Introduction
+ === 2 Options
+ === 3 Message Levels
+ === 4 Type Descriptions
+
+1 Introduction
+--------------
+
+Checkpatch (scripts/checkpatch.pl) is a perl script which checks for trivial style
+violations in patches and optionally corrects them. Checkpatch can also be run on
+file contexts and without the kernel tree.
+
+It should be noted that checkpatch may not be always right. At times the human
+judgement should take preference over what checkpatch has to say. If your code looks
+better with the violations, then its probably best left alone.
+
+
+2 Options
+---------
+
+This section will describe the options checkpatch can be run with.
+
+Usage::
+
+ ./scripts/checkpatch.pl [OPTION]... [FILE]...
+
+Available options:
+
+ - -q, --quiet
+
+ Enable quiet mode.
+
+ - -v, --verbose
+ Enable verbose mode. Additional verbose test descriptions are output
+ so as to provide information on why that particular message is shown.
+
+ - --no-tree
+
+ Run checkpatch without the kernel tree.
+
+ - --no-signoff
+
+ Disable the 'Signed-off-by' line check. The sign-off is a simple line at
+ the end of the explanation for the patch, which certifies that you wrote it
+ or otherwise have the right to pass it on as an open-source patch.
+
+ Example::
+
+ Signed-off-by: Random J Developer <[email protected]>
+
+ Setting this flag effectively stops a message for a missing signed-off-by line
+ in a patch context.
+
+ - --patch
+
+ Treat FILE as a patch. This is the default option and need not be
+ explicitly specified.
+
+ - --emacs
+
+ Set output to emacs compile window format. This allows emacs users to jump
+ from the error in the compile window directly to the offending line in the patch.
+
+ - --terse
+
+ Output only one line per report.
+
+ - --showfile
+
+ Show the diffed file position instead of the input file position.
+
+ - -g, --git
+
+ Treat FILE as a single commit or a git revision range.
+
+ Single commit with:
+
+ - <rev>
+ - <rev>^
+ - <rev>~n
+
+ Multiple commits with:
+
+ - <rev1>..<rev2>
+ - <rev1>...<rev2>
+ - <rev>-<count>
+
+ - -f, --file
+
+ Treat FILE as a regular source file. This option must be used when running
+ checkpatch on source files in the kernel.
+
+ - --subjective, --strict
+
+ Enable stricter tests in checkpatch. By default the tests emitted as CHECK
+ do not activate by default. Use this flag to activate the CHECK tests.
+
+ - --list-types
+
+ Every message emitted by checkpatch has an associated TYPE. Add this flag to
+ display all the types in checkpatch.
+
+ Note that when this flag is active, checkpatch does not read the input FILE, and
+ no message is emitted. Only a list of types in checkpatch is output.
+
+ - --types TYPE(,TYPE2...)
+
+ Only display messages with the given types.
+
+ Example::
+
+ ./scripts/checkpatch.pl mypatch.patch --types EMAIL_SUBJECT,NO_AUTHOR_SIGN_OFF
+
+ - --ignore TYPE(,TYPE2...)
+
+ Strip off messages with the given types.
+
+ Example::
+
+ ./scripts/checkpatch.pl mypatch.patch --ignore EMAIL_SUBJECT,NO_AUTHOR_SIGN_OFF
+
+ - --show-types
+
+ By default checkpatch doesn't display the type associated with the messages.
+ Set this flag to show the message type in the output.
+
+ - --max-line-length=n
+
+ Set the max line length (default 100). On exceeding the given length, a message
+ is emitted.
+
+ The message level is different for patch and file contexts. For patches, a WARNING is
+ emitted. While a milder CHECK is emitted for files. So for file contexts, the --strict
+ flag must also be enabled.
+
+ - --min-conf-desc-length=n
+
+ Set the min description length, if shorter, warn.
+
+ - --tab-size=n
+
+ Set the number of spaces for tab (default 8).
+
+ - --root=PATH
+
+ PATH to the kernel tree root.
+
+ This option must be specified when invoking checkpatch from outside
+ the kernel root.
+
+ - --no-summary
+
+ Suppress the per file summary.
+
+ - --mailback
+
+ Only produce a report in case of Warnings or Errors. Milder Checks are
+ excluded from this.
+
+ - --summary-file
+
+ Include the filename in summary.
+
+ - --debug KEY=[0|1]
+
+ Turn on/off debugging of KEY, where KEY is one of 'values', 'possible',
+ 'type', and 'attr' (default is all off).
+
+ - --fix
+
+ This is an EXPERIMENTAL feature. If correctable errors exists, a file
+ <inputfile>.EXPERIMENTAL-checkpatch-fixes is created which has the
+ automatically fixable errors corrected.
+
+ - --fix-inplace
+
+ EXPERIMENTAL - Similar to --fix but the input file is overwritten with fixes.
+
+ DO NOT USE this flag unless you are absolutely sure and you have a backup in place.
+
+ - --ignore-perl-version
+
+ Override checking of perl version. Runtime errors maybe encountered after
+ enabling this flag if the perl version does not meet the minimum specified.
+
+ - --codespell
+
+ Use the codespell dictionary for checking spelling errors.
+
+ - --codespellfile
+
+ Use the specified codespell file. Default is '/usr/share/codespell/dictionary.txt'.
+
+ - --typedefsfile
+
+ Read additional types from this file.
+
+ - --color[=WHEN]
+
+ Use colors 'always', 'never', or only when output is a terminal ('auto').
+ Default is 'auto'.
+
+ - --kconfig-prefix=WORD
+
+ Use WORD as a prefix for Kconfig symbols (default is `CONFIG_`).
+
+ - -h, --help, --version
+
+ Display the help text.
+
+3 Message Levels
+----------------
+
+Messages in checkpatch are divided into three levels. The levels of messages in
+checkpatch denote the severity of the error. They are:
+
+ - ERROR
+
+ This is the most strict level. Messages of type ERROR must be taken
+ seriously as they denote things that are very likely to be wrong.
+
+ - WARNING
+
+ This is the next stricter level. Messages of type WARNING requires a
+ more careful review. But it is milder than an ERROR.
+
+ - CHECK
+
+ This is the mildest level. These are things which may require some thought.
+
+4 Type Descriptions
+-------------------
+
+This section contains a description of all the message types in checkpatch.
+
+.. Types in this section are also parsed by checkpatch.
+.. Please keep the types sorted alphabetically.
+
+:LINE_SPACING:
+ Vertical space is wasted given the limited number of lines an
+ editor window can display when multiple blank lines are used.
+
+:MISSING_SIGN_OFF:
+ The patch is missing a Signed-off-by line. A signed-off-by
+ line should be added according to Developer's certificate of
+ Origin.
+ ref: `Documentation/process/submitting-patches.rst`
+
+:NO_AUTHOR_SIGN_OFF:
+ The author of the patch has not signed off the patch. It is
+ required that a simple sign off line should be present at the
+ end of explanation of the patch to denote that the author has
+ written it or otherwise has the rights to pass it on as an open
+ source patch.
+
+:TRAILING_WHITESPACE:
+ Trailing whitespace should always be removed.
+ Some editors highlight the trailing whitespace and cause visual
+ distractions when editing files.
--
2.30.0

2021-01-28 14:43:44

by Dwaipayan Ray

[permalink] [raw]
Subject: [PATCH v2 3/3] docs: add documentation for checkpatch

Link the checkpatch documentation to the dev-tools index
for sphinx.

Signed-off-by: Dwaipayan Ray <[email protected]>
---
Documentation/dev-tools/index.rst | 1 +
1 file changed, 1 insertion(+)

diff --git a/Documentation/dev-tools/index.rst b/Documentation/dev-tools/index.rst
index 1b1cf4f5c9d9..43d28998118b 100644
--- a/Documentation/dev-tools/index.rst
+++ b/Documentation/dev-tools/index.rst
@@ -14,6 +14,7 @@ whole; patches welcome!
.. toctree::
:maxdepth: 2

+ checkpatch
coccinelle
sparse
kcov
--
2.30.0

2021-01-28 20:16:34

by Dwaipayan Ray

[permalink] [raw]
Subject: Re: [PATCH v2 2/3] docs: add documentation for checkpatch

On Fri, Jan 29, 2021 at 12:53 AM Joe Perches <[email protected]> wrote:
>
> On Thu, 2021-01-28 at 20:08 +0530, Dwaipayan Ray wrote:
> > Add documentation for kernel script checkpatch.pl.
> > This documentation is also parsed by checkpatch to
> > enable a verbose mode.
> >
> > Only a few test descriptions are added and the rest
> > will be added later over time to document all the
> > message types emitted by checkpatch.
>
> Better to document them all rather than partially.
> $ git grep -ohP '(?:\w+|\})\s*\(\s*\"[A-Z_]+"' scripts/checkpatch.pl | \
> cut -f2 -d'"' | sort | uniq
> ALLOC_ARRAY_ARGS
> ALLOC_SIZEOF_STRUCT
> ALLOC_WITH_MULTIPLY
> ARCH_DEFINES
> ARCH_INCLUDE_LINUX
> ARRAY_SIZE
> ASSIGN_IN_IF
> ASSIGNMENT_CONTINUATIONS
> AVOID_BUG
> AVOID_EXTERNS
> AVOID_L_PREFIX
> BAD_SIGN_OFF
> BAD_STABLE_ADDRESS_STYLE
> BIT_MACRO
> BLOCK_COMMENT_STYLE
> BOOL_COMPARISON
> BRACES
> BRACKET_SPACE
> CAMELCASE
> CHECK
> CODE_INDENT
> COMMIT_COMMENT_SYMBOL
> COMMIT_LOG_LONG_LINE
> COMMIT_MESSAGE
> COMPARISON_TO_NULL
> COMPLEX_MACRO
> CONCATENATED_STRING
> CONFIG_DESCRIPTION
> CONFIG_TYPE_BOOLEAN
> CONSIDER_COMPLETION
> CONSIDER_KSTRTO
> CONSTANT_COMPARISON
> CONSTANT_CONVERSION
> CONST_CONST
> CONST_READ_MOSTLY
> CONST_STRUCT
> CORRUPTED_PATCH
> CVS_KEYWORD
> DATA_RACE
> DATE_TIME
> DEEP_INDENTATION
> DEFAULT_NO_BREAK
> DEFINE_ARCH_HAS
> DEPRECATED_API
> DEPRECATED_VARIABLE
> DEVICE_ATTR_FUNCTIONS
> DEVICE_ATTR_PERMS
> DEVICE_ATTR_RO
> DEVICE_ATTR_RW
> DEVICE_ATTR_WO
> DIFF_IN_COMMIT_MSG
> DOS_LINE_ENDINGS
> DO_WHILE_MACRO_WITH_TRAILING_SEMICOLON
> DT_SCHEMA_BINDING_PATCH
> DT_SPLIT_BINDING_PATCH
> DUPLICATED_SYSCTL_CONST
> ELSE_AFTER_BRACE
> EMAIL_SUBJECT
> EMBEDDED_FILENAME
> EMBEDDED_FUNCTION_NAME
> ENOSYS
> ENOTSUPP
> ERROR
> EXECUTE_PERMISSIONS
> EXPORTED_WORLD_WRITABLE
> EXPORT_SYMBOL
> FILE_PATH_CHANGES
> FROM_SIGN_OFF_MISMATCH
> FSF_MAILING_ADDRESS
> FUNCTION_ARGUMENTS
> FUNCTION_WITHOUT_ARGS
> GERRIT_CHANGE_ID
> GIT_COMMIT_ID
> GLOBAL_INITIALISERS
> HEXADECIMAL_BOOLEAN_TEST
> HOTPLUG_SECTION
> IN_ATOMIC
> INCLUDE_LINUX
> INDENTED_LABEL
> INIT_ATTRIBUTE
> INITIALISED_STATIC
> INLINE
> INLINE_LOCATION
> IS_ENABLED_CONFIG
> JIFFIES_COMPARISON
> KREALLOC_ARG_REUSE
> LEADING_SPACE
> LIKELY_MISUSE
> LINE_CONTINUATIONS
> LINE_SPACING
> LINUX_VERSION_CODE
> LOCKDEP
> LOCKING
> LOGGING_CONTINUATION
> LOGICAL_CONTINUATIONS
> LONG_LINE
> LONG_UDELAY
> MACRO_ARG_PRECEDENCE
> MACRO_ARG_REUSE
> MACRO_WITH_FLOW_CONTROL
> MAINTAINERS_STYLE
> MALFORMED_INCLUDE
> MASK_THEN_SHIFT
> MEMORY_BARRIER
> MEMSET
> MINMAX
> MISORDERED_TYPE
> MISPLACED_INIT
> MISSING_EOF_NEWLINE
> MISSING_SIGN_OFF
> MODIFIED_INCLUDE_ASM
> MODULE_LICENSE
> MSLEEP
> MULTILINE_DEREFERENCE
> MULTIPLE_ASSIGNMENTS
> MULTIPLE_DECLARATION
> MULTISTATEMENT_MACRO_USE_DO_WHILE
> NAKED_SSCANF
> NETWORKING_BLOCK_COMMENT_STYLE
> NEW_TYPEDEFS
> NO_AUTHOR_SIGN_OFF
> NON_OCTAL_PERMISSIONS
> NOT_UNIFIED_DIFF
> NR_CPUS
> OBSOLETE
> ONE_SEMICOLON
> OOM_MESSAGE
> OPEN_BRACE
> OPEN_ENDED_LINE
> PARENTHESIS_ALIGNMENT
> PATCH_PREFIX
> POINTER_LOCATION
> PREFER_DEFINED_ATTRIBUTE_MACRO
> PREFER_DEV_LEVEL
> PREFER_ETH_BROADCAST_ADDR
> PREFER_ETHER_ADDR_COPY
> PREFER_ETHER_ADDR_EQUAL
> PREFER_ETH_ZERO_ADDR
> PREFER_FALLTHROUGH
> PREFER_IS_ENABLED
> PREFER_KERNEL_TYPES
> PREFER_PR_LEVEL
> PREFER_SEQ_PUTS
> PRINTF_L
> PRINTF_Z
> PRINTK_RATELIMITED
> PRINTK_WITHOUT_KERN_LEVEL
> QUOTED_WHITESPACE_BEFORE_NEWLINE
> REPEATED_WORD
> RETURN_PARENTHESES
> RETURN_VOID
> SELF_ASSIGNMENT
> SINGLE_STATEMENT_DO_WHILE_MACRO
> SIZEOF_ADDRESS
> SIZEOF_PARENTHESIS
> SPACE_BEFORE_TAB
> SPACING
> SPDX_LICENSE_TAG
> SPLIT_STRING
> SSCANF_TO_KSTRTO
> STATIC_CONST
> STATIC_CONST_CHAR_ARRAY
> STORAGE_CLASS
> STRING_FRAGMENTS
> STRLCPY
> SUSPECT_CODE_INDENT
> SUSPECT_COMMA_SEMICOLON
> SWITCH_CASE_INDENT_LEVEL
> SYMBOLIC_PERMS
> TABSTOP
> TEST_ATTR
> TEST_NOT_ATTR
> TEST_NOT_TYPE
> TEST_TYPE
> TRACE_PRINTK
> TRACING_LOGGING
> TRAILING_SEMICOLON
> TRAILING_STATEMENTS
> TRAILING_WHITESPACE
> TYPECAST_INT_CONSTANT
> TYPO_SPELLING
> UAPI_INCLUDE
> UNCOMMENTED_DEFINITION
> UNDOCUMENTED_DT_STRING
> UNDOCUMENTED_SETUP
> UNKNOWN_COMMIT_ID
> UNNECESSARY_BREAK
> UNNECESSARY_CASTS
> UNNECESSARY_ELSE
> UNNECESSARY_INT
> UNNECESSARY_KERN_LEVEL
> UNNECESSARY_MODIFIER
> UNNECESSARY_PARENTHESES
> UNSPECIFIED_INT
> USE_DEVICE_INITCALL
> USE_FUNC
> USE_LOCKDEP
> USE_NEGATIVE_ERRNO
> USE_RELATIVE_PATH
> USE_SPINLOCK_T
> USLEEP_RANGE
> VOLATILE
> VSPRINTF_POINTER_EXTENSION
> VSPRINTF_SPECIFIER_PX
> WAITQUEUE_ACTIVE
> WARNING
> WEAK_DECLARATION
> WHILE_AFTER_BRACE
> WHITESPACE_AFTER_LINE_CONTINUATION
> YIELD
>

The amount looks a bit scary at a first glance!
But sure I will try to get them all documented, although it might take
a bit of time.

> > diff --git a/Documentation/dev-tools/checkpatch.rst b/Documentation/dev-tools/checkpatch.rst
> []
> > +Checkpatch (scripts/checkpatch.pl) is a perl script which checks for trivial style
> > +violations in patches and optionally corrects them. Checkpatch can also be run on
> > +file contexts and without the kernel tree.
> > +
> > +It should be noted that checkpatch may not be always right. At times the human
>
> checkpatch is not always right.
> Your judgement takes precedence over checkpatch messages.
>
>
> > +
> > + - --types TYPE(,TYPE2...)
> > +
> > + Only display messages with the given types.
> > +
> > + Example::
> > +
> > + ./scripts/checkpatch.pl mypatch.patch --types EMAIL_SUBJECT,NO_AUTHOR_SIGN_OFF
> > +
> > + - --ignore TYPE(,TYPE2...)
> > +
> > + Strip off messages with the given types.
>
> checkpatch will not emit messages for the specified types,
>
> > +
> > + Example::
> > +
> > + ./scripts/checkpatch.pl mypatch.patch --ignore EMAIL_SUBJECT,NO_AUTHOR_SIGN_OFF
> > +
> > + - --show-types
> > +
> > + By default checkpatch doesn't display the type associated with the messages.
> > + Set this flag to show the message type in the output.
> > +
> > + - --max-line-length=n
> > +
> > + Set the max line length (default 100). On exceeding the given length, a message
> > + is emitted.
>
> If a line exceeds the specified length, a LONG_LINE message is emitted.
> > +
> > + The message level is different for patch and file contexts. For patches, a WARNING is
> > + emitted. While a milder CHECK is emitted for files. So for file contexts, the --strict
> > + flag must also be enabled.
> > +
> > + - --min-conf-desc-length=n
> > +
> > + Set the min description length, if shorter, warn.
>
> Kconfig entry minimum description
>

Thanks for the review Joe!

With best regards,
Dwaipayan.

2021-01-28 20:33:08

by Joe Perches

[permalink] [raw]
Subject: Re: [PATCH v2 1/3] checkpatch: add verbose mode

On Thu, 2021-01-28 at 20:08 +0530, Dwaipayan Ray wrote:
> Add a new verbose mode to checkpatch.pl to emit additional verbose
> test descriptions. The verbose mode is optional and can be enabled
> by the flag -v or --verbose.
[]
> diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
[]
> +sub load_docs {
> + open(my $docs, '<', "$docsfile")
> + or warn "$P: Can't read the documentation file $docsfile $!\n";
> +
> + my @lines = ();
> + while (<$docs>) {
> + my $line = $_;
> +
> + $line =~ s/\s*\n?$//g;

chomp

> + push (@lines, $line);
> + }
> + close($docs);
> +
> + my $linenr = 0;
> + my $cnt = scalar @lines;
> + while ($linenr < $cnt) {
> + while ($linenr < $cnt &&
> + $lines[$linenr++] !~ /^\:(.+)\:$/)
> + {
> + }
> +
> + last if ($linenr >= $cnt);
> +
> + my $type = $lines[$linenr - 1];
> + $type =~ s/^\:(.+)\:$/$1/;
> + my $message = '';
> +
> + while ($linenr < $cnt &&
> + $lines[$linenr] =~ /^(?:\s+(.+)$|$)/) {
> + $message .= $1 if (defined $1);
> + $message .= "\n";
> + $linenr++;
> + }
> +
> + $message = trim($message);
> + $verbose_messages{$type} = $message;
> + }
> +}

I think this is overly complicated.

There's no need to read and store the entire file and then
parse it. Just parse it line by line as its read.