mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28703 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
		
			
				
	
	
		
			235 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			235 lines
		
	
	
	
		
			6.1 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
# depends on: array.rb dir.rb env.rb file.rb hash.rb module.rb regexp.rb
 | 
						|
# vim: filetype=ruby
 | 
						|
 | 
						|
# NOTICE: Ruby is during initialization here.
 | 
						|
# * Encoding.default_external does not reflects -E.
 | 
						|
# * Should not expect Encoding.default_internal.
 | 
						|
# * Locale encoding is available.
 | 
						|
 | 
						|
if defined?(Gem) then
 | 
						|
 | 
						|
  # :stopdoc:
 | 
						|
 | 
						|
  module Kernel
 | 
						|
 | 
						|
    def gem(gem_name, *version_requirements)
 | 
						|
      Gem::QuickLoader.load_full_rubygems_library
 | 
						|
      gem gem_name, *version_requirements
 | 
						|
    end
 | 
						|
    private :gem
 | 
						|
  end
 | 
						|
 | 
						|
  module Gem
 | 
						|
 | 
						|
    ConfigMap = {
 | 
						|
      :EXEEXT            => RbConfig::CONFIG["EXEEXT"],
 | 
						|
      :RUBY_SO_NAME      => RbConfig::CONFIG["RUBY_SO_NAME"],
 | 
						|
      :arch              => RbConfig::CONFIG["arch"],
 | 
						|
      :bindir            => RbConfig::CONFIG["bindir"],
 | 
						|
      :libdir            => RbConfig::CONFIG["libdir"],
 | 
						|
      :ruby_install_name => RbConfig::CONFIG["ruby_install_name"],
 | 
						|
      :ruby_version      => RbConfig::CONFIG["ruby_version"],
 | 
						|
      :rubylibprefix     => RbConfig::CONFIG["rubylibprefix"],
 | 
						|
      :sitedir           => RbConfig::CONFIG["sitedir"],
 | 
						|
      :sitelibdir        => RbConfig::CONFIG["sitelibdir"],
 | 
						|
    }
 | 
						|
 | 
						|
    def self.dir
 | 
						|
      @gem_home ||= nil
 | 
						|
      set_home(ENV['GEM_HOME'] || default_dir) unless @gem_home
 | 
						|
      @gem_home
 | 
						|
    end
 | 
						|
 | 
						|
    def self.path
 | 
						|
      @gem_path ||= nil
 | 
						|
      unless @gem_path
 | 
						|
        paths = [ENV['GEM_PATH'] || default_path]
 | 
						|
        paths << APPLE_GEM_HOME if defined? APPLE_GEM_HOME
 | 
						|
        set_paths(paths.compact.join(File::PATH_SEPARATOR))
 | 
						|
      end
 | 
						|
      @gem_path
 | 
						|
    end
 | 
						|
 | 
						|
    def self.post_install(&hook)
 | 
						|
      @post_install_hooks << hook
 | 
						|
    end
 | 
						|
 | 
						|
    def self.post_uninstall(&hook)
 | 
						|
      @post_uninstall_hooks << hook
 | 
						|
    end
 | 
						|
 | 
						|
    def self.pre_install(&hook)
 | 
						|
      @pre_install_hooks << hook
 | 
						|
    end
 | 
						|
 | 
						|
    def self.pre_uninstall(&hook)
 | 
						|
      @pre_uninstall_hooks << hook
 | 
						|
    end
 | 
						|
 | 
						|
    def self.set_home(home)
 | 
						|
      home = home.dup.force_encoding(Encoding.find('filesystem'))
 | 
						|
      home.gsub!(File::ALT_SEPARATOR, File::SEPARATOR) if File::ALT_SEPARATOR
 | 
						|
      @gem_home = home
 | 
						|
    end
 | 
						|
 | 
						|
    def self.set_paths(gpaths)
 | 
						|
      if gpaths
 | 
						|
        @gem_path = gpaths.split(File::PATH_SEPARATOR)
 | 
						|
 | 
						|
        if File::ALT_SEPARATOR then
 | 
						|
          @gem_path.map! do |path|
 | 
						|
            path.gsub File::ALT_SEPARATOR, File::SEPARATOR
 | 
						|
          end
 | 
						|
        end
 | 
						|
 | 
						|
        @gem_path << Gem.dir
 | 
						|
      else
 | 
						|
        # TODO: should this be Gem.default_path instead?
 | 
						|
        @gem_path = [Gem.dir]
 | 
						|
      end
 | 
						|
 | 
						|
      @gem_path.uniq!
 | 
						|
      @gem_path.map!{|x|x.force_encoding(Encoding.find('filesystem'))}
 | 
						|
    end
 | 
						|
 | 
						|
    def self.user_home
 | 
						|
      @user_home ||= File.expand_path("~").force_encoding(Encoding.find('filesystem'))
 | 
						|
    rescue
 | 
						|
      if File::ALT_SEPARATOR then
 | 
						|
        "C:/"
 | 
						|
      else
 | 
						|
        "/"
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    # begin rubygems/defaults
 | 
						|
    # NOTE: this require will be replaced with in-place eval before compilation.
 | 
						|
    require 'lib/rubygems/defaults.rb'
 | 
						|
    # end rubygems/defaults
 | 
						|
 | 
						|
 | 
						|
    ##
 | 
						|
    # Methods before this line will be removed when QuickLoader is replaced
 | 
						|
    # with the real RubyGems
 | 
						|
 | 
						|
    GEM_PRELUDE_METHODS = Gem.methods(false)
 | 
						|
 | 
						|
    begin
 | 
						|
      verbose, debug = $VERBOSE, $DEBUG
 | 
						|
      $VERBOSE = $DEBUG = nil
 | 
						|
 | 
						|
      begin
 | 
						|
        require 'rubygems/defaults/operating_system'
 | 
						|
      rescue ::LoadError
 | 
						|
      end
 | 
						|
 | 
						|
      if defined?(RUBY_ENGINE) then
 | 
						|
        begin
 | 
						|
          require "rubygems/defaults/#{RUBY_ENGINE}"
 | 
						|
        rescue ::LoadError
 | 
						|
        end
 | 
						|
      end
 | 
						|
    ensure
 | 
						|
      $VERBOSE, $DEBUG = verbose, debug
 | 
						|
    end
 | 
						|
 | 
						|
    module QuickLoader
 | 
						|
 | 
						|
      @loaded_full_rubygems_library = false
 | 
						|
 | 
						|
      def self.remove
 | 
						|
        return if @loaded_full_rubygems_library
 | 
						|
 | 
						|
        @loaded_full_rubygems_library = true
 | 
						|
 | 
						|
        class << Gem
 | 
						|
          undef_method(*Gem::GEM_PRELUDE_METHODS)
 | 
						|
        end
 | 
						|
 | 
						|
        remove_method :const_missing
 | 
						|
        remove_method :method_missing
 | 
						|
 | 
						|
        Kernel.module_eval do
 | 
						|
          undef_method :gem if method_defined? :gem
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      def self.load_full_rubygems_library
 | 
						|
        return false if @loaded_full_rubygems_library
 | 
						|
 | 
						|
        remove
 | 
						|
 | 
						|
        $".delete path_to_full_rubygems_library
 | 
						|
        if $".any? {|path| path.end_with?('/rubygems.rb')}
 | 
						|
          raise LoadError, "another rubygems is already loaded from #{path}"
 | 
						|
        end
 | 
						|
 | 
						|
        require 'rubygems'
 | 
						|
 | 
						|
        return true
 | 
						|
      end
 | 
						|
 | 
						|
      def self.path_to_full_rubygems_library
 | 
						|
        installed_path = File.join(Gem::ConfigMap[:rubylibprefix], Gem::ConfigMap[:ruby_version])
 | 
						|
        if $:.include?(installed_path)
 | 
						|
          return File.join(installed_path, 'rubygems.rb')
 | 
						|
        else # e.g., on test-all
 | 
						|
          $:.each do |dir|
 | 
						|
            if File.exist?( path = File.join(dir, 'rubygems.rb') )
 | 
						|
              return path
 | 
						|
            end
 | 
						|
          end
 | 
						|
          raise LoadError, 'rubygems.rb'
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      def const_missing(constant)
 | 
						|
        QuickLoader.load_full_rubygems_library
 | 
						|
 | 
						|
        if Gem.const_defined?(constant) then
 | 
						|
          Gem.const_get constant
 | 
						|
        else
 | 
						|
          super
 | 
						|
        end
 | 
						|
      end
 | 
						|
 | 
						|
      def method_missing(method, *args, &block)
 | 
						|
        QuickLoader.load_full_rubygems_library
 | 
						|
        super unless Gem.respond_to?(method)
 | 
						|
        Gem.send(method, *args, &block)
 | 
						|
      end
 | 
						|
    end
 | 
						|
 | 
						|
    extend QuickLoader
 | 
						|
 | 
						|
    def self.try_activate(path)
 | 
						|
      # This method is only hit when the custom require is hit the first time.
 | 
						|
      # So we go off and dutifully load all of rubygems and retry the call
 | 
						|
      # to Gem.try_activate. We retry because full rubygems replaces this
 | 
						|
      # method with one that actually tries to find a gem for +path+ and load it.
 | 
						|
      #
 | 
						|
      # This is conditional because in the course of loading rubygems, the custom
 | 
						|
      # require will call back into here before all of rubygems is loaded. So
 | 
						|
      # we must not always retry the call. We only redo the call when
 | 
						|
      # load_full_rubygems_library returns true, which it only does the first
 | 
						|
      # time it's called.
 | 
						|
      #
 | 
						|
      if QuickLoader.load_full_rubygems_library
 | 
						|
        return Gem.try_activate(path)
 | 
						|
      end
 | 
						|
 | 
						|
      return false
 | 
						|
    end
 | 
						|
 | 
						|
  end
 | 
						|
 | 
						|
  begin
 | 
						|
    require 'lib/rubygems/custom_require.rb'
 | 
						|
  rescue Exception => e
 | 
						|
    puts "Error loading gem paths on load path in gem_prelude"
 | 
						|
    puts e
 | 
						|
    puts e.backtrace.join("\n")
 | 
						|
  end
 | 
						|
 | 
						|
end
 | 
						|
 |