Re: [PATCH] checkpatch: Validate Fixes: tag using 'commit' checks
On Sat, Aug 31, 2019 at 11:39:39AM +1000, Stephen Rothwell wrote: > Hi Sean, > > On Fri, 30 Aug 2019 09:36:58 -0700 Sean Christopherson > wrote: > > > > @@ -2803,10 +2805,15 @@ sub process { > > ($id, $description) = git_commit_info($orig_commit, > > $id, $orig_desc); > > > > - if (defined($id) && > > - ($short || $long || $space || $case || ($orig_desc > > ne $description) || !$hasparens)) { > > + > > + if (!defined($id)) { > > + if ($init_tag =~ /fixes:/i) { > > + ERROR("GIT_COMMIT_ID", > > + "Target SHA1 '$orig_commit' does > > not exist\n" . $herecurr); > > + } > > Unfortunately, git_commit_info() just returns the passed in $id (which > is explicitly set earlier) if git is not available or you are not in a > git repository (and that latter check is not entirely correct anyway). > > Also, what you really need to test is if the specified commit is an > ancestor of the place in the maintainer's tree where this patch is to > be applied. The commit may well exist in the developer's tree, but not > be in the maintainer's tree :-( True, but such an error would be caught if the maintainer or a reviewer runs checkpatch after applying the commit, e.g. I'll run checkpatch as part of reviewing a patch if I go through the effort of applying it, which admittedly isn't all that often. > This will, however, catch the cases where the SHA1 has been mistyped, > but we should encourage people not to type them anyway, instead > generating them using "git log". What about adding an example formatting command to the error message, e.g. ERROR: Target SHA1 '265381004993' does not exist, use `git show -s --pretty='format:%h ("%s")'` or similar to verify and format the commit description The same blurb could be also added to the error message for bad formatting ERROR: Please use git commit description style 'Fixes: <12+ chars of sha1> ("")', e.g. `git show -s --pretty='format:%h ("%s")'` - ie. 'Fixes: 265381004994 ("Merge tag '5.3-rc6-smb3-fixes' of git://git.samba.org/sfrench/cifs-2.6")
Re: [PATCH] checkpatch: Validate Fixes: tag using 'commit' checks
Hi Sean, On Fri, 30 Aug 2019 09:36:58 -0700 Sean Christopherson wrote: > > @@ -2803,10 +2805,15 @@ sub process { > ($id, $description) = git_commit_info($orig_commit, > $id, $orig_desc); > > - if (defined($id) && > -($short || $long || $space || $case || ($orig_desc > ne $description) || !$hasparens)) { > + > + if (!defined($id)) { > + if ($init_tag =~ /fixes:/i) { > + ERROR("GIT_COMMIT_ID", > + "Target SHA1 '$orig_commit' does > not exist\n" . $herecurr); > + } Unfortunately, git_commit_info() just returns the passed in $id (which is explicitly set earlier) if git is not available or you are not in a git repository (and that latter check is not entirely correct anyway). Also, what you really need to test is if the specified commit is an ancestor of the place in the maintainer's tree where this patch is to be applied. The commit may well exist in the developer's tree, but not be in the maintainer's tree :-( This will, however, catch the cases where the SHA1 has been mistyped, but we should encourage people not to type them anyway, instead generating them using "git log". -- Cheers, Stephen Rothwell pgpzv8UQyRPkw.pgp Description: OpenPGP digital signature
[PATCH] checkpatch: Validate Fixes: tag using 'commit' checks
Rework checkpatch's commit checking to explicitly include the Fixes: tag so that it catches errors like too short[1] or fat fingered[2] SHA1 references. Add a new Fixes-only check to verify the fixed commit is a valid object in the repository. [1] https://lkml.kernel.org/r/20190830010615.gc27...@linux.intel.com [2] https://lkml.kernel.org/r/20190825233120.18ac2...@canb.auug.org.au Cc: Stephen Rothwell Signed-off-by: Sean Christopherson --- scripts/checkpatch.pl | 39 +++ 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index 93a7edfe0f05..dead0eb41007 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -2756,10 +2756,10 @@ sub process { $line !~ /^\s*(?:Link|Patchwork|http|https|BugLink):/i && $line !~ /^This reverts commit [0-9a-f]{7,40}/ && ($line =~ /\bcommit\s+[0-9a-f]{5,}\b/i || +$line =~ /\bfixes:\s*[0-9a-f]{5,}\b/i || ($line =~ /(?:\s|^)[0-9a-f]{12,40}(?:[\s"'\(\[]|$)/i && - $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i && - $line !~ /\bfixes:\s*[0-9a-f]{12,40}/i))) { - my $init_char = "c"; + $line !~ /[\<\[][0-9a-f]{12,40}[\>\]]/i))) { + my $init_tag = ""; my $orig_commit = ""; my $short = 1; my $long = 0; @@ -2771,29 +2771,31 @@ sub process { my $orig_desc = "commit description"; my $description = ""; - if ($line =~ /\b(c)ommit\s+([0-9a-f]{5,})\b/i) { - $init_char = $1; + if ($line =~ /\b(commit)\s+([0-9a-f]{5,})\b/i || + $line =~ /\b(fixes:)\s*([0-9a-f]{5,})\b/i) { + $init_tag = $1; $orig_commit = lc($2); } elsif ($line =~ /\b([0-9a-f]{12,40})\b/i) { + $init_tag = "commit"; $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) { + $short = 0 if ($line =~ /\b$init_tag\s+[0-9a-f]{12,40}/i); + $long = 1 if ($line =~ /\b$init_tag\s+[0-9a-f]{41,}/i); + $space = 0 if ($line =~ /\b$init_tag [0-9a-f]/i); + $case = 0 if ($line =~ /\b$init_tag\s+[0-9a-f]{5,40}[^A-F]/); + if ($line =~ /\b$init_tag\s+[0-9a-f]{5,}\s+\("([^"]+)"\)/i) { $orig_desc = $1; $hasparens = 1; - } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s*$/i && + } elsif ($line =~ /\b$init_tag\s+[0-9a-f]{5,}\s*$/i && defined $rawlines[$linenr] && $rawlines[$linenr] =~ /^\s*\("([^"]+)"\)/) { $orig_desc = $1; $hasparens = 1; - } elsif ($line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("[^"]+$/i && + } elsif ($line =~ /\b$init_tag\s+[0-9a-f]{5,}\s+\("[^"]+$/i && defined $rawlines[$linenr] && $rawlines[$linenr] =~ /^\s*[^"]+"\)/) { - $line =~ /\bcommit\s+[0-9a-f]{5,}\s+\("([^"]+)$/i; + $line =~ /\b$init_tag\s+[0-9a-f]{5,}\s+\("([^"]+)$/i; $orig_desc = $1; $rawlines[$linenr] =~ /^\s*([^"]+)"\)/; $orig_desc .= " " . $1; @@ -2803,10 +2805,15 @@ sub process { ($id, $description) = git_commit_info($orig_commit, $id, $orig_desc); - if (defined($id) && - ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens)) { + + if (!defined($id)) { + if ($init_tag =~ /fixes:/i) { + ERROR("GIT_COMMIT_ID", + "Target SHA1 '$orig_commit' does not exist\n" . $herecurr); + } + } elsif ($short || $long || $space || $case || ($orig_desc ne $description) || !$hasparens) {