Commit text is almost always necessary to explain why a change is needed.
Also, warn on commit text lines longer than 75 characters. The commit text
are indented and may wrap on a terminal if they are longer than 75
characters.

Signed-off-by: David Keitel <dkei...@codeaurora.org>
Signed-off-by: Prakruthi Deepak Heragu <pher...@codeaurora.org>
---
 scripts/checkpatch.pl | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 91 insertions(+), 1 deletion(-)

diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
index a9c0550..336a8e5 100755
--- a/scripts/checkpatch.pl
+++ b/scripts/checkpatch.pl
@@ -14,6 +14,13 @@ use File::Basename;
 use Cwd 'abs_path';
 use Term::ANSIColor qw(:constants);
 
+use constant BEFORE_SHORTTEXT => 0;
+use constant IN_SHORTTEXT_BLANKLINE => 1;
+use constant IN_SHORTTEXT => 2;
+use constant AFTER_SHORTTEXT => 3;
+use constant CHECK_NEXT_SHORTTEXT => 4;
+use constant SHORTTEXT_LIMIT => 75;
+
 my $P = $0;
 my $D = dirname(abs_path($P));
 
@@ -2227,6 +2234,8 @@ sub process {
        my $prevrawline="";
        my $stashline="";
        my $stashrawline="";
+       my $subjectline="";
+       my $sublinenr="";
 
        my $length;
        my $indent;
@@ -2282,6 +2291,9 @@ sub process {
        my $setup_docs = 0;
 
        my $camelcase_file_seeded = 0;
+       my $shorttext = BEFORE_SHORTTEXT;
+       my $shorttext_exspc = 0;
+       my $commit_text_present = 0;
 
        my $checklicenseline = 1;
 
@@ -2487,13 +2499,91 @@ sub process {
                        $checklicenseline = 1;
                        next;
                }
-
                $here .= "FILE: $realfile:$realline:" if ($realcnt != 0);
 
                my $hereline = "$here\n$rawline\n";
                my $herecurr = "$here\n$rawline\n";
                my $hereprev = "$here\n$prevrawline\n$rawline\n";
 
+               if ($shorttext != AFTER_SHORTTEXT) {
+                       if ($shorttext == IN_SHORTTEXT_BLANKLINE && 
$line=~/\S/) {
+                               # the subject line was just processed,
+                               # a blank line must be next
+                               $shorttext = IN_SHORTTEXT;
+                               # this non-blank line may or may not be commit 
text -
+                               # a warning has been generated so assume it is 
commit
+                               # text and move on
+                               $commit_text_present = 1;
+                               # fall through and treat this line as 
IN_SHORTTEXT
+                       }
+                       if ($shorttext == IN_SHORTTEXT) {
+                               if ($line=~/^---/ || $line=~/^diff.*/) {
+                                       if ($commit_text_present == 0) {
+                                               WARN("NO_COMMIT_TEXT",
+                                                    "please add commit text 
explaining " .
+                                                    "*why* the change is 
needed\n" .
+                                                    $herecurr);
+                                       }
+                                       $shorttext = AFTER_SHORTTEXT;
+                               } elsif (length($line) > (SHORTTEXT_LIMIT +
+                                                         $shorttext_exspc)
+                                        && $line !~ /^:([0-7]{6}\s){2}
+                                                     ([[:xdigit:]]+\.*
+                                                      \s){2}\w+\s\w+/xms) {
+                                       WARN("LONG_COMMIT_TEXT",
+                                            "commit text line over " .
+                                            SHORTTEXT_LIMIT .
+                                            " characters\n" . $herecurr);
+                                               $commit_text_present = 1;
+                               } elsif ($line=~/^\s*[\x21-\x39\x3b-\x7e]+:/) {
+                                       # this is a tag, there must be commit
+                                       # text by now
+                                       if ($commit_text_present == 0) {
+                                               WARN("NO_COMMIT_TEXT",
+                                                    "please add commit text 
explaining " .
+                                                    "*why* the change is 
needed\n" .
+                                                    $herecurr);
+                                               # prevent duplicate warnings
+                                               $commit_text_present = 1;
+                                       }
+                               } elsif ($line=~/\S/) {
+                                       $commit_text_present = 1;
+                               }
+                       } elsif ($shorttext == IN_SHORTTEXT_BLANKLINE) {
+                               # case of non-blank line in this state handled 
above
+                               $shorttext = IN_SHORTTEXT;
+                       } elsif ($shorttext == CHECK_NEXT_SHORTTEXT) {
+# The Subject line doesn't have to be the last header in the patch.
+# Avoid moving to the IN_SHORTTEXT state until clear of all headers.
+# Per RFC5322, continuation lines must be folded, so any left-justified
+# text which looks like a header is definitely a header.
+                               if ($line!~/^[\x21-\x39\x3b-\x7e]+:/) {
+                                       # Every rolled over summary-line leaves
+                                       # a space at the beginning
+                                       if ($line !~ /^\s/) {
+                                               $shorttext = IN_SHORTTEXT;
+                                               if (length($line) != 0) {
+                                                       $commit_text_present = 
1;
+                                               }
+                                       }
+                               }
+                       # The next two cases are BEFORE_SHORTTEXT.
+                       } elsif ($line=~/^Subject: \[[^\]]*\] (.*)/) {
+                               # This is the subject line. Go to
+                               # CHECK_NEXT_SHORTTEXT to wait for the commit
+                               # text to show up.
+                               $shorttext = CHECK_NEXT_SHORTTEXT;
+                               $subjectline = $line;
+                               $sublinenr = "#$linenr & ";
+                       } elsif ($line=~/^    (.*)/) {
+                               # Indented format, this must be the summary
+                               # line (i.e. git show). There will be no more
+                               # headers so we are now in the shorttext.
+                               $shorttext = IN_SHORTTEXT_BLANKLINE;
+                               $shorttext_exspc = 4;
+                       }
+               }
+
                $cnt_lines++ if ($realcnt != 0);
 
 # Check if the commit log has what seems like a diff which can confuse patch
-- 
The Qualcomm Innovation Center, Inc. is a member of the Code Aurora Forum,
a Linux Foundation Collaborative Project

Reply via email to