checkpatch: add new warnings to author signoff checks.
PATCH v5 1/1 checkpatch: add new warnings to author signoff checks.
The author signed-off-by checks are currently very vague. Cases like same name or same address are not handled separately.
For example, running checkpatch on commit be6577af0cef ("parisc: Add atomic64_set_release() define to avoid CPU soft lockups"), gives:
WARNING: Missing Signed-off-by: line by nominal patch author 'John David Anglin <[email protected]>'
The signoff line was:
"Signed-off-by: Dave Anglin <[email protected]>"
Clearly the author has signed off but with a slightly different version of his name. A more appropriate warning would have been to point out at the name mismatch instead.
Previously, the values assumed by $authorsignoff were either 0 or 1 to indicate whether a proper sign off by author is present. Extended the checks to handle four new cases.
$authorsignoff values now denote the following:
0: Missing sign off by patch author.
1: Sign off present and identical.
2: Addresses and names match, but comments differ.
"James Watson(JW) <[email protected]>", "James Watson <[email protected]>"
3: Addresses match, but names are different.
"James Watson <[email protected]>", "James <[email protected]>"
4: Names match, but addresses are different.
"James Watson <[email protected]>", "James Watson <[email protected]>"
5: Names match, addresses excluding subaddress details (RFC 5233) match.
"James Watson <[email protected]>", "James Watson <[email protected]>"
--- scripts/checkpatch.pl | 93 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 77 insertions(+), 16 deletions(-)
scripts/checkpatch.pl +77 -16
@@ -1163,10 +1163,10 @@ sub parse_email { } } + $comment = trim($comment); $name = trim($name); $name =~ s/^\"|\"$//g; - $name =~ s/(\s*\([^\)]+\))\s*//; - if (defined($1)) { + if ($name =~ s/(\s*\([^\)]+\))\s*//) { $name_comment = trim($1); } $address = trim($address);
@@ -1181,10 +1181,12 @@ sub parse_email { } sub format_email { - my ($name, $address) = @_; + my ($name, $name_comment, $address, $comment) = @_; my $formatted_email; + $name_comment = trim($name_comment); + $comment = trim($comment); $name = trim($name); $name =~ s/^\"|\"$//g; $address = trim($address);
@@ -1197,9 +1199,9 @@ sub format_email { if ("$name" eq "") { $formatted_email = "$address"; } else { - $formatted_email = "$name <$address>"; + $formatted_email = "$name$name_comment <$address>"; } - + $formatted_email .= "$comment"; return $formatted_email; }
@@ -1207,17 +1209,23 @@ sub reformat_email { my ($email) = @_; my ($email_name, $name_comment, $email_address, $comment) = parse_email($email); - return format_email($email_name, $email_address); + return format_email($email_name, $name_comment, $email_address, $comment); } sub same_email_addresses { - my ($email1, $email2) = @_; + my ($email1, $email2, $match_comment) = @_; my ($email1_name, $name1_comment, $email1_address, $comment1) = parse_email($email1); my ($email2_name, $name2_comment, $email2_address, $comment2) = parse_email($email2); + if ($match_comment != 1) { + return $email1_name eq $email2_name && + $email1_address eq $email2_address; + } return $email1_name eq $email2_name && - $email1_address eq $email2_address; + $email1_address eq $email2_address && + $name1_comment eq $name2_comment && + $comment1 eq $comment2; } sub which {
@@ -2347,6 +2355,7 @@ sub process { my $signoff = 0; my $author = ''; my $authorsignoff = 0; + my $author_sob = ''; my $is_patch = 0; my $is_binding_patch = -1; my $in_header_lines = $file ? 0 : 1;
@@ -2674,9 +2683,37 @@ sub process { if ($line =~ /^\s*signed-off-by:\s*(.*)/i) { $signoff++; $in_commit_log = 0; - if ($author ne '') { - if (same_email_addresses($1, $author)) { + if ($author ne '' && $authorsignoff != 1) { + if (same_email_addresses($1, $author, 1)) { $authorsignoff = 1; + } else { + my $ctx = $1; + my ($email_name, $email_comment, $email_address, $comment1) = parse_email($ctx); + my ($author_name, $author_comment, $author_address, $comment2) = parse_email($author); + + if ($email_address eq $author_address && $email_name eq $author_name) { + $author_sob = $ctx; + $authorsignoff = 2; + } elsif ($email_address eq $author_address) { + $author_sob = $ctx; + $authorsignoff = 3; + } elsif ($email_name eq $author_name) { + $author_sob = $ctx; + $authorsignoff = 4; + + my $address1 = $email_address; + my $address2 = $author_address; + + if ($address1 =~ /(\S+)\+\S+(\@.*)/) { + $address1 = "$1$2"; + } + if ($address2 =~ /(\S+)\+\S+(\@.*)/) { + $address2 = "$1$2"; + } + if ($address1 eq $address2) { + $authorsignoff = 5; + } + } } } }
@@ -2733,7 +2770,7 @@ sub process { } my ($email_name, $name_comment, $email_address, $comment) = parse_email($email); - my $suggested_email = format_email(($email_name, $email_address)); + my $suggested_email = format_email(($email_name, $name_comment, $email_address, $comment)); if ($suggested_email eq "") { ERROR("BAD_SIGN_OFF", "Unrecognized email address: '$email'\n" . $herecurr);
@@ -2743,9 +2780,9 @@ sub process { $dequoted =~ s/" </ </; # Don't force email to have quotes # Allow just an angle bracketed address - if (!same_email_addresses($email, $suggested_email)) { + if (!same_email_addresses($email, $suggested_email, 0)) { WARN("BAD_SIGN_OFF", - "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr); + "email address '$email' might be better as '$suggested_email'\n" . $herecurr); } }
@@ -6891,9 +6928,33 @@ sub process { if ($signoff == 0) { ERROR("MISSING_SIGN_OFF", "Missing Signed-off-by: line(s)\n"); - } elsif (!$authorsignoff) { - WARN("NO_AUTHOR_SIGN_OFF", - "Missing Signed-off-by: line by nominal patch author '$author'\n"); + } elsif ($authorsignoff != 1) { + # authorsignoff values: + # 0 -> missing sign off + # 1 -> sign off identical + # 2 -> names and addresses match, comments mismatch + # 3 -> addresses match, names different + # 4 -> names match, addresses different + # 5 -> names match, addresses excluding subaddress details (refer RFC 5233) match + + my $sob_msg = "'From: $author' != 'Signed-off-by: $author_sob'"; + + if ($authorsignoff == 0) { + ERROR("NO_AUTHOR_SIGN_OFF", + "Missing Signed-off-by: line by nominal patch author '$author'\n"); + } elsif ($authorsignoff == 2) { + CHK("NO_AUTHOR_SIGN_OFF", + "From:/Signed-off-by: email comments mismatch: $sob_msg\n"); + } elsif ($authorsignoff == 3) { + WARN("NO_AUTHOR_SIGN_OFF", + "From:/Signed-off-by: email name mismatch: $sob_msg\n"); + } elsif ($authorsignoff == 4) { + WARN("NO_AUTHOR_SIGN_OFF", + "From:/Signed-off-by: email address mismatch: $sob_msg\n"); + } elsif ($authorsignoff == 5) { + WARN("NO_AUTHOR_SIGN_OFF", + "From:/Signed-off-by: email subaddress mismatch: $sob_msg\n"); + } } }
Signature · 1 line
2.27.0
Quoted 223 lines · Dwaipayan Ray
The author signed-off-by checks are currently very vague. Cases like same name or same address are not handled separately.
For example, running checkpatch on commit
be6577af0cef("parisc: Addatomic64_set_release()define to avoid CPU soft lockups"), gives:WARNING: Missing Signed-off-by: line by nominal patch author 'John David Anglin <[email protected]>'
The signoff line was:
"Signed-off-by: Dave Anglin <[email protected]>"Clearly the author has signed off but with a slightly different version of his name. A more appropriate warning would have been to point out at the name mismatch instead.
Previously, the values assumed by $authorsignoff were either 0 or 1 to indicate whether a proper sign off by author is present. Extended the checks to handle four new cases.
$authorsignoff values now denote the following:
0: Missing sign off by patch author.
1: Sign off present and identical.
2: Addresses and names match, but comments differ.
"James Watson(JW) <[email protected]>", "James Watson <[email protected]>"3: Addresses match, but names are different.
"James Watson <[email protected]>", "James <[email protected]>"4: Names match, but addresses are different.
"James Watson <[email protected]>", "James Watson <[email protected]>"5: Names match, addresses excluding subaddress details (RFC 5233) match.
"James Watson <[email protected]>", "James Watson <[email protected]>"Suggested-by Joe Perches <[email protected]>Signed-off-by Dwaipayan Ray <[email protected]>--- scripts/checkpatch.pl | 93 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 77 insertions(+), 16 deletions(-)scripts/checkpatch.pl +77
-17@@ -1163,10 +1163,10 @@ sub parse_email { } } + $comment = trim($comment); $name = trim($name); $name =~ s/^\"|\"$//g; - $name =~ s/(\s*\([^\)]+\))\s*//; - if (defined($1)) { + if ($name =~ s/(\s*\([^\)]+\))\s*//) { $name_comment = trim($1); } $address = trim($address);@@ -1181,10 +1181,12 @@ sub parse_email { } sub format_email { - my ($name, $address) = @_; + my ($name, $name_comment, $address, $comment) = @_; my $formatted_email; + $name_comment = trim($name_comment); + $comment = trim($comment); $name = trim($name); $name =~ s/^\"|\"$//g; $address = trim($address);@@ -1197,9 +1199,9 @@ sub format_email { if ("$name" eq "") { $formatted_email = "$address"; } else { - $formatted_email = "$name <$address>"; + $formatted_email = "$name$name_comment <$address>"; } - + $formatted_email .= "$comment"; return $formatted_email; }@@ -1207,17 +1209,23 @@ sub reformat_email { my ($email) = @_; my ($email_name, $name_comment, $email_address, $comment) = parse_email($email); - return format_email($email_name, $email_address); + return format_email($email_name, $name_comment, $email_address, $comment); } sub same_email_addresses { - my ($email1, $email2) = @_; + my ($email1, $email2, $match_comment) = @_; my ($email1_name, $name1_comment, $email1_address, $comment1) = parse_email($email1); my ($email2_name, $name2_comment, $email2_address, $comment2) = parse_email($email2); + if ($match_comment != 1) { + return $email1_name eq $email2_name && + $email1_address eq $email2_address; + } return $email1_name eq $email2_name && - $email1_address eq $email2_address; + $email1_address eq $email2_address && + $name1_comment eq $name2_comment && + $comment1 eq $comment2; } sub which {@@ -2347,6 +2355,7 @@ sub process { my $signoff = 0; my $author = ''; my $authorsignoff = 0; + my $author_sob = ''; my $is_patch = 0; my $is_binding_patch = -1; my $in_header_lines = $file ? 0 : 1;@@ -2674,9 +2683,37 @@ sub process { if ($line =~ /^\s*signed-off-by:\s*(.*)/i) { $signoff++; $in_commit_log = 0; - if ($author ne '') { - if (same_email_addresses($1, $author)) { + if ($author ne '' && $authorsignoff != 1) { + if (same_email_addresses($1, $author, 1)) { $authorsignoff = 1; + } else { + my $ctx = $1; + my ($email_name, $email_comment, $email_address, $comment1) = parse_email($ctx); + my ($author_name, $author_comment, $author_address, $comment2) = parse_email($author); + + if ($email_address eq $author_address && $email_name eq $author_name) { + $author_sob = $ctx; + $authorsignoff = 2; + } elsif ($email_address eq $author_address) { + $author_sob = $ctx; + $authorsignoff = 3; + } elsif ($email_name eq $author_name) { + $author_sob = $ctx; + $authorsignoff = 4; + + my $address1 = $email_address; + my $address2 = $author_address; + + if ($address1 =~ /(\S+)\+\S+(\@.*)/) { + $address1 = "$1$2"; + } + if ($address2 =~ /(\S+)\+\S+(\@.*)/) { + $address2 = "$1$2"; + } + if ($address1 eq $address2) { + $authorsignoff = 5; + } + } } } }@@ -2733,7 +2770,7 @@ sub process { } my ($email_name, $name_comment, $email_address, $comment) = parse_email($email); - my $suggested_email = format_email(($email_name, $email_address)); + my $suggested_email = format_email(($email_name, $name_comment, $email_address, $comment)); if ($suggested_email eq "") { ERROR("BAD_SIGN_OFF", "Unrecognized email address: '$email'\n" . $herecurr);@@ -2743,9 +2780,9 @@ sub process { $dequoted =~ s/" </ </; # Don't force email to have quotes # Allow just an angle bracketed address - if (!same_email_addresses($email, $suggested_email)) { + if (!same_email_addresses($email, $suggested_email, 0)) { WARN("BAD_SIGN_OFF", - "email address '$email' might be better as '$suggested_email$comment'\n" . $herecurr); + "email address '$email' might be better as '$suggested_email'\n" . $herecurr); } }@@ -6891,9 +6928,33 @@ sub process { if ($signoff == 0) { ERROR("MISSING_SIGN_OFF", "Missing Signed-off-by: line(s)\n"); - } elsif (!$authorsignoff) { - WARN("NO_AUTHOR_SIGN_OFF", - "Missing Signed-off-by: line by nominal patch author '$author'\n"); + } elsif ($authorsignoff != 1) { + # authorsignoff values: + # 0 -> missing sign off + # 1 -> sign off identical + # 2 -> names and addresses match, comments mismatch + # 3 -> addresses match, names different + # 4 -> names match, addresses different + # 5 -> names match, addresses excluding subaddress details (refer RFC 5233) match + + my $sob_msg = "'From: $author' != 'Signed-off-by: $author_sob'"; + + if ($authorsignoff == 0) { + ERROR("NO_AUTHOR_SIGN_OFF", + "Missing Signed-off-by: line by nominal patch author '$author'\n"); + } elsif ($authorsignoff == 2) { + CHK("NO_AUTHOR_SIGN_OFF", + "From:/Signed-off-by: email comments mismatch: $sob_msg\n"); + } elsif ($authorsignoff == 3) { + WARN("NO_AUTHOR_SIGN_OFF", + "From:/Signed-off-by: email name mismatch: $sob_msg\n"); + } elsif ($authorsignoff == 4) { + WARN("NO_AUTHOR_SIGN_OFF", + "From:/Signed-off-by: email address mismatch: $sob_msg\n"); + } elsif ($authorsignoff == 5) { + WARN("NO_AUTHOR_SIGN_OFF", + "From:/Signed-off-by: email subaddress mismatch: $sob_msg\n"); + } } } --
Quoted 2 lines
2.27.0
Hi,
I needed to change a bit in a few subroutines which trimmed off the comments. Comments now appear in the formatted email. The usage is also refactored so that it doesn't cause any undesired effects.
Coming back to the signoff check, now email comments are also compared.
Cases like:
"Dwaipayan Ray(Dwai) <[email protected]>" and "Dwaipayan Ray <[email protected]>", now generate a --strict CHK.
Thanks,
Dwaipayan.
Joe Perches
maintainerQuoted 3 lines · Dwaipayan Ray
Quoted 2 lines · Dwaipayan Ray
The author signed-off-by checks are currently very vague. Cases like same name or same address are not handled separately.
Likely now, the type should be changed from NO_AUTHOR_SIGN_OFF to a single something else for all the other types of messages.
Quoted 10 lines · Joe Perches
Quoted 3 lines · Dwaipayan Ray
Quoted 2 lines · Dwaipayan Ray
The author signed-off-by checks are currently very vague. Cases like same name or same address are not handled separately.
Likely now, the type should be changed from
NO_AUTHOR_SIGN_OFFto a single something else for all the other types of messages.
Since BAD_SIGNOFF is being used for a different context, then probably BAD_AUTHOR_SIGNOFF.
Should this work or anything else you have in mind?
Thanks,
Dwaipayan.
_______________________________________________
Linux-kernel-mentees mailing list
[email protected]
https://lists.linuxfoundation.org/mailman/listinfo/linux-kernel-mentees
Joe Perches
maintainerQuoted 6 lines · Dwaipayan Ray
Quoted 5 lines · Joe Perches
Quoted 3 lines · Dwaipayan Ray
Quoted 2 lines · Dwaipayan Ray
The author signed-off-by checks are currently very vague. Cases like same name or same address are not handled separately.
Quoted 8 lines
Quoted 4 lines
Likely now, the type should be changed from
NO_AUTHOR_SIGN_OFFto a single something else for all the other types of messages.Since
BAD_SIGNOFFis being used for a different context, then probablyBAD_AUTHOR_SIGNOFF.Should this work or anything else you have in mind?
That may be a bit too strong a wording as these aren't significant/bad defects.
Maybe something like FROM_SIGNOFF_MISMATCH.
It's not anything that would reject the patch.
It's a pity type uses both SIGNOFF and SIGN_OFF.
Quoted 17 lines · Joe Perches
Quoted 6 lines · Dwaipayan Ray
Quoted 5 lines · Joe Perches
Quoted 3 lines · Dwaipayan Ray
Quoted 2 lines · Dwaipayan Ray
The author signed-off-by checks are currently very vague. Cases like same name or same address are not handled separately.
Quoted 8 lines
Quoted 4 lines
Likely now, the type should be changed from
NO_AUTHOR_SIGN_OFFto a single something else for all the other types of messages.Since
BAD_SIGNOFFis being used for a different context, then probablyBAD_AUTHOR_SIGNOFF.Should this work or anything else you have in mind?
Quoted 9 lines
That may be a bit too strong a wording as these aren't significant/bad defects.
Maybe something like
FROM_SIGNOFF_MISMATCH.It's not anything that would reject the patch.
It's a pity type uses both SIGNOFF and
SIGN_OFF.
Oh right sorry, It was a "visual mistake" on my part, it's SIGN_OFF indeed and not SIGNOFF.
And I agree with the strong wording. So I will probably make it FROM_SIGN_OFF_MISMATCH. And after that send in a
v6. (If I run out of single digit version numbers after this, it will be embarrassing :( ).
Thanks,
Dwaipayan.