merged cont.
[opensuse:yast-rest-service.git] / webyast-tasks / lib / tasks / license.rake
1 #! /usr/bin/env ruby
2 #--
3 # Webyast Webservice framework
4 #
5 # Copyright (C) 2009, 2010 Novell, Inc. 
6 #   This library is free software; you can redistribute it and/or modify
7 # it only under the terms of version 2.1 of the GNU Lesser General Public
8 # License as published by the Free Software Foundation. 
9 #
10 #   This library is distributed in the hope that it will be useful, but WITHOUT
11 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 # FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more 
13 # details. 
14 #
15 #   You should have received a copy of the GNU Lesser General Public
16 # License along with this library; if not, write to the Free Software 
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18 #++
19
20 require "rake"
21 require "English"
22
23 def make_rdoc_header(input_fname, output_fname)
24   File.open(input_fname, "r") do |inf|
25     File.open(output_fname, "w") do |out|
26       out.puts "#--"
27       inf.each_line { |l| out.printf "# %s", l }
28       out.puts "#++"
29     end
30   end
31 end
32
33 file "GPLv2.rb" => "GPLv2" do |t|
34   make_rdoc_header t.prerequisites[0], t.name
35 end
36
37 def verbose(msg)
38   # FIXME verbose seems to be on by default, but can use rake -q
39   if RakeFileUtils.verbose
40     puts msg
41   end
42 end
43
44 LIMIT = (ENV["LIMIT"] || 10).to_i
45 def license_report
46   # FIXME: operate on distributed files, i.e. tarballs
47   report = {:missing => [], :seen => [], :unneeded => [], :skipped => []}
48   filenames = `git ls-files`.split "\n"
49   filenames.each do |fn|
50     # file name checks
51     if fn =~ /\.yml\z/ || fn =~ /\.conf\z/ || fn =~ /\.xml\z/
52       report[:skipped] << "#{fn}: skipped by name match (configuration file)"
53       next
54     elsif fn =~ /README/ 
55       report[:skipped] << "#{fn}: skipped by name match (README file)"
56       next
57     elsif fn =~ /^db\//
58       report[:skipped] << "#{fn}: skipped by name match (generated DB migration or schema)"
59       next
60     elsif fn =~ /licenses\//
61       report[:skipped] << "#{fn}: skipped by name match (already contain license)"
62       next
63     elsif fn =~ /COPYING/
64       report[:skipped] << "#{fn}: skipped by name match (already contain license)"
65       next
66     elsif fn =~ /\/rrdtool.*\.txt/
67       report[:skipped] << "#{fn}: skipped by name match (rrdtool output is not licensed)"
68       next
69     elsif fn =~ /\.changes\z/
70       report[:skipped] << "#{fn}: skipped by name match (changes file)"
71       next
72     elsif fn =~ /vendor\/plugins/
73       report[:skipped] << "#{fn}: skipped by name match (polkit policy file)"
74       next
75     elsif fn =~ /\.policy\z/
76       report[:skipped] << "#{fn}: skipped by name match (polkit policy file)"
77       next
78     elsif fn =~ /\.png\z/ || fn =~ /\.odg\z/ || fn =~ /\.gif\z/ || fn =~ /\.swf\z/ || fn =~ /\.ico\z/
79       report[:skipped] << "#{fn}: skipped by name match (binary file)"
80       next
81     elsif fn =~ /\.po\z/ || fn =~ /\.mo\z/
82       report[:skipped] << "#{fn}: skipped by name match (translation file)"
83       next
84     elsif fn =~ /\.curl\z/
85       report[:skipped] << "#{fn}: skipped by name match (test fixture)"
86       next
87     elsif fn =~ /\.gitignore\z/
88       report[:skipped] << "#{fn}: skipped by name match (version system file)"
89       next
90     end
91
92     # file content checks
93     seen_copyright = false
94     skipped = false
95
96     File.open(fn, "r") do |f|
97       f.each_line do |l|
98         if $INPUT_LINE_NUMBER < 3 && l =~ /Source:/
99           skipped = true
100           report[:skipped] << "#{fn}: skipped (external or generated source)"
101           break
102         end
103         break if $INPUT_LINE_NUMBER > LIMIT
104         if l =~ /copyright/i
105           seen_copyright = true
106           break
107         end
108       end
109     end
110     next if skipped
111
112     if seen_copyright
113       report[:seen] << "#{fn}:#{$INPUT_LINE_NUMBER}: copyright seen"
114     elsif $INPUT_LINE_NUMBER <= LIMIT
115       report[:unneeded] << "#{fn}:#{$INPUT_LINE_NUMBER}: copyright unneeded, file too short"
116     else
117       report[:missing] << "#{fn}:#{$INPUT_LINE_NUMBER}: error: copyright missing (in first #{LIMIT} lines)"
118     end
119   end
120
121   puts "\nMissing license:"
122   report[:missing].each { |m| puts m }
123   exit 1 unless report[:missing].empty?
124   verbose "\nSkipped files:"
125   report[:skipped].each { |m| verbose m }
126   verbose "\nCopyright find in these files:"
127   report[:seen].each { |m| verbose m }
128   verbose "\nCopyright detected as not needed in this files:"
129   report[:unneeded].each { |m| verbose m }
130 end
131
132 namespace "license" do
133   desc "Check the copyright+license headers in files"
134   task :report do
135     license_report
136   end
137 end
138
139 task :package => "license:report"