[Linux-kernel-mentees] [PATCH] checkpatch: add fix and improve warning msg for Non-standard signature
From: Aditya Srivastava <hidden>
Date: 2020-11-24 11:17:15
Subsystem:
checkpatch, the rest · Maintainers:
Andy Whitcroft, Joe Perches, Linus Torvalds
Currently checkpatch warns for BAD_SIGN_OFF on non-standard signature
styles.
A large number of these warnings occur because of typo mistakes in
signoffs.
An evaluation over v4.13..v5.8 revealed that out of 539 warnings due to
Non-standard signatures, 85 are due to typo mistakes.
Eg. running checkpatch on commit da785a87787c ("ARM: bcm2835: Fix
integer overflow in rpi_firmware_print_firmware_revision()") reports
this warning:
WARNING:Non-standard signature: Revieved-by:
Revieved-by: Petr Mladek [off-list ref]
Here the signoff 'Reviewed-by' is misspelt.
Provide a fix by calculating levenshtein distance for the signoff over
all the standard signatures and suggest a fix if the distance for any
signature is less than or equal to 2.
Signed-off-by: Aditya Srivastava <redacted>
---
applied on my last patch and next-20201120
scripts/checkpatch.pl | 73 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 72 insertions(+), 1 deletion(-)
diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index b018deecec1a..2198360eebbd 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl@@ -506,6 +506,77 @@ our $signature_tags = qr{(?xi: Cc: )}; +sub get_min { + my (@arr) = @_; + my $len = scalar @arr; + if((scalar @arr) < 1) { + # if underflow, return + return; + } + my $min = $arr[0]; + for my $i (0 .. ($len-1)) { + if ($arr[$i] < $min) { + $min = $arr[$i]; + } + } + return $min; +} + +sub get_edit_distance { + my ($str1, $str2) = @_; + my $len1 = length($str1); + my $len2 = length($str2); + # two dimensional array storing minimum edit distance + my @distance; + for my $i (0 .. $len1) { + for my $j (0 .. $len2) { + if ($i == 0) { + $distance[$i][$j] = $j; + } + elsif ($j == 0) { + $distance[$i][$j] = $i; + } + elsif (substr($str1, $i-1, 1) eq substr($str2, $j-1, 1)) { + $distance[$i][$j] = $distance[$i - 1][$j - 1]; + } + else { + my $dist1 = $distance[$i][$j - 1]; #insert distance + my $dist2 = $distance[$i - 1][$j]; # remove + my $dist3 = $distance[$i - 1][$j - 1]; #replace + $distance[$i][$j] = 1 + get_min($dist1, $dist2, $dist3); + } + } + } + return $distance[$len1][$len2]; +} + +sub get_standard_signature { + my ($sign_off) = @_; + $sign_off = lc($sign_off); + $sign_off =~ s/\-//g; # to match with formed hash + my @standard_signature_tags = ( + 'signed-off-by:', 'co-developed-by:', 'acked-by:', 'tested-by:', + 'reviewed-by:', 'reported-by:', 'suggested-by:', 'to:', 'cc:' + ); + # setting default values + my $standard_signature = 'signed-off-by'; + my $min_edit_distance = 20; + my $edit_distance; + foreach (@standard_signature_tags) { + my $signature = $_; + $_ =~ s/\-//g; + $edit_distance = get_edit_distance($sign_off, $_); + if ($edit_distance < $min_edit_distance) { + $min_edit_distance = $edit_distance; + $standard_signature = $signature; + } + } + if($min_edit_distance<=2) { + return ucfirst($standard_signature); + } + return ""; +} + our %standard_signature_fix = ( "Requested-by:" => { suggestion => "Suggested-by:",
@@ -2848,7 +2919,7 @@ sub process { my $ucfirst_sign_off = ucfirst(lc($sign_off)); if ($sign_off !~ /$signature_tags/) { - my $suggested_signature = ""; + my $suggested_signature = get_standard_signature($sign_off); my $rationale = ""; if (exists($standard_signature_fix{$sign_off})) { $suggested_signature = $standard_signature_fix{$sign_off}{'suggestion'};
--
2.17.1
_______________________________________________
Linux-kernel-mentees mailing list
Linux-kernel-mentees@lists.linuxfoundation.org
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees