[libconfig-model-dpkg-perl] 11/36: copyright scanner: user can now fill the blanks...
dod at debian.org
dod at debian.org
Sat Oct 17 16:27:11 UTC 2015
This is an automated email from the git hooks/post-receive script.
dod pushed a commit to branch master
in repository libconfig-model-dpkg-perl.
commit d140ada17daf2fd0ef07624873ed44b05b42d4e4
Author: Dominique Dumont <dod at debian.org>
Date: Sun Oct 11 20:47:06 2015 +0200
copyright scanner: user can now fill the blanks...
---
lib/Dpkg/Copyright/Scanner.pm | 117 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 117 insertions(+)
diff --git a/lib/Dpkg/Copyright/Scanner.pm b/lib/Dpkg/Copyright/Scanner.pm
index 1640251..6498e5c 100644
--- a/lib/Dpkg/Copyright/Scanner.pm
+++ b/lib/Dpkg/Copyright/Scanner.pm
@@ -8,6 +8,8 @@ use IO::Pipe;
use Exporter::Lite;
use Array::IntSpan;
use Path::Tiny;
+use Carp;
+use YAML;
use feature qw/postderef signatures/;
no warnings qw/experimental::postderef experimental::signatures/;
@@ -102,6 +104,11 @@ sub scan_files ( %args ) {
}
}
+ my $current_dir = $args{from_dir} || path('.');
+ my $fill_blank_data = __load_fill_blank_data($current_dir);
+
+ my $is_debian_package = -d 'debian';
+
my %copyrights ;
my $files = {};
my $id = 0;
@@ -145,10 +152,35 @@ sub scan_files ( %args ) {
next if $l =~ /unknown/i and $c =~ /no-info-found/i;
+ # this data overrides what's found in current files. This is done before
+ # the code that merge and coaslesce entries
+ my $fill_blank = __get_fill_blank($fill_blank_data, $f);
+
+ next if $fill_blank->{skip};
+
+ if ( $c =~ /no-info-found/ and $fill_blank->{copyright} ) {
+ $c = $fill_blank->{copyright};
+ }
+ if ( $l =~/unknown/i and $fill_blank->{license} ) {
+ $l = $fill_blank->{license};
+ }
+
+ if ( $c =~ /no-info-found/ and $is_debian_package) {
+ warn "Path $f has no copyright info. Add a line in debian/fill.copyright.blank file\n";
+ }
+ if ( $l =~/unknown/i and $is_debian_package ) {
+ warn "Path $f has no license info. Add a line in debian/fill.copyright.blank file\n";
+ }
+
#say "Storing '$f' : '$c' '$l'";
$files->{$f} = $copyrights{$c}{$l} //= $id++;
}
+ my @notused = grep { ! $fill_blank_data->{$_}{used} and $_; } sort keys %$fill_blank_data ;
+ if (@notused) {
+ warn "Warning: the following entries from fill.copyright.blanks were not used\n".join("\n", at notused);
+ }
+
my @copyrights_by_id ;
foreach my $c (sort keys %copyrights) {
foreach my $l (sort keys $copyrights{$c}->%* ) {
@@ -417,6 +449,47 @@ sub __squash ($h) {
return $h;
}
+sub __load_fill_blank_data ($current_dir) {
+ my %fill_blanks ;
+ my $debian = $current_dir->child('debian'); # may be missing in test environment
+
+ if ($debian->is_dir) {
+ my @fills = $debian->children(qr/fill\.copyright\.blanks\.yml$/);
+
+ say "Note: loading @fills fixes from copyright fix files" if @fills;
+ foreach my $file ( @fills) {
+ my $yaml = $file->slurp_utf8;
+ my $data = Load $yaml;
+ foreach my $path (sort keys %$data) {
+ if ($fill_blanks{$path}) {
+ say "Warning: skipping duplicated fill blank path $path from file $file";
+ }
+ else {
+ $fill_blanks{$path} = $data->{$path};
+ }
+
+ foreach my $k (keys $fill_blanks{$path}->%*) {
+ die "Error in file $file: Unexpected key '$k' in path '$path'\n"
+ unless $k =~/^(skip|license|copyright)$/;
+ }
+ }
+ }
+ }
+
+ return \%fill_blanks;
+}
+
+sub __get_fill_blank ($fbd,$file) {
+
+ foreach my $path (sort keys %$fbd) {
+ if ($file =~ m(^$path)) {
+ $fbd->{$path}{used} = 1;
+ return $fbd->{$path};
+ }
+ }
+ return {};
+}
+
1;
__END__
@@ -443,6 +516,50 @@ license information. Information are packed in a way to ease review and
maintenance. Files information is grouped with wildcards ('*') to reduce
the list of files.
+=head1 Filling the blanks
+
+Sometimes, upstream coders are not perfect: some source files cannot
+be parsed correctly or some legal information is missing.
+
+A file without copyright and license information is skipped.
+
+On the other hand, a file with either copyright or license missing
+will be used. Unfortunately, this will prevent a correct grouping and
+merging of copyright entries.
+
+Instead of patching upstream source files to fill the blank, you can
+specify the missing information in a special file. THis file is
+C<debian/fill.copyright.blanks.yml>. It should contain a "mapping"
+YAML structure (i.e. a hash), where the key is a Perl pattern used to
+match a path. E.g:
+
+ ---
+ debian:
+ copyright: 2015, Marcel
+ license: Expat
+ share/pkgs/openSUSE/systemd/onedsetup:
+ copyright: 2015, Marcel
+ share/vendor/ruby/gems/rbvmomi/lib/rbvmomi.*\.rb:
+ license: Expat
+ .*/NOTICE:
+ skip: 1
+ share/websockify/:
+ license: LGPL-2
+ src/sunstone/:
+ license: Apache-2.0
+
+Pattern are matched from the beginning a
+path. I.e. C<share/websockify/> pattern will match
+C<share/websockify/foo.rb> but will not match
+C<web/share/websockify/foo.rb>.
+
+The C<license> key must contain a license short name as returned by
+C<license_check>.
+
+When C<skip> is true, the file is skipped like a file without any
+information.
+
+
=head1 METHODS
=head2 print_copyright
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-perl/packages/libconfig-model-dpkg-perl.git
More information about the Pkg-perl-cvs-commits
mailing list