If a patch contains a commit reference that happens to span 3 lines, e.g.: === With the optimizations for TLB invalidation from commit 0cef77c7798a ("powerpc/64s/radix: flush remote CPUs out of single-threaded mm_cpumask"), the scope of a TLBI (global vs. local) can now be influenced by the value of the 'copros' counter of the memory context. ===
checkpatch will return a GIT_COMMIT_ID error even though the reference actually follows the correct format. Fix the GIT_COMMIT_ID test so it can match against a reference that spans 3 lines. Reported-by: Frederic Barrat <fbar...@linux.ibm.com> Signed-off-by: Andrew Donnellan <andrew.donnel...@au1.ibm.com> --- Sending this as an RFC because I don't actually know how to Perl or regex, this whole test looks pretty gross and this patch just makes it gross-er, and it's only lightly tested. Suggestions on how to do this more neatly are welcome. We currently have checkpatch running on every incoming patch on linuxppc-dev, and we've already hit this bug at least twice in the past couple of weeks. --- scripts/checkpatch.pl | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 447857ffaf6b..aca4d758112a 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -2669,27 +2669,60 @@ sub process { } elsif ($line =~ /\b([0-9a-f]{12,40})\b/i) { $orig_commit = lc($1); } - $short = 0 if ($line =~ /\bcommit\s+[0-9a-f]{12,40}/i); $long = 1 if ($line =~ /\bcommit\s+[0-9a-f]{41,}/i); $space = 0 if ($line =~ /\bcommit [0-9a-f]/i); $case = 0 if ($line =~ /\b[Cc]ommit\s+[0-9a-f]{5,40}[^A-F]/); + if ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)"\)/i) { + # Reference fits on 1 line $orig_desc = $1; $hasparens = 1; } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i && defined $rawlines[$linenr] && $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) { + # line 1: 'commit <hash>', + # line 2: '("description")' $orig_desc = $1; $hasparens = 1; } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("[^"]+$/i && defined $rawlines[$linenr] && $rawlines[$linenr] =~ /^\s*[^"]+"\)/) { + # line 1: 'commit <hash> ("description', + # line 2: 'description continued")' $line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)$/i; $orig_desc = $1; $rawlines[$linenr] =~ /^\s*([^"]+)"\)/; $orig_desc .= " " . $1; $hasparens = 1; + } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i && + defined $rawlines[$linenr] && + defined $rawlines[$linenr + 1] && + $rawlines[$linenr] =~ /^\s*\("[^"]+/ && + $rawlines[$linenr + 1] =~ /^\s*[^"]+"\)/) { + # line 1: 'commit <hash>', + # line 2: '("description' + # line 3: 'description continued")' + $rawlines[$linenr] =~ /^\s*\("([^"]+)/; + $orig_desc = $1; + $rawlines[$linenr + 1] =~ /^\s*([^"]+)"\)/; + $orig_desc .= " " . $1; + $hasparens = 1; + } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("[^"]+$/i && + defined $rawlines[$linenr] && + defined $rawlines[$linenr + 1] && + $rawlines[$linenr] =~ /^\s*[^"]+$/ && + $rawlines[$linenr + 1] =~ /^\s*[^"]+"\)/) { + # line 1: 'commit <hash> ("description', + # line 2: 'description continued' + # line 3: 'description continued")' + $line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)$/i; + $orig_desc = $1; + $rawlines[$linenr] =~ /^\s*([^"]+)$/; + $orig_desc .= " " . $1; + $rawlines[$linenr + 1] =~ /^\s*([^"]+)"\)/; + $orig_desc .= " " . $1; + $hasparens = 1; } ($id, $description) = git_commit_info($orig_commit, -- 2.11.0