Checkpatch sometimes has false positives. This makes it less useful for automatic usage: tools like b4 [0] can run checkpatch on all of your patches and give you a quick overview. When iterating on a branch, it's tiresome to manually re-check that any errors are known false positives. This patch adds a feature to record in the commit message that a patch might produce a certain checkpatch error, and that this is an expected false positive. Recording this information in the patch itself can also highlight it to reviewers, so they can make a judgment as to whether it's appropriate to ignore. To avoid significant reworks to the Perl code, this is implemented by mutating a global variable while processing each patch. (The variable name refers to a patch as a "file" for consistency with other code). This feature is immediately adopted for this commit itself, which falls afoul of EMAIL_SUBJECT due to the word "checkpatch" appearing in the "Checkpatch-ignore" reference in the title - a good example of a false positive. [0] b4 - see "--check" arg https://b4.docs.kernel.org/en/latest/contributor/prep.html Checkpatch-ignore: EMAIL_SUBJECT Signed-off-by: Brendan Jackman <jackmanb@xxxxxxxxxx> --- scripts/checkpatch.pl | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 9eed3683ad76caffbbb2418e5dbea7551d374406..1a2ae442068d870903d46bd2dc63b757609e142d 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -53,7 +53,10 @@ my %debug; my %camelcase = (); my %use_type = (); my @use = (); +# Error types to ignore during the whole invocation. my %ignore_type = (); +# Error types to be ignored in the present "file" (i.e. patch). +my %file_ignore_type = (); my @ignore = (); my $help = 0; my $configuration_file = ".checkpatch.conf"; @@ -2329,7 +2332,7 @@ sub show_type { return defined $use_type{$type} if (scalar keys %use_type > 0); - return !defined $ignore_type{$type}; + return !defined $ignore_type{$type} && !defined $file_ignore_type{$type}; } sub report { @@ -2701,6 +2704,8 @@ sub process { my $checklicenseline = 1; + %file_ignore_type = (); + sanitise_line_reset(); my $line; foreach my $rawline (@rawlines) { @@ -2778,6 +2783,10 @@ sub process { if ($setup_docs && $line =~ /^\+/) { push(@setup_docs, $line); } + + if ($line =~ /^Checkpatch-ignore:\s+(.*)/) { + hash_save_array_words(\%file_ignore_type, [$1]); + } } $prefix = ''; -- 2.47.1.613.gc27f4b7a9f-goog