3 # This script walks through a Lintian laboratory and counts license usage
4 # based on matching regexes against the contents of the copyright files. It's
5 # intended to provide a rough estimate of the number of packages using a
6 # particular license when discussing whether to add a license to base-files.
8 # It expects one argument, which should be the root of the Lintian laboratory.
10 use File::Find qw(find);
13 [qr,/usr/share/common-licenses/Apache-2.0, => 'Apache 2.0'],
14 [qr,/usr/share/common-licenses/Artistic, => 'Artistic'],
15 [qr,/usr/share/common-licenses/BSD, => 'BSD (common-licenses)'],
16 [qr,/usr/share/common-licenses/GFDL-1.2, => 'GFDL 1.2'],
17 [qr,/usr/share/common-licenses/GFDL-1.3, => 'GFDL 1.3'],
18 [qr,/usr/share/common-licenses/GPL-2, => 'GPL 2'],
19 [qr,/usr/share/common-licenses/GPL-3, => 'GPL 3'],
20 [qr,/usr/share/common-licenses/LGPL-2, => 'LGPL 2'],
21 [qr,/usr/share/common-licenses/LGPL-2.1, => 'LGPL 2.1'],
22 [qr,/usr/share/common-licenses/LGPL-3, => 'LGPL 3'],
24 [qr,/usr/share/common-licenses/GFDL(?!-), => 'GFDL (symlink)'],
25 [qr,/usr/share/common-licenses/GPL(?!-), => 'GPL (symlink)'],
26 [qr,/usr/share/common-licenses/LGPL(?!-), => 'LGPL (symlink)'],
28 [qr,/usr/share/common-licenses/GFDL, => 'GFDL (any)'],
29 [qr,/usr/share/common-licenses/GPL, => 'GPL (any)'],
30 [qr,/usr/share/common-licenses/LGPL, => 'LGPL (any)'],
32 [qr,(?m)^License:.*AGPL-3, => 'AGPL 3'],
33 [qr,(?m)^License:.*Artistic(?!-), => 'Artistic'],
34 [qr,(?m)^License:.*Artistic-2, => 'Artistic 2.0'],
35 [qr,(?m)^License:.*CC-BY-3.0, => 'CC-BY 3.0'],
36 [qr,(?m)^License:.*CC-BY-SA-3.0, => 'CC-BY-SA 3.0'],
37 [qr,(?m)^License:.*CDDL, => 'CDDL'],
38 [qr,(?m)^License:.*GPL-1, => 'GPL 1'],
39 [qr,(?m)^License:.*LPPL, => 'LaTeX PPL'],
40 [qr,(?m)^License:.*MPL-1\.1, => 'MPL 1.1'],
41 [qr,(?m)^License:.*Perl, => 'Artistic'],
42 [qr,(?m)^License:.*Perl, => 'GPL 1'],
44 [qr,GNU AFFERO GENERAL PUBLIC LICENSE\s+Version 3, => 'AGPL 3'],
45 [qr,(?i)The Artistic License 2\.0, => 'Artistic 2.0'],
46 [qr,COMMON DEVELOPMENT AND DISTRIBUTION LICENSE \(CDDL\), => 'CDDL'],
47 [qr,CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL(?!-), => 'CeCILL'],
48 [qr,CeCILL FREE SOFTWARE LICENSE AGREEMENT, => 'CeCILL'],
49 [qr,CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B, => 'CeCILL-B'],
50 [qr,CeCILL-B FREE SOFTWARE LICENSE AGREEMENT, => 'CeCILL-B'],
51 [qr,CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-C, => 'CeCILL-C'],
52 [qr,CeCILL-C FREE SOFTWARE LICENSE AGREEMENT, => 'CeCILL-C'],
53 [qr,(?i)creative\s+commons\s+attribution\s+3\.0, => 'CC-BY 3.0'],
54 [qr,(?i)creative\s+commons\s+attribution[-\s]+share\s*alike\s+3\.0, => 'CC-BY-SA 3.0'],
55 [qr,GNU GENERAL PUBLIC LICENSE\s+Version 1, => 'GPL 1'],
56 [qr,LPPL Version, => 'LaTeX PPL (any)'],
57 [qr,LPPL Version 1\.3a, => 'LaTeX PPL 1.3a'],
58 [qr,LPPL Version 1\.3c, => 'LaTeX PPL 1.3c'],
59 [qr,MOZILLA PUBLIC LICENSE\s+Version 1\.1, => 'MPL 1.1'],
60 [qr,SIL OPEN FONT LICENSE Version 1\.1, => 'SIL OFL 1.1'],
61 [qr,SIL OPEN FONT LICENSE Version 1\.0, => 'SIL OFL 1.0'],
64 my ($package, %counts);
68 return unless (-d $_ && /_binary$/);
69 $File::Find::prune = 1;
70 return if (-d $_ && /_(source|udeb)$/);
72 print "Checked $n packages\n" if (($n % 100) == 0);
74 open (COPYRIGHT, '<', "$_/copyright") or return;
75 my $copyright = <COPYRIGHT>;
79 for my $rule (@RULES) {
80 if ($copyright =~ /$rule->[0]/ && !$seen{$rule->[1]}) {
81 $counts{$rule->[1]}++;
82 $seen{$rule->[1]} = 1;
88 die "Usage: license-count <path-to-lintian-lab>\n";
91 find (\&check_package, "$lab/pool");
93 for my $name (keys %counts) {
94 if (length ($name) > $length) {
95 $length = length ($name);
98 for my $name (sort keys %counts) {
99 printf "%-${length}s %5d\n", $name, $counts{$name};
101 print "\nTotal number of packages: $n\n";