~saiarcot895/chromium-browser/chromium-browser.vivid.dev

« back to all changes in this revision

Viewing changes to debian/licensecheck.pl

  • Committer: Saikrishna Arcot
  • Date: 2013-03-08 22:57:16 UTC
  • Revision ID: saiarcot895@gmail.com-20130308225716-1c60fatbyjqc4d2j
Initial commit

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/perl -w
 
2
 
 
3
# Check licenses of a large subtree. It uses licensecheck from devscripts
 
4
# then postprocess the results
 
5
# (c) 2009, Fabien Tassin <fta@sofaraway.org>
 
6
 
 
7
# This program is free software; you can redistribute it and/or
 
8
# modify it under the terms of the GNU General Public License as
 
9
# published by the Free Software Foundation; either version 2, or (at
 
10
# your option) any later version.
 
11
#
 
12
# This program is distributed in the hope that it will be useful, but
 
13
# WITHOUT ANY WARRANTY; without even the implied warranty of
 
14
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 
15
# General Public License for more details.
 
16
#
 
17
# You should have received a copy of the GNU General Public License along
 
18
# with this program; if not, write to the Free Software Foundation, Inc.,
 
19
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
 
20
 
 
21
use strict;
 
22
use Getopt::Std;
 
23
 
 
24
my $white_listed_licenses = [
 
25
  'global BSD-style Chromium',
 
26
  'global BSD-style libjingle',
 
27
  'Public domain',
 
28
  'Apache (v2.0)',
 
29
  'Apache (v2.0) GENERATED FILE',
 
30
  'Apache (v2.0) BSD (2 clause)',
 
31
  'BSD (2 clause)',
 
32
  'BSD (2 clause) GENERATED FILE',
 
33
  'BSD (2 clause)/LGPL 2 (or later)/LGPL 2.1 (or later)',
 
34
  'BSD (2 or 3 clause)',
 
35
  'BSD (3 clause)',
 
36
  'BSD (3 clause) GENERATED FILE',
 
37
  'BSD (2 clause) MIT/X11 (BSD like)',
 
38
  'BSL (v1)',
 
39
  'BSL (v1) BSD (3 clause) GENERATED FILE',
 
40
  'ICU-License',
 
41
  'GPL (with incorrect FSF address)',
 
42
  'GPL (unversioned/unknown version)',
 
43
  'GPL (v2 or later)',
 
44
  'GPL (v2 or later) compatible',
 
45
  'GPL (v2 or later) (with incorrect FSF address)',
 
46
  'GPL (v2 or later) GENERATED FILE',
 
47
  'GPL 2.0/LGPL 2.1/MPL 1.1 tri-license',
 
48
  'GPL (v3 or later)',
 
49
  'harfbuzz-License',
 
50
  'ISC GENERATED FILE',
 
51
  'ISC',
 
52
  'LGPL',
 
53
  'LGPL (v2)',
 
54
  'LGPL (v2 or later)',
 
55
  'LGPL (v2 or later) GENERATED FILE',
 
56
  'LGPL (v2.1 or later) GENERATED FILE',
 
57
  'LGPL (v2 or later) (with incorrect FSF address)',
 
58
  'LGPL (v2 or later) (with incorrect FSF address) GENERATED FILE',
 
59
  'LGPL (v2.1)',
 
60
  'LGPL (v2.1 or later)',
 
61
  'LGPL (v2.1 or later) (with incorrect FSF address)',
 
62
  'MIT/X11 (BSD like)',
 
63
  'MIT/X11 (BSD like) GENERATED FILE',
 
64
  'MIT/X11-like (expat)',
 
65
  'MPL (v1.1,) GPL (unversioned/unknown version) LGPL (v2.1 or later)',
 
66
  'MPL (v1.1,) GPL (unversioned/unknown version) LGPL (v2 or later)',
 
67
  'MPL (v1.1,) BSD (3 clause) GPL (unversioned/unknown version) LGPL (v2.1 or later)',
 
68
  'MPL (v1.1) GPL (unversioned/unknown version)',
 
69
  'MPL (v1.1) GPL (unversioned/unknown version) GENERATED FILE',
 
70
  'MPL 1.1/GPL 2.0/LGPL 2.1',
 
71
  'Paul Hsieh\'s Public Domain Option',
 
72
  'SGI Free Software B License (v2.0)',
 
73
  'zlib/libpng',
 
74
  'GENERATED FILE',
 
75
  '*No copyright* Apache (v2.0)',
 
76
  '*No copyright* BSD (2 clause)',
 
77
  '*No copyright* GPL (v2 or later)',
 
78
  '*No copyright* LGPL (v2 or later)',
 
79
  '*No copyright* LGPL (v2.1 or later)',
 
80
  '*No copyright* LGPL (v2 or later) (with incorrect FSF address) GENERATED FILE',
 
81
  '*No copyright* GENERATED FILE',
 
82
  '*No copyright* Public domain',
 
83
  'ZERO-CODE-FILES or GENERATED',
 
84
];
 
85
 
 
86
my $manually_identified = {
 
87
  '/base/third_party/dmg_fp/'   => [
 
88
    'MIT/X11 (BSD like)',
 
89
    'Copyright (c) 1991, 2000, 2001 by Lucent Technologies.'
 
90
  ],
 
91
  '/base/third_party/purify/pure_api.c'   => [
 
92
    'Public domain',
 
93
    'Explicitly no copyright'
 
94
  ],
 
95
  '/base/third_party/purify/pure.h'   => [
 
96
    'Public domain',
 
97
    '(C) Copyright IBM Corporation. 2006, 2006. All Rights Reserved.'
 
98
  ],
 
99
  '/third_party/sqlite/'   => [
 
100
    'Public domain',
 
101
    'The author disclaims all copyright. The library is in the public domain.'
 
102
  ],
 
103
  '/src/chrome/'   => [
 
104
    'BSD (3 clause)',
 
105
    'No copyright'
 
106
  ],
 
107
  '/depot_tools/tests/pymox/'   => [
 
108
    'Apache (v2.0)',
 
109
    'No copyright'
 
110
  ],
 
111
  '/googleurl/'   => [
 
112
    'BSD (3 clause)',
 
113
    'No copyright'
 
114
  ],
 
115
  '/gpu/command_buffer/common/GLES2/'   => [
 
116
    'SGI Free Software B License (v2.0)',
 
117
    'No copyright'
 
118
  ],
 
119
  '/media/tools/qt_faststart/qt_faststart.c'   => [
 
120
    'Public domain',
 
121
    'No copyright'
 
122
  ],
 
123
  '/native_client/src/third_party/libxt/'   => [
 
124
    'MIT/X11 (BSD like)',
 
125
    'No copyright'
 
126
  ],
 
127
  '/native_client/'   => [
 
128
    'BSD (3 clause)',
 
129
    'No copyright'
 
130
  ],
 
131
  '/v8/test/cctest/'   => [
 
132
    'BSD (3 clause)',
 
133
    'No copyright'
 
134
  ],
 
135
  '/third_party/WebKit/WebKitLibraries/WebCoreSQLite3/' => [
 
136
    'Public domain',
 
137
    'The author disclaims all copyright. The library is in the public domain.'
 
138
  ],
 
139
  '/third_party/zlib/' => [
 
140
    'zlib/libpng',
 
141
    'This software is provided \'as-is\', without any express or implied'
 
142
  ],
 
143
  '/third_party/lzma_sdk/' => [
 
144
    'Public domain',
 
145
    'LZMA SDK is placed in the public domain.'
 
146
  ],
 
147
  '/third_party/hunspell/src/hunspell/' => [
 
148
    'MPL 1.1/GPL 2.0/LGPL 2.1',
 
149
    'The contents of this file are subject to the Mozilla Public License Version 1.1 (the "License")'
 
150
  ],
 
151
  '/webkit/data/layout_tests' => [
 
152
    'global BSD-style Webkit/LGPL 2.1',
 
153
    'http://webkit.org/projects/goals.html'
 
154
  ],
 
155
  '/third_party/WebKit/JavaScriptCore/icu' => [
 
156
    'ICU-License',
 
157
    'Copyright (c) 1995-2006 International Business Machines Corporation and others'
 
158
  ],
 
159
  '/third_party/WebKit/WebCore/icu/' => [
 
160
    'ICU-License',
 
161
    'Copyright (c) 1995-2006 International Business Machines Corporation and others'
 
162
  ],
 
163
  '/third_party/icu/' => [
 
164
    'ICU-License',
 
165
    'Copyright (c) 1995-2009 International Business Machines Corporation and others'
 
166
  ],
 
167
  '/third_party/harfbuzz/' => [
 
168
    'harfbuzz-License',
 
169
    'Copyright: 2000-2009 Red Hat, Inc'
 
170
  ],
 
171
  '/third_party/WebKit/JavaScriptCore/ForwardingHeaders/' => [
 
172
    'ZERO-CODE-FILES or GENERATED',
 
173
    'No copyright'
 
174
  ],
 
175
  '/third_party/WebKit/WebCore/ForwardingHeaders/' => [
 
176
    'ZERO-CODE-FILES or GENERATED',
 
177
    'No copyright'
 
178
  ],
 
179
  'build-tree/src/third_party/WebKit/WebCore/' => [
 
180
    'BSD (2 clause)/LGPL 2 (or later)/LGPL 2.1 (or later)',
 
181
    'No copyright'
 
182
  ],
 
183
  'third_party/WebKit/JavaScriptCore/' => [
 
184
    'BSD (2 clause)/LGPL 2 (or later)/LGPL 2.1 (or later)',
 
185
    'No copyright'
 
186
  ],
 
187
  'version.h' => [
 
188
    'ZERO-CODE-FILES or GENERATED',
 
189
    'No copyright'
 
190
  ],
 
191
  '/third_party/libjingle/files/talk/' => [
 
192
    'global BSD-style libjingle',
 
193
    'No copyright'
 
194
  ],
 
195
  '/third_party/skia/' => [
 
196
    'Apache (v2.0)',
 
197
    'No copyright'
 
198
  ],
 
199
  '/third_party/hunspell/' => [
 
200
    'GPL 2.0/LGPL 2.1/MPL 1.1 tri-license',
 
201
    'No copyright'
 
202
  ],
 
203
  '/third_party/expat/' => [
 
204
    'MIT/X11-like (expat)',
 
205
    'No copyright'
 
206
  ],
 
207
  '/third_party/yasm/source/patched-yasm/modules/parsers/nasm/' => [
 
208
    'LGPL',
 
209
    'No copyright'
 
210
  ],
 
211
  '/third_party/yasm/source/patched-yasm/modules/preprocs/' => [
 
212
    'LGPL',
 
213
    'No copyright'
 
214
  ],
 
215
  '/third_party/yasm/source/patched-yasm/modules/' => [
 
216
    'BSD (2 or 3 clause)',
 
217
    'No copyright'
 
218
  ],
 
219
  '/third_party/yasm/source/patched-yasm/tools/python-yasm/' => [
 
220
    'LGPL',
 
221
    'No copyright'
 
222
  ],
 
223
  '/third_party/yasm/' => [
 
224
    'GPL (v2 or later) compatible',
 
225
    'Copyright (c) 2001-2009 Peter Johnson and other Yasm developers.'
 
226
  ],
 
227
  '/third_party/tlslite/' => [
 
228
    'Public domain',
 
229
    'No copyright'
 
230
  ],
 
231
  '/third_party/ffmpeg/' => [
 
232
    'GPL (v2 or later) compatible',
 
233
    'No copyright'
 
234
  ],
 
235
  '/third_party/libevent/' => [
 
236
    'BSD (3 clause)',
 
237
    'No copyright'
 
238
  ],
 
239
  '/third_party/protobuf2/src/' => [
 
240
    'BSD (3 clause)',
 
241
    'No copyright'
 
242
  ],
 
243
  '/third_party/tcmalloc/tcmalloc/' => [
 
244
    'BSD (3 clause)',
 
245
    'No copyright'
 
246
  ],
 
247
  '/third_party/xdg-utils/' => [
 
248
    'MIT/X11 (BSD like)',
 
249
    'No copyright'
 
250
  ],
 
251
  '/net/disk_cache/hash.cc' => [
 
252
    'Paul Hsieh\'s Public Domain Option',
 
253
    'No copyright'
 
254
  ],
 
255
};
 
256
 
 
257
my $opt = {};
 
258
getopts('ah', $opt) || &Usage();
 
259
&Usage() if $$opt{'h'};
 
260
 
 
261
sub Usage {
 
262
  die "Usage: $0 [options] directory\n" .
 
263
    "  -a           display all licenses found (default will hide whitelisted licenses)\n" .
 
264
    "  -h           this help screen\n";
 
265
}
 
266
 
 
267
my $dir = shift @ARGV;
 
268
 
 
269
sub get_license {
 
270
  my $file      = shift;
 
271
  my $license   = shift;
 
272
  my $copyright = shift;
 
273
 
 
274
  return("empty file", "empty") if -z $file;
 
275
  open(FILE, $file) || die "Can't open $file: $!\n";
 
276
  my $maxline = 60;
 
277
  my $linenum = 0;
 
278
  while (!eof(FILE) && defined (my $line = <FILE>) && $linenum < $maxline) {
 
279
    $linenum++;
 
280
    next unless $line =~ m/Copyright/i;
 
281
    chomp $line;
 
282
    # Remove indents/comments
 
283
    $line =~ s,^\s*(\#|/\*|//)\s*,,;
 
284
    # remove everything before the copyright
 
285
    $line =~ s/.*(Copyright)/$1/i;
 
286
    my $text = $line;
 
287
     while (!eof(FILE) && defined (my $line = <FILE>) && $linenum < $maxline) {
 
288
       chomp $line;
 
289
       # Remove indents/comments
 
290
       $line =~ s,^\s*(\#|/\*|//)\s*,,;
 
291
       $text .= " " .$line;
 
292
       $text =~ m/Copyright.*?The Chromium Authors. All rights reserved.*?BSD-style license.*?found.*?in the.*?LICENSE file/ && do {
 
293
         close FILE;
 
294
         return("global BSD-style Chromium", $text);
 
295
       } ||
 
296
       $text =~ m/It is free software.*?under the.*?terms of either.*?GNU General Public License.*?either version (\d+).*?any later version.*?Artistic License/ && do {
 
297
         close FILE;
 
298
         return("dual GPLv$1+/Artistic License", $text);
 
299
       } ||
 
300
       $text =~ m/The use and distribution terms for this software are covered by the.*?Microsoft Permissive License \(Ms-PL\).*?/ && do {
 
301
         close FILE;
 
302
         return("Ms-PL", $text);
 
303
       }
 
304
    }
 
305
  }
 
306
  close FILE;
 
307
  ($license, $copyright);
 
308
}
 
309
 
 
310
my $data = {};
 
311
my $line;
 
312
local *LC;
 
313
open(LC, "/usr/bin/licensecheck -r --copyright $dir |") ||
 
314
  die "Can't open /usr/bin/licensecheck: $!\n";
 
315
while (!eof(LC) && defined($line = <LC>)) {
 
316
  chomp $line;
 
317
  my ($file, $license, $copyright) = (undef, undef, 'UNKNOWN');
 
318
  if ($line =~ m/^(\S[^:]+): (.*)/) {
 
319
    $file = $1;
 
320
    $license = $2;
 
321
    $license =~ s/\s*$//;
 
322
    $line = <LC>;
 
323
    if ($line =~ m/^  \[(.*.)\]/) {
 
324
      $copyright = $1;
 
325
      $line = <LC>;
 
326
    }
 
327
    # check for manual identification
 
328
    for my $manual (keys %$manually_identified) {
 
329
      if ($file =~ m,$manual,) {
 
330
        my $res = $$manually_identified{$manual};
 
331
        my $tmp_license = "";
 
332
        my $tmp_copyright = "";
 
333
        ($tmp_license, $tmp_copyright) = @$res;
 
334
        if (!$copyright || $copyright =~ /.*no copyright.*/ ) {
 
335
          $copyright = $tmp_copyright;
 
336
        }
 
337
        if (!$license || $license eq "UNKNOWN" || $license eq "*No copyright* UNKNOWN") {
 
338
          $license = $tmp_license;
 
339
        }
 
340
        last;
 
341
      }
 
342
    }
 
343
    if ($license eq 'UNKNOWN') {
 
344
      # Look further into that file. licensecheck may have missed something
 
345
      ($license, $copyright) = get_license($file, $license, $copyright);
 
346
    }
 
347
    #printf "%-80s %-30s %s\n", $file, $license, $copyright;
 
348
    my $path = $file;
 
349
    $path =~ s,/[^/]*$,,;
 
350
    push @{$$data{$path}{$license}{$copyright}}, [ $file ];
 
351
    next if $line =~ m/^$/;
 
352
  }
 
353
  die "line='$line'\n";
 
354
}
 
355
close LC;
 
356
 
 
357
print "Whitelisted licenses: \n  - '" . (join "'\n  - '", @$white_listed_licenses) . "'\n\n" unless $$opt{'a'};
 
358
 
 
359
for my $dir (sort keys %$data) {
 
360
  my $l = 0;
 
361
  for my $license (sort keys %{$$data{$dir}}) {
 
362
    my $skip = 0;
 
363
    for my $w (@$white_listed_licenses) {
 
364
      $skip++ if $w eq $license;
 
365
    }
 
366
    next if !$$opt{'a'} && $skip;
 
367
    $l++;
 
368
    for my $copyright (sort keys %{$$data{$dir}{$license}}) {
 
369
      my @values = values %{$$data{$dir}{$license}};
 
370
      if ($#values == 1) {
 
371
        printf "Files: %s/*\n", $dir;
 
372
      } else {
 
373
        printf "Files: %s/{", $dir;
 
374
        my $first = 1;
 
375
        for my $file (sort { $$a[0] cmp $$b[0] } @{$$data{$dir}{$license}{$copyright}}) {
 
376
          if ($first) {
 
377
            $first = 0;
 
378
          } else { 
 
379
            printf ",";
 
380
          }
 
381
          my $filename = $$file[0];
 
382
          $filename =~ s/$dir\///;
 
383
          printf "%s", $filename;
 
384
        }
 
385
        printf "}\n";
 
386
      }
 
387
      print "Copyright: $copyright:\n";
 
388
      print "License: $license\n";
 
389
      print "\n";
 
390
    }
 
391
  }
 
392
}