Policy: refreshed the names of the Policy Editors.
[dbnpolicy/policy.git] / tools / license-count
1 #!/usr/bin/perl -w
2 #
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.
7 #
8 # It expects one argument, which should be the root of the Lintian laboratory.
9
10 use File::Find qw(find);
11
12 our @RULES = (
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'],
23
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)'],
27
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)'],
31
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-1.0,                  => 'CC-BY 1.0'],
36     [qr,(?m)^License:.*CC-BY-SA-1.0,               => 'CC-BY-SA 1.0'],
37     [qr,(?m)^License:.*CC-BY-2.0,                  => 'CC-BY 2.0'],
38     [qr,(?m)^License:.*CC-BY-SA-2.0,               => 'CC-BY-SA 2.0'],
39     [qr,(?m)^License:.*CC-BY-2.5,                  => 'CC-BY 2.5'],
40     [qr,(?m)^License:.*CC-BY-SA-2.5,               => 'CC-BY-SA 2.5'],
41     [qr,(?m)^License:.*CC-BY-3.0,                  => 'CC-BY 3.0'],
42     [qr,(?m)^License:.*CC-BY-SA-3.0,               => 'CC-BY-SA 3.0'],
43     [qr,(?m)^License:.*CC-BY-4.0,                  => 'CC-BY 4.0'],
44     [qr,(?m)^License:.*CC-BY-SA-4.0,               => 'CC-BY-SA 4.0'],
45     [qr,(?m)^License:.*CDDL,                       => 'CDDL'],
46     [qr,(?m)^License:.*GPL-1,                      => 'GPL 1'],
47     [qr,(?m)^License:.*LPPL,                       => 'LaTeX PPL'],
48     [qr,(?m)^License:.*MPL-1\.1,                   => 'MPL 1.1'],
49     [qr,(?m)^License:.*MPL-2\.0,                   => 'MPL 2.0'],
50     [qr,(?m)^License:.*Perl,                       => 'Artistic'],
51     [qr,(?m)^License:.*Perl,                       => 'GPL 1'],
52
53     [qr,GNU AFFERO GENERAL PUBLIC LICENSE\s+Version 3, => 'AGPL 3'],
54     [qr,(?i)The Artistic License 2\.0,             => 'Artistic 2.0'],
55     [qr,COMMON DEVELOPMENT AND DISTRIBUTION LICENSE \(CDDL\), => 'CDDL'],
56     [qr,CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL(?!-), => 'CeCILL'],
57     [qr,CeCILL FREE SOFTWARE LICENSE AGREEMENT,    => 'CeCILL'],
58     [qr,CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B, => 'CeCILL-B'],
59     [qr,CeCILL-B FREE SOFTWARE LICENSE AGREEMENT,  => 'CeCILL-B'],
60     [qr,CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-C, => 'CeCILL-C'],
61     [qr,CeCILL-C FREE SOFTWARE LICENSE AGREEMENT,  => 'CeCILL-C'],
62     [qr,(?i)creative\s+commons\s+attribution\s+1\.0, => 'CC-BY 1.0'],
63     [qr,(?i)creative\s+commons\s+attribution[-\s]+share\s*alike\s+1\.0, => 'CC-BY-SA 1.0'],
64     [qr,(?i)creative\s+commons\s+attribution\s+2\.0, => 'CC-BY 2.0'],
65     [qr,(?i)creative\s+commons\s+attribution[-\s]+share\s*alike\s+2\.0, => 'CC-BY-SA 2.0'],
66     [qr,(?i)creative\s+commons\s+attribution\s+2\.5, => 'CC-BY 2.5'],
67     [qr,(?i)creative\s+commons\s+attribution[-\s]+share\s*alike\s+2\.5, => 'CC-BY-SA 2.5'],
68     [qr,(?i)creative\s+commons\s+attribution\s+3\.0, => 'CC-BY 3.0'],
69     [qr,(?i)creative\s+commons\s+attribution[-\s]+share\s*alike\s+3\.0, => 'CC-BY-SA 3.0'],
70     [qr,(?i)creative\s+commons\s+attribution\s+4\.0, => 'CC-BY 4.0'],
71     [qr,(?i)creative\s+commons\s+attribution[-\s]+share\s*alike\s+4\.0, => 'CC-BY-SA 4.0'],
72     [qr,GNU GENERAL PUBLIC LICENSE\s+Version 1,    => 'GPL 1'],
73     [qr,LPPL Version,                              => 'LaTeX PPL (any)'],
74     [qr,LPPL Version 1\.3a,                        => 'LaTeX PPL 1.3a'],
75     [qr,LPPL Version 1\.3c,                        => 'LaTeX PPL 1.3c'],
76     [qr,MOZILLA PUBLIC LICENSE\s+Version 1\.1,     => 'MPL 1.1'],
77     [qr,Mozilla Public License Version 2\.0,       => 'MPL 2.0'],
78     [qr,SIL OPEN FONT LICENSE Version 1\.1,        => 'SIL OFL 1.1'],
79     [qr,SIL OPEN FONT LICENSE Version 1\.0,        => 'SIL OFL 1.0'],
80 );
81
82 my ($package, %counts);
83 my $n = 0;
84
85 sub check_package {
86     return unless (-d $_ && /_binary$/);
87     $File::Find::prune = 1;
88     return if (-d $_ && /_(source|udeb)$/);
89     $n++;
90     print "Checked $n packages\n" if (($n % 100) == 0);
91     local $/;
92     open (COPYRIGHT, '<', "$_/copyright") or return;
93     my $copyright = <COPYRIGHT>;
94     close COPYRIGHT;
95     my %seen;
96     study $copyright;
97     for my $rule (@RULES) {
98         if ($copyright =~ /$rule->[0]/ && !$seen{$rule->[1]}) {
99             $counts{$rule->[1]}++;
100             $seen{$rule->[1]} = 1;
101         }
102     }
103 }
104
105 unless (@ARGV == 1) {
106     die "Usage: license-count <path-to-lintian-lab>\n";
107 }
108 my $lab = $ARGV[0];
109 find (\&check_package, "$lab/pool");
110 my $length = 0;
111 for my $name (keys %counts) {
112     if (length ($name) > $length) {
113         $length = length ($name);
114     }
115 }
116 for my $name (sort keys %counts) {
117     printf "%-${length}s %5d\n", $name, $counts{$name};
118 }
119 print "\nTotal number of packages: $n\n";