From d0cf23b57eae01a21e10658b8272b498117d3913 Mon Sep 17 00:00:00 2001 From: nobu Date: Fri, 16 Jan 2015 04:48:56 +0000 Subject: rbinstall.rb: install unpacked gems * tool/rbinstall.rb (gem): install gems from unpacked directories for platforms where zlib is not available. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@49270 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- tool/rbinstall.rb | 44 +++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/tool/rbinstall.rb b/tool/rbinstall.rb index 159144cc90..c60e4ad395 100755 --- a/tool/rbinstall.rb +++ b/tool/rbinstall.rb @@ -275,6 +275,12 @@ def with_destdir(dir) $destdir + dir end +def without_destdir(dir) + return dir if !$destdir or $destdir.empty? or !dir.start_with?($destdir) + dir = dir.sub(/\A\w:/, '') if File::PATH_SEPARATOR == ';' + dir[$destdir.size..-1] +end + def prepare(mesg, basedir, subdirs=nil) return unless basedir case @@ -649,6 +655,27 @@ end end end end + + class UnpackedInstaller < Gem::Installer + module DirPackage + def extract_files(destination_dir, pattern = "*") + path = File.dirname(@gem.path) + return if path == destination_dir + install_recursive(path, without_destdir(destination_dir), + :glob => pattern, + :no_install => "*.gemspec", + :mode => $data_mode) + end + end + + def initialize(spec, *options) + super(spec.loaded_from, *options) + @package.extend(DirPackage).spec = spec + end + + def write_cache_file + end + end end # :startdoc: @@ -711,10 +738,25 @@ install?(:ext, :comm, :gem) do directories = Gem.ensure_gem_subdirectories(gem_dir, :mode => $dir_mode) prepare "bundle gems", gem_dir, directories install_dir = with_destdir(gem_dir) + installed_gems = {} begin require "zlib" rescue LoadError + $" << "zlib.rb" + end + Gem::Specification.each_spec([srcdir+'/gems/*']) do |spec| + ins = RbInstall::UnpackedInstaller.new(spec, + :install_dir => install_dir, + :ignore_dependencies => true) + puts "#{" "*30}#{spec.name} #{spec.version}" + ins.install + installed_gems[spec.full_name] = true + end + installed_gems, gems = Dir.glob(srcdir+'/gems/*.gem').partition {|gem| installed_gems.key?(File.basename(gem, '.gem'))} + unless installed_gems.empty? + install installed_gems, gem_dir+"/cache" end + next if gems.empty? if defined?(Zlib) options = { :install_dir => install_dir, @@ -724,7 +766,7 @@ install?(:ext, :comm, :gem) do :data_mode => $data_mode, :prog_mode => $prog_mode, } - Dir.glob(srcdir+'/gems/*.gem').each do |gem| + gems.each do |gem| Gem.install(gem, Gem::Requirement.default, options) gemname = File.basename(gem) puts "#{" "*30}#{gemname}" -- cgit v1.2.3