squid: disable krb5
[feed/packages.git] / lang / ruby / ruby_find_pkgsdeps
1 #!/usr/bin/ruby -Eutf-8
2 # encoding: utf-8
3 #
4 # Find dependencies between ruby packages
5 #
6 # Must run inside a openwrt with all *ruby* packages installed
7 #
8
9 failed = false
10
11 puts "Looking for installed ruby packages..."
12 packages=`opkg list-installed '*ruby*' | cut -d' ' -f 1`.split("\n")
13
14 puts "Looking for packages files..."
15 package_files=Hash.new([])
16 packages.each do
17 |pkg|
18 files=`opkg files "#{pkg}" | sed -e 1d`.split("\n")
19 package_files[pkg]=files if files
20 end
21
22 require_regex=/^require ["']([^"']+)["'].*/
23 require_regex_ignore=/^require ([a-zA-Z\$]|["']$|.*\/$)/
24 require_ignore=%w{drb/invokemethod16 foo rubygems/defaults/operating_system win32console java Win32API
25 builder/xchar json/pure simplecov win32/sspi rdoc/markdown/literals_1_8 enumerator win32/resolv rbtree
26 nqxml/streamingparser nqxml/treeparser xmlscan/parser xmlscan/scanner xmltreebuilder xml/parser xmlparser xml/encoding-ja xmlencoding-ja
27 iconv uconv win32ole gettext/po_parser gettext/mo libxml}
28
29 builtin_enc=[
30 Encoding.find("ASCII-8BIT"),
31 Encoding.find("UTF-8"),
32 Encoding.find("UTF-7"),
33 Encoding.find("US-ASCII"),
34 ]
35
36 puts "Looking for requires in files..."
37 files_requires=Hash.new([])
38 packages.each do
39 |pkg|
40 package_files[pkg].each do
41 |file|
42 next if not File.file?(file)
43
44 if not file =~ /.rb$/
45 if File.executable?(file)
46 magic=`head -c50 '#{file}' | head -1`
47 begin
48 if not magic =~ /ruby/
49 next
50 end
51 rescue
52 next
53 end
54 else
55 next
56 end
57 end
58 #puts "Checking #{file}..."
59 File.open(file, "r") do
60 |f|
61 lineno=0
62 while line=f.gets() do
63 lineno+=1; encs=[]; requires=[]; need_encdb=false
64
65 line=line.chomp.gsub!(/^[[:blank:]]*/,"")
66
67 case line
68 when /^#.*coding *:/
69 if lineno <= 2
70 enc=line.sub(/.*coding *: */,"").sub(/ .*/,"")
71 encs << Encoding.find(enc)
72 end
73 end
74 line.gsub!(/#.*/,"")
75 case line
76 when "__END__"
77 break
78 when /^require /
79 #puts "#{file}:#{line}"
80 if require_regex_ignore =~ line
81 #puts "Ignoring #{line} at #{file}:#{lineno} (REGEX)..."
82 next
83 end
84 if not require_regex =~ line
85 $stderr.puts "Unknown require: '#{line}' at file #{file}:#{lineno}"
86 failed=true
87 end
88 require=line.gsub(require_regex,"\\1")
89 require.gsub!(/\.(so|rb)$/,"")
90
91 if require_ignore.include?(require)
92 #puts "Ignoring #{line} at #{file}:#{lineno} (STR)..."
93 next
94 end
95
96 files_requires[file]=files_requires[file] + [require]
97
98 when /Encoding::/
99 encs=line.scan(/Encoding::[[:alnum:]_]+/).collect {|enc| eval(enc) }.select {|enc| enc.kind_of? Encoding }
100 need_encdb=true
101 end
102
103 next if encs.empty?
104 required_encs = (encs - builtin_enc).collect {|enc| "enc/#{enc.name.downcase.gsub("-","_")}" }
105 required_encs << "enc/encdb" if need_encdb
106
107 files_requires[file] = files_requires[file] + required_encs
108 end
109 end
110 end
111 end
112 exit(1) if failed
113
114 # Add deps from .so
115 package_files.each do |(pkg,files)| files.each do |file|
116 case file
117 when /\/nkf\.so$/
118 files_requires[file]= files_requires[file] + ["enc/encdb"]
119 end
120 end; end
121
122 puts "Merging requirements into packages..."
123 package_requires = Hash[packages.collect { |pkg| [pkg, package_files[pkg].collect {|file| files_requires[file] }.inject([],:+).uniq] }]
124
125 weak_dependency=Hash.new([])
126 weak_dependency.merge!({
127 "ruby-misc"=>["ruby-openssl","ruby-fiddle"], #securerandom.rb
128 "ruby-debuglib"=>["ruby-readline"], #debug.rb
129 "ruby-drb"=>["ruby-openssl"], #drb/ssl.rb
130 "ruby-irb"=>["ruby-rdoc", "ruby-readline"], #irb/cmd/help.rb
131 "ruby-gems"=>["ruby-openssl","ruby-io-console","ruby-webrick"], #rubygems/commands/cert_command.rb rubygems/user_interaction.rb rubygems/server.rb
132 "ruby-mkmf"=>["ruby-webrick"], #un.rb
133 "ruby-net"=>["ruby-openssl","ruby-io-console","ruby-zlib"], #net/*.rb
134 "ruby-optparse"=>["ruby-uri","ruby-datetime"], #optparse/date.rb optparse/uri.rb
135 "ruby-rake"=>["ruby-net","ruby-gems"], #rake/contrib/ftptools.rb /usr/bin/rake
136 "ruby-rdoc"=>["ruby-gems","ruby-readline","ruby-webrick", #/usr/bin/rdoc and others
137 "ruby-io-console"], #rdoc/stats/normal.rb
138 "ruby-webrick"=>["ruby-openssl"], #webrick/ssl.rb
139 })
140
141 puts "Preloading gems..."
142 Gem::Specification.all.each{ |x| gem x.name }
143
144 puts "Looking for package dependencies..."
145 package_provides = {}
146 package_dependencies = Hash.new([])
147 package_requires.each do
148 |(pkg,requires)|
149
150 requires.each do
151 |require|
152 if package_provides.include?(require)
153 found = package_provides[require]
154 else
155 found = package_files.detect {|(pkg,files)| files.detect {|file| $:.detect {|path| "#{path}/#{require}" == file.gsub(/\.(so|rb)$/,"") } } }
156 if not found
157 $stderr.puts "#{pkg}: Nothing provides #{require}"
158 failed = true
159 next
160 end
161 found = found.first
162 package_provides[require]=found
163 end
164 if weak_dependency[pkg].include?(found)
165 puts "#{pkg}: #{found} provides #{require} (ignored WEAK dep)"
166 else
167 puts "#{pkg}: #{found} provides #{require}"
168 package_dependencies[pkg]=package_dependencies[pkg] + [found]
169 end
170 end
171 end
172 if failed
173 puts "There is some missing requirements not mapped to files in packages."
174 puts "Please, fix the missing files or ignore them on require_ignore var"
175 exit(1)
176 end
177
178 package_dependencies.each do
179 |(pkg,deps)|
180 package_dependencies[pkg]=deps.uniq.sort - [pkg]
181 end
182
183 puts "Expanding dependencies..."
184 begin
185 changed=false
186 package_dependencies.each do
187 |(pkg,deps)|
188
189 next if deps.empty?
190
191 deps_new = deps.collect {|dep| [dep] + package_dependencies[dep] }.inject([],:+).uniq.sort
192 if not deps == deps_new
193 puts "#{pkg}: #{deps.join(",")}"
194 puts "#{pkg}: #{deps_new.join(",")}"
195 package_dependencies[pkg]=deps_new
196 changed=true
197 end
198 end
199 end if not changed
200
201 puts "Checking for mutual dependencies..."
202 package_dependencies.each do
203 |(pkg,deps)|
204 if deps.include? pkg
205 $stderr.puts "#{pkg}: Cycle dependency detected! "
206 failed = true
207 end
208 end
209 exit(1) if failed
210
211 puts "Removing redundant dependencies..."
212 package_dependencies.each do
213 |(pkg,deps)|
214 package_dependencies[pkg]=deps.uniq - [pkg]
215 end
216
217 package_dependencies2=package_dependencies.dup
218 package_dependencies.each do
219 |(pkg,deps)|
220
221 # Ignore dependencies that are aready required by another dependency
222 deps_clean = deps.reject {|dep_suspect| deps.detect {|dep_provider|
223 if package_dependencies[dep_provider].include?(dep_suspect)
224 puts "#{pkg}: #{dep_suspect} is already required by #{dep_provider}"
225 true
226 end
227 } }
228
229 if not deps==deps_clean
230 puts "before: #{deps.join(",")}"
231 puts "after: #{deps_clean.join(",")}"
232 package_dependencies2[pkg]=deps_clean
233 end
234 end
235 package_dependencies=package_dependencies2
236
237 puts "Checking current packages dependencies..."
238 ok=true
239 package_dependencies.each do
240 |(pkg,deps)|
241 current_deps=`opkg depends #{pkg} | sed -r -e '1d;s/^[[:blank:]]*//'`.split("\n")
242 current_deps.reject!{|dep| dep =~ /^lib/ }
243 current_deps -= ["ruby"]
244
245 extra_dep = current_deps - deps
246 $stderr.puts "Package #{pkg} does not need to depend on #{extra_dep.join(" ")} " if not extra_dep.empty?
247 missing_dep = deps - current_deps
248 $stderr.puts "Package #{pkg} needs to depend on #{missing_dep.join(" ")} " if not missing_dep.empty?
249
250 if not extra_dep.empty? or not missing_dep.empty?
251 $stderr.puts "define Package/#{pkg}"
252 $stderr.puts " DEPENDS:=ruby#{([""] +deps).join(" +")}"
253 ok=false
254 end
255 end
256
257 puts "All dependencies are OK." if ok
258
259
260 __END__
261
262 puts RUBY_VERSION, RUBY_PLATFORM
263 puts 123
264
265 puts Object.contants
266
267 #RUBY_VER=2.1
268 #RUBY_ARCH=i486-linux-gnu
269 #RUBYLIB=/usr/lib/ruby/$RUBY_VER/
270 #RUBYLIB_A=/usr/lib/ruby/$RUBY_ARCH/$RUBY_VER/