@ -6,13 +6,14 @@
# Must run inside a openwrt with all *ruby* packages installed
#
RUBY_SIMPLE_VERSION = RUBY_VERSION.split(".")[0..1].join(".")
failed = false
puts "Looking for installed ruby packages..."
packages=`opkg list-installed '*ruby*' | cut -d' ' -f 1`.split("\n")
puts "Looking for packages files..."
package_files=Hash.new([])
package_files=Hash.new { |h,k| h[k]=[] }
packages.each do
|pkg|
files=`opkg files "#{pkg}" | sed -e 1d`.split("\n")
@ -24,7 +25,7 @@ require_regex_ignore=/^require ([a-zA-Z\$]|["']$|.*\/$)/
require_ignore=%w{drb/invokemethod16 foo rubygems/defaults/operating_system win32console java Win32API
builder/xchar json/pure simplecov win32/sspi rdoc/markdown/literals_1_8 enumerator win32/resolv rbtree
nqxml/streamingparser nqxml/treeparser xmlscan/parser xmlscan/scanner xmltreebuilder xml/parser xmlparser xml/encoding-ja xmlencoding-ja
iconv uconv win32ole gettext/po_parser gettext/mo libxml}
iconv uconv win32ole gettext/po_parser gettext/mo libxml psych.jar jar-dependencies }
builtin_enc=[
Encoding.find("ASCII-8BIT"),
@ -34,7 +35,7 @@ builtin_enc=[
]
puts "Looking for requires in files..."
files_requires=Hash.new([])
files_requires=Hash.new { |h,k| h[k]=[] }
packages.each do
|pkg|
package_files[pkg].each do
@ -93,7 +94,7 @@ packages.each do
next
end
files_requires[file]=files_requires[file] + [require]
files_requires[file] += [require]
when /Encoding::/
encs=line.scan(/Encoding::[[:alnum:]_]+/).collect {|enc| eval(enc) }.select {|enc| enc.kind_of? Encoding }
@ -104,7 +105,7 @@ packages.each do
required_encs = (encs - builtin_enc).collect {|enc| "enc/#{enc.name.downcase.gsub("-","_")}" }
required_encs << "enc/encdb" if need_encdb
files_requires[file] = files_requires[file] + required_encs
files_requires[file] += required_encs
end
end
end
@ -119,10 +120,18 @@ package_files.each do |(pkg,files)| files.each do |file|
end
end; end
puts "Merging requirements into packages..."
package_requires = Hash[packages.collect { |pkg| [pkg, package_files[pkg].collect {|file| files_requires[file] }.inject([],:+).uniq] }]
puts "Grouping package requirements per package"
package_requires_files = Hash.new{|h,k| h[k] = Hash.new { |h2,k2| h2[k2] = [] } }
package_files.each do |(pkg,files)|
package_requires_files[pkg]
files.each do |file|
files_requires[file].each do |requires|
package_requires_files[pkg][requires] << file
end
end
end
weak_dependency=Hash.new([])
weak_dependency=Hash.new { |h,k| h[k]=[] }
weak_dependency.merge!({
"ruby-misc"=>["ruby-openssl","ruby-fiddle"], #securerandom.rb
"ruby-debuglib"=>["ruby-readline"], #debug.rb
@ -136,6 +145,7 @@ weak_dependency.merge!({
"ruby-rdoc"=>["ruby-gems","ruby-readline","ruby-webrick", #/usr/bin/rdoc and others
"ruby-io-console"], #rdoc/stats/normal.rb
"ruby-webrick"=>["ruby-openssl"], #webrick/ssl.rb
"ruby-testunit"=>["ruby-io-console"], #gems/test-unit-3.1.5/lib/test/unit/ui/console/testrunner.rb
})
puts "Preloading gems..."
@ -143,12 +153,12 @@ Gem::Specification.all.each{ |x| gem x.name }
puts "Looking for package dependencies..."
package_provides = {}
package_dependencies = Hash.new([])
package_requires.each do
|(pkg,requires)|
package_dependencies = Hash.new { |h,k| h[k]=[] }
package_requires_files .each do
|(pkg,requires_files )|
requires.each do
|require|
requires_files .each do
|( require,files) |
if package_provides.include?(require)
found = package_provides[require]
else
@ -159,13 +169,13 @@ package_requires.each do
next
end
found = found.first
package_provides[require]=found
package_provides[require] = found
end
if weak_dependency[pkg].include?(found)
puts "#{pkg}: #{found} provides #{require} (ignored WEAK dep )"
puts "#{pkg}: #{found} provides #{require} (weak depedendency ignored)"
else
puts "#{pkg}: #{found} provides #{require}"
package_dependencies[pkg]=package_dependencies[pkg] + [found]
puts "#{pkg}: #{found} provides #{require} for #{files.collect {|file| file.sub("/usr/lib/ruby/","") }.join(",")} "
package_dependencies[pkg] += [found]
end
end
end
@ -174,20 +184,16 @@ if failed
puts "Please, fix the missing files or ignore them on require_ignore var"
exit(1)
end
package_dependencies.each do
|(pkg,deps)|
package_dependencies[pkg]=deps.uniq.sort - [pkg]
end
# Remove self dependency
package_dependencies = Hash[package_dependencies.collect {|(pkg,deps)| [pkg,package_dependencies[pkg]=deps.uniq.sort - [pkg]]}]
package_dependencies.default = []
puts "Expanding dependencies..."
begin
changed=false
package_dependencies.each do
|(pkg,deps)|
next if deps.empty?
deps_new = deps.collect {|dep| [dep] + package_dependencies[dep] }.inject([],:+).uniq.sort
if not deps == deps_new
puts "#{pkg}: #{deps.join(",")}"
@ -198,6 +204,12 @@ begin
end
end if not changed
puts "Removing redundant dependencies..."
package_dependencies.each do
|(pkg,deps)|
package_dependencies[pkg]=deps.uniq - [pkg]
end
puts "Checking for mutual dependencies..."
package_dependencies.each do
|(pkg,deps)|
@ -208,11 +220,6 @@ package_dependencies.each do
end
exit(1) if failed
puts "Removing redundant dependencies..."
package_dependencies.each do
|(pkg,deps)|
package_dependencies[pkg]=deps.uniq - [pkg]
end
package_dependencies2=package_dependencies.dup
package_dependencies.each do
@ -256,15 +263,4 @@ end
puts "All dependencies are OK." if ok
__END__
puts RUBY_VERSION, RUBY_PLATFORM
puts 123
puts Object.contants
#RUBY_VER=2.1
#RUBY_ARCH=i486-linux-gnu
#RUBYLIB=/usr/lib/ruby/$RUBY_VER/
#RUBYLIB_A=/usr/lib/ruby/$RUBY_ARCH/$RUBY_VER/