* [PATCH v2 1/3] checkpatch: add verbose mode
2021-01-28 14:37 [PATCH v2 0/3] checkpatch: add verbose mode Dwaipayan Ray
@ 2021-01-28 14:38 ` Dwaipayan Ray
2021-01-28 19:11 ` Joe Perches
2021-01-28 14:38 ` [PATCH v2 2/3] docs: add documentation for checkpatch Dwaipayan Ray
2021-01-28 14:38 ` [PATCH v2 3/3] " Dwaipayan Ray
2 siblings, 1 reply; 6+ messages in thread
From: Dwaipayan Ray @ 2021-01-28 14:38 UTC (permalink / raw)
To: joe; +Cc: linux-kernel-mentees, lukas.bulwahn, linux-kernel, Dwaipayan Ray
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 <dwaipayanray1@gmail.com>
---
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
^ permalink raw reply [flat|nested] 6+ messages in thread* Re: [PATCH v2 1/3] checkpatch: add verbose mode
2021-01-28 14:38 ` [PATCH v2 1/3] " Dwaipayan Ray
@ 2021-01-28 19:11 ` Joe Perches
0 siblings, 0 replies; 6+ messages in thread
From: Joe Perches @ 2021-01-28 19:11 UTC (permalink / raw)
To: Dwaipayan Ray; +Cc: linux-kernel-mentees, lukas.bulwahn, linux-kernel
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.
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 2/3] docs: add documentation for checkpatch
2021-01-28 14:37 [PATCH v2 0/3] checkpatch: add verbose mode Dwaipayan Ray
2021-01-28 14:38 ` [PATCH v2 1/3] " Dwaipayan Ray
@ 2021-01-28 14:38 ` Dwaipayan Ray
[not found] ` <1f8eb861fd74e530eeda9cb587e7cb3dc655c124.camel@perches.com>
2021-01-28 14:38 ` [PATCH v2 3/3] " Dwaipayan Ray
2 siblings, 1 reply; 6+ messages in thread
From: Dwaipayan Ray @ 2021-01-28 14:38 UTC (permalink / raw)
To: joe; +Cc: linux-kernel-mentees, lukas.bulwahn, linux-kernel, Dwaipayan Ray
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 <dwaipayanray1@gmail.com>
---
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 <random@developer.example.org>
+
+ 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
^ permalink raw reply [flat|nested] 6+ messages in thread* [PATCH v2 3/3] docs: add documentation for checkpatch
2021-01-28 14:37 [PATCH v2 0/3] checkpatch: add verbose mode Dwaipayan Ray
2021-01-28 14:38 ` [PATCH v2 1/3] " Dwaipayan Ray
2021-01-28 14:38 ` [PATCH v2 2/3] docs: add documentation for checkpatch Dwaipayan Ray
@ 2021-01-28 14:38 ` Dwaipayan Ray
2 siblings, 0 replies; 6+ messages in thread
From: Dwaipayan Ray @ 2021-01-28 14:38 UTC (permalink / raw)
To: joe; +Cc: linux-kernel-mentees, lukas.bulwahn, linux-kernel, Dwaipayan Ray
Link the checkpatch documentation to the dev-tools index
for sphinx.
Signed-off-by: Dwaipayan Ray <dwaipayanray1@gmail.com>
---
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
^ permalink raw reply [flat|nested] 6+ messages in thread