From 09aa1a7df331fc8df0668652256347926f820c6e Mon Sep 17 00:00:00 2001 From: Javi Fontan Date: Mon, 5 Dec 2011 17:43:16 +0100 Subject: [PATCH] features #914, #949: --check and faster install_gems * added --check options that detects the ruby libraries not installed * only install gems not found * execute 'gem' only once when possible --- share/install_gems/install_gems | 156 +++++++++++++++++++++++++------- 1 file changed, 122 insertions(+), 34 deletions(-) diff --git a/share/install_gems/install_gems b/share/install_gems/install_gems index d0c44fc7db..46e2b29ee4 100755 --- a/share/install_gems/install_gems +++ b/share/install_gems/install_gems @@ -2,9 +2,6 @@ require 'pp' -PACKAGES=%w{optional sunstone quota cloud ozones_client ozones_server - ozones_server_mysql ozones_server_sqlite} - DEFAULT=%w{optional sunstone quota cloud ozones_server acct} if defined?(RUBY_VERSION) && RUBY_VERSION>="1.8.7" @@ -12,6 +9,10 @@ if defined?(RUBY_VERSION) && RUBY_VERSION>="1.8.7" # xmlparser gem is not compatible with ruby 1.9 OPTIONAL=%w{nokogiri} + + if RUBY_VERSION=='1.8.7' + OPTIONAL << 'xmlparser' + end else SQLITE='sqlite3-ruby --version 1.2.0' OPTIONAL=%w{nokogiri xmlparser} @@ -33,6 +34,8 @@ GROUPS={ :acct_mysql => ['sequel', 'mysql'] } +PACKAGES=GROUPS.keys + DISTRIBUTIONS={ :debian => { :id => ['Ubuntu', 'Debian'], @@ -82,6 +85,15 @@ class String end end +def installed_gems + text=`gem list --no-versions --no-details` + if $?.exitstatus!=0 + nil + else + text.split(/\s+/) + end +end + def try_library(name, error_message) begin require name.to_s @@ -107,12 +119,14 @@ def help puts puts "If no parameters are specified then this list will be used:" puts DEFAULT.join(' ') + puts + puts "Use --check parameter to search for non installed libraries." end def get_gems(packages) packages.map do |package| GROUPS[package.to_sym] - end.flatten.uniq + end.flatten.uniq-installed_gems end def detect_distro @@ -191,6 +205,88 @@ def install_dependencies(gems, distro) end end +def run_command(cmd) + puts cmd + system cmd + #system "true" + + if $?!=0 + puts "Error executing #{cmd}" + exit(-1) + end +end + +def install_gems(packages) + gems_list=get_gems(packages) + + if gems_list.empty? + puts "Gems already installed" + exit(0) + end + + dist=detect_distro + + install_dependencies(gems_list, dist) + + packages_string=gems_list.join(' ') + + prefix="" + + if dist && dist.last[:gem_env] + prefix=dist.last[:gem_env].collect do |name, value| + "#{name}=\"#{value}\"" + end.join(' ')+' ' + end + + command_string = "#{prefix}gem install --no-ri --no-rdoc" + + install_warning(packages) + + simple_gems=gems_list.select {|g| !(g.match(/\s/)) } + if simple_gems and !simple_gems.empty? + cmd=command_string+" " << simple_gems.join(' ') + run_command(cmd) + end + + special_gems=gems_list.select {|g| g.match(/\s/) } + special_gems.each do |gem| + cmd=command_string+" "<0 - packages=ARGV +if params.length>0 + packages=params else packages=DEFAULT end -gems_list=get_gems(packages) -dist=detect_distro - -install_dependencies(gems_list, dist) - -packages_string=gems_list.join(' ') - -prefix="" - -if dist && dist.last[:gem_env] - prefix=dist.last[:gem_env].collect do |name, value| - "#{name}=\"#{value}\"" - end.join(' ')+' ' +case command +when 'help' + help + exit(0) +when 'check' + check_gems(packages) +when 'install' + install_gems(packages) end -command_string = "#{prefix}gem install --no-ri --no-rdoc" -install_warning(packages) -gems_list.each do |gem| - cmd=command_string+" "<