From: Russ Allbery Date: Wed, 9 Jun 2010 18:25:25 +0000 (-0700) Subject: Add a script to count license usage in Debian X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=56fbd4c9c27ba807bb7fc10cc1ec18d54a22c99a;p=debian%2Fdebian-policy.git Add a script to count license usage in Debian Add tools/license-count, which takes the path to a Lintian lab and counts license usage in Debian using regular expression matches against the text of the debian/copyright file. --- diff --git a/tools/license-count b/tools/license-count new file mode 100755 index 0000000..1a52f50 --- /dev/null +++ b/tools/license-count @@ -0,0 +1,87 @@ +#!/usr/bin/perl -w +# +# This script walks through a Lintian laboratory and counts license usage +# based on matching regexes against the contents of the copyright files. It's +# intended to provide a rough estimate of the number of packages using a +# particular license when discussing whether to add a license to base-files. +# +# It expects one argument, which should be the root of the Lintian laboratory. + +our @RULES = ( + [qr,/usr/share/common-licenses/Apache-2.0, => 'Apache 2.0'], + [qr,/usr/share/common-licenses/Artistic, => 'Artistic'], + [qr,/usr/share/common-licenses/BSD, => 'BSD (common-licenses)'], + [qr,/usr/share/common-licenses/GFDL-1.2, => 'GFDL 1.2'], + [qr,/usr/share/common-licenses/GFDL-1.3, => 'GFDL 1.3'], + [qr,/usr/share/common-licenses/GPL-2, => 'GPL 2'], + [qr,/usr/share/common-licenses/GPL-3, => 'GPL 3'], + [qr,/usr/share/common-licenses/LGPL-2, => 'LGPL 2'], + [qr,/usr/share/common-licenses/LGPL-2.1, => 'LGPL 2.1'], + [qr,/usr/share/common-licenses/LGPL-3, => 'LGPL 3'], + + [qr,/usr/share/common-licenses/GFDL(?!-), => 'GFDL (symlink)'], + [qr,/usr/share/common-licenses/GPL(?!-), => 'GPL (symlink)'], + [qr,/usr/share/common-licenses/LGPL(?!-), => 'LGPL (symlink)'], + + [qr,(?m)^License:.*Artistic(?!-), => 'Artistic'], + [qr,(?m)^License:.*Artistic-2, => 'Artistic 2.0'], + [qr,(?m)^License:.*CC-BY-3.0, => 'CC-BY 3.0'], + [qr,(?m)^License:.*CC-BY-SA-3.0, => 'CC-BY-SA 3.0'], + [qr,(?m)^License:.*CDDL, => 'CDDL'], + [qr,(?m)^License:.*GPL-1, => 'GPL 1'], + [qr,(?m)^License:.*LPPL, => 'LaTeX PPL'], + [qr,(?m)^License:.*MPL-1\.1, => 'MPL 1.1'], + [qr,(?m)^License:.*Perl, => 'Artistic'], + [qr,(?m)^License:.*Perl, => 'GPL 1'], + + [qr,The Artistic License 2\.0, => 'Artistic 2.0'], + [qr,COMMON DEVELOPMENT AND DISTRIBUTION LICENSE \(CDDL\), => 'CDDL'], + [qr,CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL(?!-), => 'CeCILL'], + [qr,CeCILL FREE SOFTWARE LICENSE AGREEMENT, => 'CeCILL'], + [qr,CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-B, => 'CeCILL-B'], + [qr,CeCILL-B FREE SOFTWARE LICENSE AGREEMENT, => 'CeCILL-B'], + [qr,CONTRAT DE LICENCE DE LOGICIEL LIBRE CeCILL-C, => 'CeCILL-C'], + [qr,CeCILL-C FREE SOFTWARE LICENSE AGREEMENT, => 'CeCILL-C'], + [qr,(?i)creative\s+commons\s+attribution\s+3\.0, => 'CC-BY 3.0'], + [qr,(?i)creative\s+commons\s+attribution[-\s]+share\s*alike\s+3\.0, => 'CC-BY-SA 3.0'], + [qr,GNU GENERAL PUBLIC LICENSE\s+Version 1, => 'GPL 1'], + [qr,LPPL Version 1.3c, => 'LaTeX PPL'], + [qr,MOZILLA PUBLIC LICENSE\s+Version 1\.1, => 'MPL 1.1'], + [qr,SIL OPEN FONT LICENSE Version 1\.1, => 'SIL OFL 1.1'], + [qr,SIL OPEN FONT LICENSE Version 1\.0, => 'SIL OFL 1.0'], +); + +unless (@ARGV == 1) { + die "Usage: license-count \n"; +} +my $lab = $ARGV[0]; +opendir (LAB, "$lab/binary") or die "$0: cannot open $lab/binary: $!\n"; +my ($package, %counts); +my $n = 0; +while (defined ($package = readdir LAB)) { + next if ($package =~ /^\./); + $n++; + print "Checked $n packages\n" if (($n % 100) == 0); + local $/; + open (COPYRIGHT, '<', "$lab/binary/$package/copyright") or next; + my $copyright = ; + close COPYRIGHT; + my %seen; + study $copyright; + for my $rule (@RULES) { + if ($copyright =~ /$rule->[0]/ && !$seen{$rule->[1]}) { + $counts{$rule->[1]}++; + $seen{$rule->[1]} = 1; + } + } +} +closedir LAB; +my $length = 0; +for my $name (keys %counts) { + if (length ($name) > $length) { + $length = length ($name); + } +} +for my $name (sort keys %counts) { + printf "%-${length}s %5d\n", $name, $counts{$name}; +}