The new attempt at detecting missing SPDX-License-Identifier in new files is using the following logic
* When seeing a line starting 'diff --git ...' it indicates the start of a file in the patch. This must trigger reporting of violations in the previous file (if any). It must reset the validation state, since this may now be a pre-existing file being changed. This will be resolved by the next rule. * When seeing a line starting 'new file mode...' it indicates a newly created file and must enable SPDX validation. * When seeing EOF, it must trigger reporting of violations in the last new file in the patch, if any. Signed-off-by: Daniel P. Berrangé <berra...@redhat.com> --- scripts/checkpatch.pl | 56 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 54 insertions(+), 2 deletions(-) diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl index d355c0dad5..5da0f85e08 100755 --- a/scripts/checkpatch.pl +++ b/scripts/checkpatch.pl @@ -1353,7 +1353,22 @@ sub checkfilename { } } -sub checkspdx { +sub check_spdx_present { + my $expect_spdx_file = shift; + + if ($expect_spdx_file =~ + /\.(c|h|py|pl|sh|json|inc|Makefile)$/) { + # source code files MUST have SPDX license declared + ERROR("New file '$expect_spdx_file' requires " . + "'SPDX-License-Identifier'"); + } else { + # Other files MAY have SPDX license if appropriate + WARN("Does new file '$expect_spdx_file' need " . + "'SPDX-License-Identifier'?"); + } +} + +sub check_spdx_expression { my ($file, $expr) = @_; # Imported Linux headers probably have SPDX tags, but if they @@ -1442,6 +1457,8 @@ sub process { my $in_imported_file = 0; my $in_no_imported_file = 0; my $non_utf8_charset = 0; + my $expect_spdx = 0; + my $expect_spdx_file; our @report = (); our $cnt_lines = 0; @@ -1679,9 +1696,38 @@ sub process { WARN("added, moved or deleted file(s), does MAINTAINERS need updating?\n" . $herecurr); } +# All new files should have a SPDX-License-Identifier tag + if ($line =~ /^diff --git/) { + # Start of file diff marker, report last file if it failed + # SPDX validation + if (defined $expect_spdx_file) { + &check_spdx_present($expect_spdx_file); + } + + # Reset state ready to find new file + $expect_spdx = 0; + $expect_spdx_file = undef; + } elsif ($line =~ /^new file mode\s*\d+\s*$/) { + # This diff block is a new file, so we must + # mandate a SPDX tag + $expect_spdx = 1; + } elsif ($expect_spdx) { + # Capture filename if don't already have it + $expect_spdx_file = $realfile unless + defined $expect_spdx_file; + + # SPDX tags may occurr in comments which were + # stripped from '$line', so use '$rawline'. If + # we see one we pass validation + if ($rawline =~ /SPDX-License-Identifier/) { + $expect_spdx = 0; + $expect_spdx_file = undef; + } + } + # Check SPDX-License-Identifier references a permitted license if ($rawline =~ m,SPDX-License-Identifier: (.*?)(\*/)?\s*$,) { - &checkspdx($realfile, $1); + &check_spdx_expression($realfile, $1); } if ($rawline =~ m,(SPDX-[a-zA-Z0-9-_]+):,) { @@ -3213,6 +3259,12 @@ sub process { } } + # End of diff, report last file block if it failed + # SPDX validation + if (defined $expect_spdx_file) { + &check_spdx_present($expect_spdx_file); + } + if ($is_patch && $chk_signoff && $signoff == 0) { ERROR("Missing Signed-off-by: line(s)\n"); } -- 2.49.0