mirror of
				https://github.com/ruby/ruby.git
				synced 2022-11-09 12:17:21 -05:00 
			
		
		
		
	Update to RubyGems 1.3.0 r1891
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19547 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
		
							parent
							
								
									788001a9c8
								
							
						
					
					
						commit
						d478c7a734
					
				
					 60 changed files with 2174 additions and 1049 deletions
				
			
		| 
						 | 
				
			
			@ -1,3 +1,7 @@
 | 
			
		|||
Thu Sep 25 19:13:12 2008
 | 
			
		||||
 | 
			
		||||
	* lib/rubygems*: Update to RubyGems 1.3.0 r1891.
 | 
			
		||||
 | 
			
		||||
Thu Sep 25 18:40:42 2008  Yuki Sonoda (Yugui)  <yugui@yugui.jp>
 | 
			
		||||
 | 
			
		||||
	* class.c (rb_make_metaclass): Made class of class of class
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										121
									
								
								lib/rubygems.rb
									
										
									
									
									
								
							
							
						
						
									
										121
									
								
								lib/rubygems.rb
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -104,6 +104,11 @@ module Gem
 | 
			
		|||
  @ruby = nil
 | 
			
		||||
  @sources = []
 | 
			
		||||
 | 
			
		||||
  @post_install_hooks = []
 | 
			
		||||
  @post_uninstall_hooks = []
 | 
			
		||||
  @pre_uninstall_hooks = []
 | 
			
		||||
  @pre_install_hooks = []
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Activates an installed gem matching +gem+.  The gem must satisfy
 | 
			
		||||
  # +version_requirements+.
 | 
			
		||||
| 
						 | 
				
			
			@ -244,7 +249,10 @@ module Gem
 | 
			
		|||
  def self.clear_paths
 | 
			
		||||
    @gem_home = nil
 | 
			
		||||
    @gem_path = nil
 | 
			
		||||
    @user_home = nil
 | 
			
		||||
 | 
			
		||||
    @@source_index = nil
 | 
			
		||||
 | 
			
		||||
    MUTEX.synchronize do
 | 
			
		||||
      @searcher = nil
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			@ -261,9 +269,7 @@ module Gem
 | 
			
		|||
  # The standard configuration object for gems.
 | 
			
		||||
 | 
			
		||||
  def self.configuration
 | 
			
		||||
    return @configuration if @configuration
 | 
			
		||||
    require 'rubygems/config_file'
 | 
			
		||||
    @configuration = Gem::ConfigFile.new []
 | 
			
		||||
    @configuration ||= Gem::ConfigFile.new []
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
| 
						 | 
				
			
			@ -336,6 +342,22 @@ module Gem
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Returns a list of paths matching +file+ that can be used by a gem to pick
 | 
			
		||||
  # up features from other gems.  For example:
 | 
			
		||||
  #
 | 
			
		||||
  #   Gem.find_files('rdoc/discover').each do |path| load path end
 | 
			
		||||
  #
 | 
			
		||||
  # find_files does not search $LOAD_PATH for files, only gems.
 | 
			
		||||
 | 
			
		||||
  def self.find_files(path)
 | 
			
		||||
    specs = searcher.find_all path
 | 
			
		||||
 | 
			
		||||
    specs.map do |spec|
 | 
			
		||||
      searcher.matching_files spec, path
 | 
			
		||||
    end.flatten
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Finds the user's home directory.
 | 
			
		||||
  #--
 | 
			
		||||
| 
						 | 
				
			
			@ -353,7 +375,7 @@ module Gem
 | 
			
		|||
    end
 | 
			
		||||
 | 
			
		||||
    if ENV['HOMEDRIVE'] && ENV['HOMEPATH'] then
 | 
			
		||||
      return "#{ENV['HOMEDRIVE']}:#{ENV['HOMEPATH']}"
 | 
			
		||||
      return "#{ENV['HOMEDRIVE']}#{ENV['HOMEPATH']}"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    begin
 | 
			
		||||
| 
						 | 
				
			
			@ -466,13 +488,11 @@ module Gem
 | 
			
		|||
 | 
			
		||||
  ##
 | 
			
		||||
  # manage_gems is useless and deprecated.  Don't call it anymore.
 | 
			
		||||
  #--
 | 
			
		||||
  # TODO warn w/ RubyGems 1.2.x release.
 | 
			
		||||
 | 
			
		||||
  def self.manage_gems
 | 
			
		||||
    #file, lineno = location_of_caller
 | 
			
		||||
  def self.manage_gems # :nodoc:
 | 
			
		||||
    file, lineno = location_of_caller
 | 
			
		||||
 | 
			
		||||
    #warn "#{file}:#{lineno}:Warning: Gem#manage_gems is deprecated and will be removed on or after September 2008."
 | 
			
		||||
    warn "#{file}:#{lineno}:Warning: Gem::manage_gems is deprecated and will be removed on or after March 2009."
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
| 
						 | 
				
			
			@ -489,11 +509,7 @@ module Gem
 | 
			
		|||
    @gem_path ||= nil
 | 
			
		||||
 | 
			
		||||
    unless @gem_path then
 | 
			
		||||
      paths = if ENV['GEM_PATH'] then
 | 
			
		||||
                [ENV['GEM_PATH']]
 | 
			
		||||
              else
 | 
			
		||||
                [default_path]
 | 
			
		||||
              end
 | 
			
		||||
      paths = [ENV['GEM_PATH'] || Gem.configuration.path || default_path]
 | 
			
		||||
 | 
			
		||||
      if defined?(APPLE_GEM_HOME) and not ENV['GEM_PATH'] then
 | 
			
		||||
        paths << APPLE_GEM_HOME
 | 
			
		||||
| 
						 | 
				
			
			@ -523,6 +539,40 @@ module Gem
 | 
			
		|||
    @platforms
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Adds a post-install hook that will be passed an Gem::Installer instance
 | 
			
		||||
  # when Gem::Installer#install is called
 | 
			
		||||
 | 
			
		||||
  def self.post_install(&hook)
 | 
			
		||||
    @post_install_hooks << hook
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Adds a post-uninstall hook that will be passed a Gem::Uninstaller instance
 | 
			
		||||
  # and the spec that was uninstalled when Gem::Uninstaller#uninstall is
 | 
			
		||||
  # called
 | 
			
		||||
 | 
			
		||||
  def self.post_uninstall(&hook)
 | 
			
		||||
    @post_uninstall_hooks << hook
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Adds a pre-install hook that will be passed an Gem::Installer instance
 | 
			
		||||
  # when Gem::Installer#install is called
 | 
			
		||||
 | 
			
		||||
  def self.pre_install(&hook)
 | 
			
		||||
    @pre_install_hooks << hook
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Adds a pre-uninstall hook that will be passed an Gem::Uninstaller instance
 | 
			
		||||
  # and the spec that will be uninstalled when Gem::Uninstaller#uninstall is
 | 
			
		||||
  # called
 | 
			
		||||
 | 
			
		||||
  def self.pre_uninstall(&hook)
 | 
			
		||||
    @pre_uninstall_hooks << hook
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # The directory prefix this RubyGems was installed at.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -600,6 +650,9 @@ module Gem
 | 
			
		|||
      @ruby = File.join(ConfigMap[:bindir],
 | 
			
		||||
                        ConfigMap[:ruby_install_name])
 | 
			
		||||
      @ruby << ConfigMap[:EXEEXT]
 | 
			
		||||
 | 
			
		||||
      # escape string in case path to ruby executable contain spaces.
 | 
			
		||||
      @ruby.sub!(/.*\s.*/m, '"\&"')
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @ruby
 | 
			
		||||
| 
						 | 
				
			
			@ -655,7 +708,13 @@ module Gem
 | 
			
		|||
    end
 | 
			
		||||
 | 
			
		||||
    @gem_path.uniq!
 | 
			
		||||
    @gem_path.each do |gp| ensure_gem_subdirectories(gp) end
 | 
			
		||||
    @gem_path.each do |path|
 | 
			
		||||
      if 0 == File.expand_path(path).index(Gem.user_home) and
 | 
			
		||||
         Etc.getpwuid.uid != File::Stat.new(Gem.user_home).uid then
 | 
			
		||||
        next # only create by matching user
 | 
			
		||||
      end
 | 
			
		||||
      ensure_gem_subdirectories path
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private_class_method :set_paths
 | 
			
		||||
| 
						 | 
				
			
			@ -685,6 +744,14 @@ module Gem
 | 
			
		|||
    @sources
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Need to be able to set the sources without calling
 | 
			
		||||
  # Gem.sources.replace since that would cause an infinite loop.
 | 
			
		||||
 | 
			
		||||
  def self.sources=(new_sources)
 | 
			
		||||
    @sources = new_sources
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Glob pattern for require-able path suffixes.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -731,6 +798,27 @@ module Gem
 | 
			
		|||
 | 
			
		||||
    attr_reader :loaded_specs
 | 
			
		||||
 | 
			
		||||
    ##
 | 
			
		||||
    # The list of hooks to be run before Gem::Install#install does any work
 | 
			
		||||
 | 
			
		||||
    attr_reader :post_install_hooks
 | 
			
		||||
 | 
			
		||||
    ##
 | 
			
		||||
    # The list of hooks to be run before Gem::Uninstall#uninstall does any
 | 
			
		||||
    # work
 | 
			
		||||
 | 
			
		||||
    attr_reader :post_uninstall_hooks
 | 
			
		||||
 | 
			
		||||
    ##
 | 
			
		||||
    # The list of hooks to be run after Gem::Install#install is finished
 | 
			
		||||
 | 
			
		||||
    attr_reader :pre_install_hooks
 | 
			
		||||
 | 
			
		||||
    ##
 | 
			
		||||
    # The list of hooks to be run after Gem::Uninstall#uninstall is finished
 | 
			
		||||
 | 
			
		||||
    attr_reader :pre_uninstall_hooks
 | 
			
		||||
 | 
			
		||||
    # :stopdoc:
 | 
			
		||||
 | 
			
		||||
    alias cache source_index # an alias for the old name
 | 
			
		||||
| 
						 | 
				
			
			@ -781,7 +869,10 @@ if defined?(RUBY_ENGINE) then
 | 
			
		|||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
require 'rubygems/config_file'
 | 
			
		||||
 | 
			
		||||
if RUBY_VERSION < '1.9' then
 | 
			
		||||
  require 'rubygems/custom_require'
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
Gem.clear_paths
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -51,7 +51,7 @@ class Gem::Commands::ContentsCommand < Gem::Command
 | 
			
		|||
 | 
			
		||||
    si = Gem::SourceIndex.from_gems_in(*s)
 | 
			
		||||
 | 
			
		||||
    gem_spec = si.search(/\A#{gem}\z/, version).last
 | 
			
		||||
    gem_spec = si.find_name(gem, version).last
 | 
			
		||||
 | 
			
		||||
    unless gem_spec then
 | 
			
		||||
      say "Unable to find gem '#{gem}' in #{path_kind}"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,6 +18,46 @@ class Gem::Commands::EnvironmentCommand < Gem::Command
 | 
			
		|||
    return args.gsub(/^\s+/, '')
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def description # :nodoc:
 | 
			
		||||
    <<-EOF
 | 
			
		||||
The RubyGems environment can be controlled through command line arguments,
 | 
			
		||||
gemrc files, environment variables and built-in defaults.
 | 
			
		||||
 | 
			
		||||
Command line argument defaults and some RubyGems defaults can be set in
 | 
			
		||||
~/.gemrc file for individual users and a /etc/gemrc for all users.  A gemrc
 | 
			
		||||
is a YAML file with the following YAML keys:
 | 
			
		||||
 | 
			
		||||
  :sources: A YAML array of remote gem repositories to install gems from
 | 
			
		||||
  :verbose: Verbosity of the gem command.  false, true, and :really are the
 | 
			
		||||
            levels
 | 
			
		||||
  :update_sources: Enable/disable automatic updating of repository metadata
 | 
			
		||||
  :backtrace: Print backtrace when RubyGems encounters an error
 | 
			
		||||
  :bulk_threshold: Switch to a bulk update when this many sources are out of
 | 
			
		||||
                   date (legacy setting)
 | 
			
		||||
  :gempath: The paths in which to look for gems
 | 
			
		||||
  gem_command: A string containing arguments for the specified gem command
 | 
			
		||||
 | 
			
		||||
Example:
 | 
			
		||||
 | 
			
		||||
  :verbose: false
 | 
			
		||||
  install: --no-wrappers
 | 
			
		||||
  update: --no-wrappers
 | 
			
		||||
 | 
			
		||||
RubyGems' default local repository can be overriden with the GEM_PATH and
 | 
			
		||||
GEM_HOME environment variables.  GEM_HOME sets the default repository to
 | 
			
		||||
install into.  GEM_PATH allows multiple local repositories to be searched for
 | 
			
		||||
gems.
 | 
			
		||||
 | 
			
		||||
If you are behind a proxy server, RubyGems uses the HTTP_PROXY,
 | 
			
		||||
HTTP_PROXY_USER and HTTP_PROXY_PASS environment variables to discover the
 | 
			
		||||
proxy server.
 | 
			
		||||
 | 
			
		||||
If you are packaging RubyGems all of RubyGems' defaults are in
 | 
			
		||||
lib/rubygems/defaults.rb.  You may override these in
 | 
			
		||||
lib/rubygems/defaults/operating_system.rb
 | 
			
		||||
    EOF
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def usage # :nodoc:
 | 
			
		||||
    "#{program_name} [arg]"
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,9 +20,9 @@ Some examples of 'gem' usage.
 | 
			
		|||
    gem install --remote rake --test --rdoc --ri
 | 
			
		||||
 | 
			
		||||
* Install 'rake', but only version 0.3.1, even if dependencies
 | 
			
		||||
  are not met, and into a specific directory:
 | 
			
		||||
  are not met, and into a user-specific directory:
 | 
			
		||||
 | 
			
		||||
    gem install rake --version 0.3.1 --force --install-dir $HOME/.gems
 | 
			
		||||
    gem install rake --version 0.3.1 --force --user-install
 | 
			
		||||
 | 
			
		||||
* List local gems whose name begins with 'D':
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,6 +38,19 @@ class Gem::Commands::InstallCommand < Gem::Command
 | 
			
		|||
    "--no-test --install-dir #{Gem.dir}"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def description # :nodoc:
 | 
			
		||||
    <<-EOF
 | 
			
		||||
The install command installs local or remote gem into a gem repository.
 | 
			
		||||
 | 
			
		||||
For gems with executables ruby installs a wrapper file into the executable
 | 
			
		||||
directory by deault.  This can be overridden with the --no-wrappers option.
 | 
			
		||||
The wrapper allows you to choose among alternate gem versions using _version_.
 | 
			
		||||
 | 
			
		||||
For example `rake _0.7.3_ --version` will run rake version 0.7.3 if a newer
 | 
			
		||||
version is also installed.
 | 
			
		||||
    EOF
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def usage # :nodoc:
 | 
			
		||||
    "#{program_name} GEMNAME [GEMNAME ...] [options] -- --build-flags"
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			@ -106,6 +119,8 @@ class Gem::Commands::InstallCommand < Gem::Command
 | 
			
		|||
      installed_gems.each do |gem|
 | 
			
		||||
        Gem::DocManager.new(gem, options[:rdoc_args]).generate_ri
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      Gem::DocManager.update_ri_cache
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if options[:generate_rdoc] then
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,15 +58,15 @@ lock it down to the exact version.
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def complain(message)
 | 
			
		||||
    if options.strict then
 | 
			
		||||
      raise message
 | 
			
		||||
    if options[:strict] then
 | 
			
		||||
      raise Gem::Exception, message
 | 
			
		||||
    else
 | 
			
		||||
      say "# #{message}"
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def execute
 | 
			
		||||
    say 'require "rubygems"'
 | 
			
		||||
    say "require 'rubygems'"
 | 
			
		||||
 | 
			
		||||
    locked = {}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -77,15 +77,20 @@ lock it down to the exact version.
 | 
			
		|||
 | 
			
		||||
      spec = Gem::SourceIndex.load_specification spec_path(full_name)
 | 
			
		||||
 | 
			
		||||
      if spec.nil? then
 | 
			
		||||
        complain "Could not find gem #{full_name}, try using the full name"
 | 
			
		||||
        next
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      say "gem '#{spec.name}', '= #{spec.version}'" unless locked[spec.name]
 | 
			
		||||
      locked[spec.name] = true
 | 
			
		||||
 | 
			
		||||
      spec.runtime_dependencies.each do |dep|
 | 
			
		||||
        next if locked[dep.name]
 | 
			
		||||
        candidates = Gem.source_index.search dep.name, dep.requirement_list
 | 
			
		||||
        candidates = Gem.source_index.search dep
 | 
			
		||||
 | 
			
		||||
        if candidates.empty? then
 | 
			
		||||
          complain "Unable to satisfy '#{dep}' from currently installed gems."
 | 
			
		||||
          complain "Unable to satisfy '#{dep}' from currently installed gems"
 | 
			
		||||
        else
 | 
			
		||||
          pending << candidates.last.full_name
 | 
			
		||||
        end
 | 
			
		||||
| 
						 | 
				
			
			@ -94,7 +99,11 @@ lock it down to the exact version.
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def spec_path(gem_full_name)
 | 
			
		||||
    File.join Gem.path, "specifications", "#{gem_full_name }.gemspec"
 | 
			
		||||
    gemspecs = Gem.path.map do |path|
 | 
			
		||||
      File.join path, "specifications", "#{gem_full_name}.gemspec"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    gemspecs.find { |gemspec| File.exist? gemspec }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,7 +19,7 @@ class Gem::Commands::OutdatedCommand < Gem::Command
 | 
			
		|||
    locals = Gem::SourceIndex.from_installed_gems
 | 
			
		||||
 | 
			
		||||
    locals.outdated.sort.each do |name|
 | 
			
		||||
      local = locals.search(/^#{name}$/).last
 | 
			
		||||
      local = locals.find_name(name).last
 | 
			
		||||
 | 
			
		||||
      dep = Gem::Dependency.new local.name, ">= #{local.version}"
 | 
			
		||||
      remotes = Gem::SpecFetcher.fetcher.fetch dep
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,7 +57,7 @@ revert the gem.
 | 
			
		|||
              end
 | 
			
		||||
            else
 | 
			
		||||
              gem_name = get_one_gem_name
 | 
			
		||||
              Gem::SourceIndex.from_installed_gems.search(gem_name,
 | 
			
		||||
              Gem::SourceIndex.from_installed_gems.find_name(gem_name,
 | 
			
		||||
                                                          options[:version])
 | 
			
		||||
            end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,7 +59,7 @@ class Gem::Commands::QueryCommand < Gem::Command
 | 
			
		|||
      if name.source.empty? then
 | 
			
		||||
        alert_error "You must specify a gem name"
 | 
			
		||||
        exit_code |= 4
 | 
			
		||||
      elsif installed? name.source, options[:version] then
 | 
			
		||||
      elsif installed? name, options[:version] then
 | 
			
		||||
        say "true"
 | 
			
		||||
      else
 | 
			
		||||
        say "false"
 | 
			
		||||
| 
						 | 
				
			
			@ -69,12 +69,16 @@ class Gem::Commands::QueryCommand < Gem::Command
 | 
			
		|||
      raise Gem::SystemExitException, exit_code
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if local? then
 | 
			
		||||
      say
 | 
			
		||||
      say "*** LOCAL GEMS ***"
 | 
			
		||||
      say
 | 
			
		||||
    dep = Gem::Dependency.new name, Gem::Requirement.default
 | 
			
		||||
 | 
			
		||||
      specs = Gem.source_index.search name
 | 
			
		||||
    if local? then
 | 
			
		||||
      if ui.outs.tty? or both? then
 | 
			
		||||
        say
 | 
			
		||||
        say "*** LOCAL GEMS ***"
 | 
			
		||||
        say
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      specs = Gem.source_index.search dep
 | 
			
		||||
 | 
			
		||||
      spec_tuples = specs.map do |spec|
 | 
			
		||||
        [[spec.name, spec.version, spec.original_platform, spec], :local]
 | 
			
		||||
| 
						 | 
				
			
			@ -84,13 +88,14 @@ class Gem::Commands::QueryCommand < Gem::Command
 | 
			
		|||
    end
 | 
			
		||||
 | 
			
		||||
    if remote? then
 | 
			
		||||
      say
 | 
			
		||||
      say "*** REMOTE GEMS ***"
 | 
			
		||||
      say
 | 
			
		||||
      if ui.outs.tty? or both? then
 | 
			
		||||
        say
 | 
			
		||||
        say "*** REMOTE GEMS ***"
 | 
			
		||||
        say
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      all = options[:all]
 | 
			
		||||
 | 
			
		||||
      dep = Gem::Dependency.new name, Gem::Requirement.default
 | 
			
		||||
      begin
 | 
			
		||||
        fetcher = Gem::SpecFetcher.fetcher
 | 
			
		||||
        spec_tuples = fetcher.find_matching dep, all, false
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,11 +59,15 @@ module Gem
 | 
			
		|||
        if specs.empty?
 | 
			
		||||
          fail "Failed to find gem #{gem_name} to generate RDoc for #{options[:version]}"
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        if options[:include_ri]
 | 
			
		||||
          specs.each do |spec|
 | 
			
		||||
            Gem::DocManager.new(spec).generate_ri
 | 
			
		||||
          end
 | 
			
		||||
 | 
			
		||||
          Gem::DocManager.update_ri_cache
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        if options[:include_rdoc]
 | 
			
		||||
          specs.each do |spec|
 | 
			
		||||
            Gem::DocManager.new(spec).generate_rdoc
 | 
			
		||||
| 
						 | 
				
			
			@ -73,6 +77,6 @@ module Gem
 | 
			
		|||
        true
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,6 +40,7 @@ class Gem::Commands::SpecificationCommand < Gem::Command
 | 
			
		|||
  def execute
 | 
			
		||||
    specs = []
 | 
			
		||||
    gem = get_one_gem_name
 | 
			
		||||
    dep = Gem::Dependency.new gem, options[:version]
 | 
			
		||||
 | 
			
		||||
    if local? then
 | 
			
		||||
      if File.exist? gem then
 | 
			
		||||
| 
						 | 
				
			
			@ -47,12 +48,11 @@ class Gem::Commands::SpecificationCommand < Gem::Command
 | 
			
		|||
      end
 | 
			
		||||
 | 
			
		||||
      if specs.empty? then
 | 
			
		||||
        specs.push(*Gem.source_index.search(/\A#{gem}\z/, options[:version]))
 | 
			
		||||
        specs.push(*Gem.source_index.search(dep))
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if remote? then
 | 
			
		||||
      dep = Gem::Dependency.new gem, options[:version]
 | 
			
		||||
      found = Gem::SpecFetcher.fetcher.fetch dep
 | 
			
		||||
 | 
			
		||||
      specs.push(*found.map { |spec,| spec })
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,7 +68,7 @@ class Gem::Commands::UnpackCommand < Gem::Command
 | 
			
		|||
  def get_path(gemname, version_req)
 | 
			
		||||
    return gemname if gemname =~ /\.gem$/i
 | 
			
		||||
 | 
			
		||||
    specs = Gem::source_index.search(/\A#{gemname}\z/, version_req)
 | 
			
		||||
    specs = Gem::source_index.find_name gemname, version_req
 | 
			
		||||
 | 
			
		||||
    selected = specs.sort_by { |s| s.version }.last
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,6 +45,8 @@ class Gem::Commands::UpdateCommand < Gem::Command
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def execute
 | 
			
		||||
    hig = {}
 | 
			
		||||
 | 
			
		||||
    if options[:system] then
 | 
			
		||||
      say "Updating RubyGems"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -52,16 +54,22 @@ class Gem::Commands::UpdateCommand < Gem::Command
 | 
			
		|||
        fail "No gem names are allowed with the --system option"
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      options[:args] = ["rubygems-update"]
 | 
			
		||||
      spec = Gem::Specification.new
 | 
			
		||||
      spec.name = 'rubygems-update'
 | 
			
		||||
      spec.version = Gem::Version.new Gem::RubyGemsVersion
 | 
			
		||||
      spec.version = Gem::Version.new '1.1.1'
 | 
			
		||||
      hig['rubygems-update'] = spec
 | 
			
		||||
 | 
			
		||||
      options[:user_install] = false
 | 
			
		||||
    else
 | 
			
		||||
      say "Updating installed gems"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    hig = {} # highest installed gems
 | 
			
		||||
      hig = {} # highest installed gems
 | 
			
		||||
 | 
			
		||||
    Gem.source_index.each do |name, spec|
 | 
			
		||||
      if hig[spec.name].nil? or hig[spec.name].version < spec.version then
 | 
			
		||||
        hig[spec.name] = spec
 | 
			
		||||
      Gem.source_index.each do |name, spec|
 | 
			
		||||
        if hig[spec.name].nil? or hig[spec.name].version < spec.version then
 | 
			
		||||
          hig[spec.name] = spec
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -84,14 +92,14 @@ class Gem::Commands::UpdateCommand < Gem::Command
 | 
			
		|||
    end
 | 
			
		||||
 | 
			
		||||
    if gems_to_update.include? "rubygems-update" then
 | 
			
		||||
      latest_ruby_gem = remote_gemspecs.select do |s|
 | 
			
		||||
        s.name == 'rubygems-update'
 | 
			
		||||
      end
 | 
			
		||||
      Gem.source_index.refresh!
 | 
			
		||||
 | 
			
		||||
      latest_ruby_gem = latest_ruby_gem.sort_by { |s| s.version }.last
 | 
			
		||||
      update_gems = Gem.source_index.search 'rubygems-update'
 | 
			
		||||
 | 
			
		||||
      say "Updating version of RubyGems to #{latest_ruby_gem.version}"
 | 
			
		||||
      installed = do_rubygems_update latest_ruby_gem.version
 | 
			
		||||
      latest_update_gem = update_gems.sort_by { |s| s.version }.last
 | 
			
		||||
 | 
			
		||||
      say "Updating RubyGems to #{latest_update_gem.version}"
 | 
			
		||||
      installed = do_rubygems_update latest_update_gem.version
 | 
			
		||||
 | 
			
		||||
      say "RubyGems system software updated" if installed
 | 
			
		||||
    else
 | 
			
		||||
| 
						 | 
				
			
			@ -103,6 +111,9 @@ class Gem::Commands::UpdateCommand < Gem::Command
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Update the RubyGems software to +version+.
 | 
			
		||||
 | 
			
		||||
  def do_rubygems_update(version)
 | 
			
		||||
    args = []
 | 
			
		||||
    args.push '--prefix', Gem.prefix unless Gem.prefix.nil?
 | 
			
		||||
| 
						 | 
				
			
			@ -112,8 +123,6 @@ class Gem::Commands::UpdateCommand < Gem::Command
 | 
			
		|||
 | 
			
		||||
    update_dir = File.join Gem.dir, 'gems', "rubygems-update-#{version}"
 | 
			
		||||
 | 
			
		||||
    success = false
 | 
			
		||||
 | 
			
		||||
    Dir.chdir update_dir do
 | 
			
		||||
      say "Installing RubyGems #{version}"
 | 
			
		||||
      setup_cmd = "#{Gem.ruby} setup.rb #{args.join ' '}"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,10 +3,10 @@ require 'rubygems/gem_path_searcher'
 | 
			
		|||
 | 
			
		||||
class Gem::Commands::WhichCommand < Gem::Command
 | 
			
		||||
 | 
			
		||||
  EXT = %w[.rb .rbw .so .dll] # HACK
 | 
			
		||||
  EXT = %w[.rb .rbw .so .dll .bundle] # HACK
 | 
			
		||||
 | 
			
		||||
  def initialize
 | 
			
		||||
    super 'which', 'Find the location of a library',
 | 
			
		||||
    super 'which', 'Find the location of a library file you can require',
 | 
			
		||||
          :search_gems_first => false, :show_all => false
 | 
			
		||||
 | 
			
		||||
    add_option '-a', '--[no-]all', 'show all matching files' do |show_all, options|
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ class Gem::Commands::WhichCommand < Gem::Command
 | 
			
		|||
      paths = find_paths arg, dirs
 | 
			
		||||
 | 
			
		||||
      if paths.empty? then
 | 
			
		||||
        say "Can't find #{arg}"
 | 
			
		||||
        say "Can't find ruby library file or shared library #{arg}"
 | 
			
		||||
      else
 | 
			
		||||
        say paths
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			@ -84,3 +84,4 @@ class Gem::Commands::WhichCommand < Gem::Command
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,6 +49,9 @@ class Gem::ConfigFile
 | 
			
		|||
  # List of arguments supplied to the config file object.
 | 
			
		||||
  attr_reader :args
 | 
			
		||||
 | 
			
		||||
  # Where to look for gems
 | 
			
		||||
  attr_accessor :path
 | 
			
		||||
 | 
			
		||||
  # True if we print backtraces on errors.
 | 
			
		||||
  attr_writer :backtrace
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -123,9 +126,10 @@ class Gem::ConfigFile
 | 
			
		|||
    @backtrace = @hash[:backtrace] if @hash.key? :backtrace
 | 
			
		||||
    @benchmark = @hash[:benchmark] if @hash.key? :benchmark
 | 
			
		||||
    @bulk_threshold = @hash[:bulk_threshold] if @hash.key? :bulk_threshold
 | 
			
		||||
    Gem.sources.replace @hash[:sources] if @hash.key? :sources
 | 
			
		||||
    Gem.sources = @hash[:sources] if @hash.key? :sources
 | 
			
		||||
    @verbose = @hash[:verbose] if @hash.key? :verbose
 | 
			
		||||
    @update_sources = @hash[:update_sources] if @hash.key? :update_sources
 | 
			
		||||
    @path = @hash[:gempath]
 | 
			
		||||
 | 
			
		||||
    handle_arguments arg_list
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,36 +1,52 @@
 | 
			
		|||
module Gem
 | 
			
		||||
 | 
			
		||||
  # An Array of the default sources that come with RubyGems.
 | 
			
		||||
  ##
 | 
			
		||||
  # An Array of the default sources that come with RubyGems
 | 
			
		||||
 | 
			
		||||
  def self.default_sources
 | 
			
		||||
    %w[http://gems.rubyforge.org/]
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Default home directory path to be used if an alternate value is not
 | 
			
		||||
  # specified in the environment.
 | 
			
		||||
  # specified in the environment
 | 
			
		||||
 | 
			
		||||
  def self.default_dir
 | 
			
		||||
    if defined? RUBY_FRAMEWORK_VERSION then
 | 
			
		||||
      File.join File.dirname(ConfigMap[:sitedir]), 'Gems',
 | 
			
		||||
                ConfigMap[:ruby_version]
 | 
			
		||||
    elsif defined? RUBY_ENGINE then
 | 
			
		||||
      File.join ConfigMap[:libdir], RUBY_ENGINE, 'gems',
 | 
			
		||||
                ConfigMap[:ruby_version]
 | 
			
		||||
    else
 | 
			
		||||
      File.join ConfigMap[:libdir], 'ruby', 'gems', ConfigMap[:ruby_version]
 | 
			
		||||
      File.join(ConfigMap[:libdir], ruby_engine, 'gems',
 | 
			
		||||
                ConfigMap[:ruby_version])
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Default gem load path.
 | 
			
		||||
  def self.default_path
 | 
			
		||||
    [File.join(ENV['HOME'], '.gem'), default_dir]
 | 
			
		||||
  ##
 | 
			
		||||
  # Path for gems in the user's home directory
 | 
			
		||||
 | 
			
		||||
  def self.user_dir
 | 
			
		||||
    File.join(Gem.user_home, '.gem', ruby_engine,
 | 
			
		||||
              ConfigMap[:ruby_version])
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Deduce Ruby's --program-prefix and --program-suffix from its install name.
 | 
			
		||||
  ##
 | 
			
		||||
  # Default gem load path
 | 
			
		||||
 | 
			
		||||
  def self.default_path
 | 
			
		||||
    [user_dir, default_dir]
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Deduce Ruby's --program-prefix and --program-suffix from its install name
 | 
			
		||||
 | 
			
		||||
  def self.default_exec_format
 | 
			
		||||
    baseruby = ConfigMap[:BASERUBY] || 'ruby'
 | 
			
		||||
    ConfigMap[:RUBY_INSTALL_NAME].sub(baseruby, '%s') rescue '%s'
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # The default directory for binaries
 | 
			
		||||
 | 
			
		||||
  def self.default_bindir
 | 
			
		||||
    if defined? RUBY_FRAMEWORK_VERSION then # mac framework support
 | 
			
		||||
      '/usr/bin'
 | 
			
		||||
| 
						 | 
				
			
			@ -39,15 +55,30 @@ module Gem
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # The default system-wide source info cache directory.
 | 
			
		||||
  ##
 | 
			
		||||
  # The default system-wide source info cache directory
 | 
			
		||||
 | 
			
		||||
  def self.default_system_source_cache_dir
 | 
			
		||||
    File.join Gem.dir, 'source_cache'
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # The default user-specific source info cache directory.
 | 
			
		||||
  ##
 | 
			
		||||
  # The default user-specific source info cache directory
 | 
			
		||||
 | 
			
		||||
  def self.default_user_source_cache_dir
 | 
			
		||||
    File.join Gem.user_home, '.gem', 'source_cache'
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # A wrapper around RUBY_ENGINE const that may not be defined
 | 
			
		||||
 | 
			
		||||
  def self.ruby_engine
 | 
			
		||||
    if defined? RUBY_ENGINE then
 | 
			
		||||
      RUBY_ENGINE
 | 
			
		||||
    else
 | 
			
		||||
      'ruby'
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -38,9 +38,17 @@ class Gem::DependencyInstaller
 | 
			
		|||
  # :ignore_dependencies:: Don't install any dependencies.
 | 
			
		||||
  # :install_dir:: See Gem::Installer#install.
 | 
			
		||||
  # :security_policy:: See Gem::Installer::new and Gem::Security.
 | 
			
		||||
  # :user_install:: See Gem::Installer.new
 | 
			
		||||
  # :wrappers:: See Gem::Installer::new
 | 
			
		||||
 | 
			
		||||
  def initialize(options = {})
 | 
			
		||||
    if options[:install_dir] then
 | 
			
		||||
      spec_dir = options[:install_dir], 'specifications'
 | 
			
		||||
      @source_index = Gem::SourceIndex.from_gems_in spec_dir
 | 
			
		||||
    else
 | 
			
		||||
      @source_index = Gem.source_index
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    options = DEFAULT_OPTIONS.merge options
 | 
			
		||||
 | 
			
		||||
    @bin_dir = options[:bin_dir]
 | 
			
		||||
| 
						 | 
				
			
			@ -51,19 +59,13 @@ class Gem::DependencyInstaller
 | 
			
		|||
    @format_executable = options[:format_executable]
 | 
			
		||||
    @ignore_dependencies = options[:ignore_dependencies]
 | 
			
		||||
    @security_policy = options[:security_policy]
 | 
			
		||||
    @user_install = options[:user_install]
 | 
			
		||||
    @wrappers = options[:wrappers]
 | 
			
		||||
 | 
			
		||||
    @installed_gems = []
 | 
			
		||||
 | 
			
		||||
    @install_dir = options[:install_dir] || Gem.dir
 | 
			
		||||
    @cache_dir = options[:cache_dir] || @install_dir
 | 
			
		||||
 | 
			
		||||
    if options[:install_dir] then
 | 
			
		||||
      spec_dir = File.join @install_dir, 'specifications'
 | 
			
		||||
      @source_index = Gem::SourceIndex.from_gems_in spec_dir
 | 
			
		||||
    else
 | 
			
		||||
      @source_index = Gem.source_index
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
| 
						 | 
				
			
			@ -232,15 +234,17 @@ class Gem::DependencyInstaller
 | 
			
		|||
      end
 | 
			
		||||
 | 
			
		||||
      inst = Gem::Installer.new local_gem_path,
 | 
			
		||||
                                :env_shebang => @env_shebang,
 | 
			
		||||
                                :force => @force,
 | 
			
		||||
                                :format_executable => @format_executable,
 | 
			
		||||
                                :bin_dir             => @bin_dir,
 | 
			
		||||
                                :development         => @development,
 | 
			
		||||
                                :env_shebang         => @env_shebang,
 | 
			
		||||
                                :force               => @force,
 | 
			
		||||
                                :format_executable   => @format_executable,
 | 
			
		||||
                                :ignore_dependencies => @ignore_dependencies,
 | 
			
		||||
                                :install_dir => @install_dir,
 | 
			
		||||
                                :security_policy => @security_policy,
 | 
			
		||||
                                :wrappers => @wrappers,
 | 
			
		||||
                                :bin_dir => @bin_dir,
 | 
			
		||||
                                :development => @development
 | 
			
		||||
                                :install_dir         => @install_dir,
 | 
			
		||||
                                :security_policy     => @security_policy,
 | 
			
		||||
                                :source_index        => @source_index,
 | 
			
		||||
                                :user_install        => @user_install,
 | 
			
		||||
                                :wrappers            => @wrappers
 | 
			
		||||
 | 
			
		||||
      spec = inst.install
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,132 +5,194 @@
 | 
			
		|||
#++
 | 
			
		||||
 | 
			
		||||
require 'fileutils'
 | 
			
		||||
require 'rubygems'
 | 
			
		||||
 | 
			
		||||
module Gem
 | 
			
		||||
##
 | 
			
		||||
# The documentation manager generates RDoc and RI for RubyGems.
 | 
			
		||||
 | 
			
		||||
  class DocManager
 | 
			
		||||
class Gem::DocManager
 | 
			
		||||
 | 
			
		||||
    include UserInteraction
 | 
			
		||||
  include Gem::UserInteraction
 | 
			
		||||
 | 
			
		||||
    # Create a document manager for the given gem spec.
 | 
			
		||||
    #
 | 
			
		||||
    # spec::      The Gem::Specification object representing the gem.
 | 
			
		||||
    # rdoc_args:: Optional arguments for RDoc (template etc.) as a String.
 | 
			
		||||
    #
 | 
			
		||||
    def initialize(spec, rdoc_args="")
 | 
			
		||||
      @spec = spec
 | 
			
		||||
      @doc_dir = File.join(spec.installation_path, "doc", spec.full_name)
 | 
			
		||||
      @rdoc_args = rdoc_args.nil? ? [] : rdoc_args.split
 | 
			
		||||
  @configured_args = []
 | 
			
		||||
 | 
			
		||||
  def self.configured_args
 | 
			
		||||
    @configured_args ||= []
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def self.configured_args=(args)
 | 
			
		||||
    case args
 | 
			
		||||
    when Array
 | 
			
		||||
      @configured_args = args
 | 
			
		||||
    when String
 | 
			
		||||
      @configured_args = args.split
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Load RDoc from a gem if it is available, otherwise from Ruby's stdlib
 | 
			
		||||
 | 
			
		||||
  def self.load_rdoc
 | 
			
		||||
    begin
 | 
			
		||||
      gem 'rdoc'
 | 
			
		||||
    rescue Gem::LoadError
 | 
			
		||||
      # use built-in RDoc
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Is the RDoc documentation installed?
 | 
			
		||||
    def rdoc_installed?
 | 
			
		||||
      return File.exist?(File.join(@doc_dir, "rdoc"))
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Generate the RI documents for this gem spec.
 | 
			
		||||
    #
 | 
			
		||||
    # Note that if both RI and RDoc documents are generated from the
 | 
			
		||||
    # same process, the RI docs should be done first (a likely bug in
 | 
			
		||||
    # RDoc will cause RI docs generation to fail if run after RDoc).
 | 
			
		||||
    def generate_ri
 | 
			
		||||
      if @spec.has_rdoc then
 | 
			
		||||
        load_rdoc
 | 
			
		||||
        install_ri # RDoc bug, ri goes first
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      FileUtils.mkdir_p @doc_dir unless File.exist?(@doc_dir)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Generate the RDoc documents for this gem spec.
 | 
			
		||||
    #
 | 
			
		||||
    # Note that if both RI and RDoc documents are generated from the
 | 
			
		||||
    # same process, the RI docs should be done first (a likely bug in
 | 
			
		||||
    # RDoc will cause RI docs generation to fail if run after RDoc).
 | 
			
		||||
    def generate_rdoc
 | 
			
		||||
      if @spec.has_rdoc then
 | 
			
		||||
        load_rdoc
 | 
			
		||||
        install_rdoc
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      FileUtils.mkdir_p @doc_dir unless File.exist?(@doc_dir)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Load the RDoc documentation generator library.
 | 
			
		||||
    def load_rdoc
 | 
			
		||||
      if File.exist?(@doc_dir) && !File.writable?(@doc_dir) then
 | 
			
		||||
        raise Gem::FilePermissionError.new(@doc_dir)
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      FileUtils.mkdir_p @doc_dir unless File.exist?(@doc_dir)
 | 
			
		||||
 | 
			
		||||
      begin
 | 
			
		||||
        gem 'rdoc'
 | 
			
		||||
      rescue Gem::LoadError
 | 
			
		||||
        # use built-in RDoc
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      begin
 | 
			
		||||
        require 'rdoc/rdoc'
 | 
			
		||||
      rescue LoadError => e
 | 
			
		||||
        raise Gem::DocumentError,
 | 
			
		||||
    begin
 | 
			
		||||
      require 'rdoc/rdoc'
 | 
			
		||||
    rescue LoadError => e
 | 
			
		||||
      raise Gem::DocumentError,
 | 
			
		||||
          "ERROR: RDoc documentation generator not installed!"
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Updates the RI cache for RDoc 2 if it is installed
 | 
			
		||||
 | 
			
		||||
  def self.update_ri_cache
 | 
			
		||||
    load_rdoc rescue return
 | 
			
		||||
 | 
			
		||||
    return unless defined? RDoc::VERSION # RDoc 1 does not have VERSION
 | 
			
		||||
 | 
			
		||||
    require 'rdoc/ri/driver'
 | 
			
		||||
 | 
			
		||||
    options = {
 | 
			
		||||
      :use_cache => true,
 | 
			
		||||
      :use_system => true,
 | 
			
		||||
      :use_site => true,
 | 
			
		||||
      :use_home => true,
 | 
			
		||||
      :use_gems => true,
 | 
			
		||||
      :formatter => RDoc::RI::Formatter,
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    driver = RDoc::RI::Driver.new(options).class_cache
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Create a document manager for +spec+. +rdoc_args+ contains arguments for
 | 
			
		||||
  # RDoc (template etc.) as a String.
 | 
			
		||||
 | 
			
		||||
  def initialize(spec, rdoc_args="")
 | 
			
		||||
    @spec = spec
 | 
			
		||||
    @doc_dir = File.join(spec.installation_path, "doc", spec.full_name)
 | 
			
		||||
    @rdoc_args = rdoc_args.nil? ? [] : rdoc_args.split
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Is the RDoc documentation installed?
 | 
			
		||||
 | 
			
		||||
  def rdoc_installed?
 | 
			
		||||
    File.exist?(File.join(@doc_dir, "rdoc"))
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Generate the RI documents for this gem spec.
 | 
			
		||||
  #
 | 
			
		||||
  # Note that if both RI and RDoc documents are generated from the same
 | 
			
		||||
  # process, the RI docs should be done first (a likely bug in RDoc will cause
 | 
			
		||||
  # RI docs generation to fail if run after RDoc).
 | 
			
		||||
 | 
			
		||||
  def generate_ri
 | 
			
		||||
    if @spec.has_rdoc then
 | 
			
		||||
      setup_rdoc
 | 
			
		||||
      install_ri # RDoc bug, ri goes first
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def install_rdoc
 | 
			
		||||
      rdoc_dir = File.join @doc_dir, 'rdoc'
 | 
			
		||||
    FileUtils.mkdir_p @doc_dir unless File.exist?(@doc_dir)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
      FileUtils.rm_rf rdoc_dir
 | 
			
		||||
  ##
 | 
			
		||||
  # Generate the RDoc documents for this gem spec.
 | 
			
		||||
  #
 | 
			
		||||
  # Note that if both RI and RDoc documents are generated from the same
 | 
			
		||||
  # process, the RI docs should be done first (a likely bug in RDoc will cause
 | 
			
		||||
  # RI docs generation to fail if run after RDoc).
 | 
			
		||||
 | 
			
		||||
      say "Installing RDoc documentation for #{@spec.full_name}..."
 | 
			
		||||
      run_rdoc '--op', rdoc_dir
 | 
			
		||||
  def generate_rdoc
 | 
			
		||||
    if @spec.has_rdoc then
 | 
			
		||||
      setup_rdoc
 | 
			
		||||
      install_rdoc
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def install_ri
 | 
			
		||||
      ri_dir = File.join @doc_dir, 'ri'
 | 
			
		||||
    FileUtils.mkdir_p @doc_dir unless File.exist?(@doc_dir)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
      FileUtils.rm_rf ri_dir
 | 
			
		||||
  ##
 | 
			
		||||
  # Generate and install RDoc into the documentation directory
 | 
			
		||||
 | 
			
		||||
      say "Installing ri documentation for #{@spec.full_name}..."
 | 
			
		||||
      run_rdoc '--ri', '--op', ri_dir
 | 
			
		||||
  def install_rdoc
 | 
			
		||||
    rdoc_dir = File.join @doc_dir, 'rdoc'
 | 
			
		||||
 | 
			
		||||
    FileUtils.rm_rf rdoc_dir
 | 
			
		||||
 | 
			
		||||
    say "Installing RDoc documentation for #{@spec.full_name}..."
 | 
			
		||||
    run_rdoc '--op', rdoc_dir
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Generate and install RI into the documentation directory
 | 
			
		||||
 | 
			
		||||
  def install_ri
 | 
			
		||||
    ri_dir = File.join @doc_dir, 'ri'
 | 
			
		||||
 | 
			
		||||
    FileUtils.rm_rf ri_dir
 | 
			
		||||
 | 
			
		||||
    say "Installing ri documentation for #{@spec.full_name}..."
 | 
			
		||||
    run_rdoc '--ri', '--op', ri_dir
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Run RDoc with +args+, which is an ARGV style argument list
 | 
			
		||||
 | 
			
		||||
  def run_rdoc(*args)
 | 
			
		||||
    args << @spec.rdoc_options
 | 
			
		||||
    args << self.class.configured_args
 | 
			
		||||
    args << '--quiet'
 | 
			
		||||
    args << @spec.require_paths.clone
 | 
			
		||||
    args << @spec.extra_rdoc_files
 | 
			
		||||
    args = args.flatten.map do |arg| arg.to_s end
 | 
			
		||||
 | 
			
		||||
    r = RDoc::RDoc.new
 | 
			
		||||
 | 
			
		||||
    old_pwd = Dir.pwd
 | 
			
		||||
    Dir.chdir(@spec.full_gem_path)
 | 
			
		||||
    begin
 | 
			
		||||
      r.document args
 | 
			
		||||
    rescue Errno::EACCES => e
 | 
			
		||||
      dirname = File.dirname e.message.split("-")[1].strip
 | 
			
		||||
      raise Gem::FilePermissionError.new(dirname)
 | 
			
		||||
    rescue RuntimeError => ex
 | 
			
		||||
      alert_error "While generating documentation for #{@spec.full_name}"
 | 
			
		||||
      ui.errs.puts "... MESSAGE:   #{ex}"
 | 
			
		||||
      ui.errs.puts "... RDOC args: #{args.join(' ')}"
 | 
			
		||||
      ui.errs.puts "\t#{ex.backtrace.join "\n\t"}" if
 | 
			
		||||
      Gem.configuration.backtrace
 | 
			
		||||
      ui.errs.puts "(continuing with the rest of the installation)"
 | 
			
		||||
    ensure
 | 
			
		||||
      Dir.chdir(old_pwd)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def setup_rdoc
 | 
			
		||||
    if File.exist?(@doc_dir) && !File.writable?(@doc_dir) then
 | 
			
		||||
      raise Gem::FilePermissionError.new(@doc_dir)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    def run_rdoc(*args)
 | 
			
		||||
      args << @spec.rdoc_options
 | 
			
		||||
      args << DocManager.configured_args
 | 
			
		||||
      args << '--quiet'
 | 
			
		||||
      args << @spec.require_paths.clone
 | 
			
		||||
      args << @spec.extra_rdoc_files
 | 
			
		||||
      args = args.flatten.map do |arg| arg.to_s end
 | 
			
		||||
    FileUtils.mkdir_p @doc_dir unless File.exist?(@doc_dir)
 | 
			
		||||
 | 
			
		||||
      r = RDoc::RDoc.new
 | 
			
		||||
    self.class.load_rdoc
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
      old_pwd = Dir.pwd
 | 
			
		||||
      Dir.chdir(@spec.full_gem_path)
 | 
			
		||||
      begin
 | 
			
		||||
        r.document args
 | 
			
		||||
      rescue Errno::EACCES => e
 | 
			
		||||
        dirname = File.dirname e.message.split("-")[1].strip
 | 
			
		||||
        raise Gem::FilePermissionError.new(dirname)
 | 
			
		||||
      rescue RuntimeError => ex
 | 
			
		||||
        alert_error "While generating documentation for #{@spec.full_name}"
 | 
			
		||||
        ui.errs.puts "... MESSAGE:   #{ex}"
 | 
			
		||||
        ui.errs.puts "... RDOC args: #{args.join(' ')}"
 | 
			
		||||
        ui.errs.puts "\t#{ex.backtrace.join "\n\t"}" if
 | 
			
		||||
          Gem.configuration.backtrace
 | 
			
		||||
        ui.errs.puts "(continuing with the rest of the installation)"
 | 
			
		||||
      ensure
 | 
			
		||||
        Dir.chdir(old_pwd)
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
  ##
 | 
			
		||||
  # Remove RDoc and RI documentation
 | 
			
		||||
 | 
			
		||||
    def uninstall_doc
 | 
			
		||||
      raise Gem::FilePermissionError.new(@spec.installation_path) unless
 | 
			
		||||
        File.writable? @spec.installation_path
 | 
			
		||||
  def uninstall_doc
 | 
			
		||||
    raise Gem::FilePermissionError.new(@spec.installation_path) unless
 | 
			
		||||
    File.writable? @spec.installation_path
 | 
			
		||||
 | 
			
		||||
      original_name = [
 | 
			
		||||
        @spec.name, @spec.version, @spec.original_platform].join '-'
 | 
			
		||||
    original_name = [
 | 
			
		||||
      @spec.name, @spec.version, @spec.original_platform].join '-'
 | 
			
		||||
 | 
			
		||||
      doc_dir = File.join @spec.installation_path, 'doc', @spec.full_name
 | 
			
		||||
      unless File.directory? doc_dir then
 | 
			
		||||
| 
						 | 
				
			
			@ -146,22 +208,7 @@ module Gem
 | 
			
		|||
      end
 | 
			
		||||
 | 
			
		||||
      FileUtils.rm_rf ri_dir
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    class << self
 | 
			
		||||
      def configured_args
 | 
			
		||||
        @configured_args ||= []
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      def configured_args=(args)
 | 
			
		||||
        case args
 | 
			
		||||
        when Array
 | 
			
		||||
          @configured_args = args
 | 
			
		||||
        when String
 | 
			
		||||
          @configured_args = args.split
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,15 +6,15 @@
 | 
			
		|||
 | 
			
		||||
require 'rubygems'
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
##
 | 
			
		||||
# GemPathSearcher has the capability to find loadable files inside
 | 
			
		||||
# gems.  It generates data up front to speed up searches later.
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
class Gem::GemPathSearcher
 | 
			
		||||
 | 
			
		||||
  #
 | 
			
		||||
  ##
 | 
			
		||||
  # Initialise the data we need to make searches later.
 | 
			
		||||
  #
 | 
			
		||||
 | 
			
		||||
  def initialize
 | 
			
		||||
    # We want a record of all the installed gemspecs, in the order
 | 
			
		||||
    # we wish to examine them.
 | 
			
		||||
| 
						 | 
				
			
			@ -27,7 +27,7 @@ class Gem::GemPathSearcher
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # 
 | 
			
		||||
  ##
 | 
			
		||||
  # Look in all the installed gems until a matching _path_ is found.
 | 
			
		||||
  # Return the _gemspec_ of the gem where it was found.  If no match
 | 
			
		||||
  # is found, return nil.
 | 
			
		||||
| 
						 | 
				
			
			@ -46,36 +46,52 @@ class Gem::GemPathSearcher
 | 
			
		|||
  # others), which may or may not already be attached to _file_.
 | 
			
		||||
  # This method doesn't care about the full filename that matches;
 | 
			
		||||
  # only that there is a match.
 | 
			
		||||
  # 
 | 
			
		||||
 | 
			
		||||
  def find(path)
 | 
			
		||||
    @gemspecs.each do |spec|
 | 
			
		||||
      return spec if matching_file(spec, path)
 | 
			
		||||
    @gemspecs.find do |spec| matching_file? spec, path end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Works like #find, but finds all gemspecs matching +path+.
 | 
			
		||||
 | 
			
		||||
  def find_all(path)
 | 
			
		||||
    @gemspecs.select do |spec|
 | 
			
		||||
      matching_file? spec, path
 | 
			
		||||
    end
 | 
			
		||||
    nil
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
  ##
 | 
			
		||||
  # Attempts to find a matching path using the require_paths of the given
 | 
			
		||||
  # +spec+.
 | 
			
		||||
 | 
			
		||||
  # Attempts to find a matching path using the require_paths of the
 | 
			
		||||
  # given _spec_.
 | 
			
		||||
  #
 | 
			
		||||
  # Some of the intermediate results are cached in @lib_dirs for
 | 
			
		||||
  # speed.
 | 
			
		||||
  def matching_file(spec, path)  # :doc:
 | 
			
		||||
  def matching_file?(spec, path)
 | 
			
		||||
    !matching_files(spec, path).empty?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Returns files matching +path+ in +spec+.
 | 
			
		||||
  #--
 | 
			
		||||
  # Some of the intermediate results are cached in @lib_dirs for speed.
 | 
			
		||||
 | 
			
		||||
  def matching_files(spec, path)
 | 
			
		||||
    glob = File.join @lib_dirs[spec.object_id], "#{path}#{Gem.suffix_pattern}"
 | 
			
		||||
    return true unless Dir[glob].select { |f| File.file?(f.untaint) }.empty?
 | 
			
		||||
    Dir[glob].select { |f| File.file? f.untaint }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  # Return a list of all installed gemspecs, sorted by alphabetical
 | 
			
		||||
  # order and in reverse version order.
 | 
			
		||||
  ##
 | 
			
		||||
  # Return a list of all installed gemspecs, sorted by alphabetical order and
 | 
			
		||||
  # in reverse version order.
 | 
			
		||||
 | 
			
		||||
  def init_gemspecs
 | 
			
		||||
    Gem.source_index.map { |_, spec| spec }.sort { |a,b|
 | 
			
		||||
      (a.name <=> b.name).nonzero? || (b.version <=> a.version)
 | 
			
		||||
    }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Returns library directories glob for a gemspec.  For example,
 | 
			
		||||
  #   '/usr/local/lib/ruby/gems/1.8/gems/foobar-1.0/{lib,ext}'
 | 
			
		||||
 | 
			
		||||
  def lib_dirs_for(spec)
 | 
			
		||||
    "#{spec.full_gem_path}/{#{spec.require_paths.join(',')}}"
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -20,6 +20,7 @@ require 'rubygems/require_paths_builder'
 | 
			
		|||
# filesystem including unpacking the gem into its gem dir, installing the
 | 
			
		||||
# gemspec in the specifications dir, storing the cached gem in the cache dir,
 | 
			
		||||
# and installing either wrappers or symlinks for executables.
 | 
			
		||||
 | 
			
		||||
class Gem::Installer
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
| 
						 | 
				
			
			@ -31,8 +32,36 @@ class Gem::Installer
 | 
			
		|||
 | 
			
		||||
  include Gem::RequirePathsBuilder
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # The directory a gem's executables will be installed into
 | 
			
		||||
 | 
			
		||||
  attr_reader :bin_dir
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # The gem repository the gem will be installed into
 | 
			
		||||
 | 
			
		||||
  attr_reader :gem_home
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # The Gem::Specification for the gem being installed
 | 
			
		||||
 | 
			
		||||
  attr_reader :spec
 | 
			
		||||
 | 
			
		||||
  @home_install_warning = false
 | 
			
		||||
  @path_warning = false
 | 
			
		||||
 | 
			
		||||
  class << self
 | 
			
		||||
 | 
			
		||||
    ##
 | 
			
		||||
    # True if we've warned about ~/.gems install
 | 
			
		||||
 | 
			
		||||
    attr_accessor :home_install_warning
 | 
			
		||||
 | 
			
		||||
    ##
 | 
			
		||||
    # True if we've warned about PATH not including Gem.bindir
 | 
			
		||||
 | 
			
		||||
    attr_accessor :path_warning
 | 
			
		||||
 | 
			
		||||
    attr_writer :exec_format
 | 
			
		||||
 | 
			
		||||
    # Defaults to use Ruby's program prefix and suffix.
 | 
			
		||||
| 
						 | 
				
			
			@ -61,11 +90,12 @@ class Gem::Installer
 | 
			
		|||
    @gem = gem
 | 
			
		||||
 | 
			
		||||
    options = {
 | 
			
		||||
      :force => false,
 | 
			
		||||
      :install_dir => Gem.dir,
 | 
			
		||||
      :exec_format => false,
 | 
			
		||||
      :env_shebang => false,
 | 
			
		||||
      :bin_dir => nil
 | 
			
		||||
      :bin_dir      => nil,
 | 
			
		||||
      :env_shebang  => false,
 | 
			
		||||
      :exec_format  => false,
 | 
			
		||||
      :force        => false,
 | 
			
		||||
      :install_dir  => Gem.dir,
 | 
			
		||||
      :source_index => Gem.source_index,
 | 
			
		||||
    }.merge options
 | 
			
		||||
 | 
			
		||||
    @env_shebang = options[:env_shebang]
 | 
			
		||||
| 
						 | 
				
			
			@ -78,6 +108,7 @@ class Gem::Installer
 | 
			
		|||
    @wrappers = options[:wrappers]
 | 
			
		||||
    @bin_dir = options[:bin_dir]
 | 
			
		||||
    @development = options[:development]
 | 
			
		||||
    @source_index = options[:source_index]
 | 
			
		||||
 | 
			
		||||
    begin
 | 
			
		||||
      @format = Gem::Format.from_file_by_path @gem, @security_policy
 | 
			
		||||
| 
						 | 
				
			
			@ -85,30 +116,41 @@ class Gem::Installer
 | 
			
		|||
      raise Gem::InstallError, "invalid gem format for #{@gem}"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    begin
 | 
			
		||||
      FileUtils.mkdir_p @gem_home
 | 
			
		||||
    rescue Errno::EACCESS, Errno::ENOTDIR
 | 
			
		||||
      # We'll divert to ~/.gems below
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if not File.writable? @gem_home or
 | 
			
		||||
        # TODO: Shouldn't have to test for existence of bindir; tests need it.
 | 
			
		||||
        (@gem_home.to_s == Gem.dir and File.exist? Gem.bindir and 
 | 
			
		||||
         not File.writable? Gem.bindir)
 | 
			
		||||
      if options[:user_install] == false # You explicitly don't want to use ~
 | 
			
		||||
        (@gem_home.to_s == Gem.dir and File.exist? Gem.bindir and
 | 
			
		||||
         not File.writable? Gem.bindir) then
 | 
			
		||||
      if options[:user_install] == false then # You don't want to use ~
 | 
			
		||||
        raise Gem::FilePermissionError, @gem_home
 | 
			
		||||
      elsif options[:user_install].nil?
 | 
			
		||||
        say "Warning: falling back to user-level install since #{@gem_home} and #{@bin_dir} aren't both writable."
 | 
			
		||||
      elsif options[:user_install].nil? then
 | 
			
		||||
        unless self.class.home_install_warning then
 | 
			
		||||
          alert_warning "Installing to ~/.gem since #{@gem_home} and\n\t  #{Gem.bindir} aren't both writable."
 | 
			
		||||
          self.class.home_install_warning = true
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      options[:user_install] = true
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if options[:user_install]
 | 
			
		||||
      @gem_home = File.join(ENV['HOME'], '.gem')
 | 
			
		||||
    if options[:user_install] then
 | 
			
		||||
      @gem_home = Gem.user_dir
 | 
			
		||||
 | 
			
		||||
      user_bin_dir = File.join(@gem_home, 'gems', 'bin')
 | 
			
		||||
      if !ENV['PATH'].split(':').include?(user_bin_dir)
 | 
			
		||||
        say "You don't have #{user_bin_dir} in your PATH."
 | 
			
		||||
        say "You won't be able to run gem-installed executables until you add it."
 | 
			
		||||
      user_bin_dir = File.join(@gem_home, 'bin')
 | 
			
		||||
      unless ENV['PATH'].split(File::PATH_SEPARATOR).include? user_bin_dir then
 | 
			
		||||
        unless self.class.path_warning then
 | 
			
		||||
          alert_warning "You don't have #{user_bin_dir} in your PATH,\n\t  gem executables will not run."
 | 
			
		||||
          self.class.path_warning = true
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
      Dir.mkdir @gem_home if ! File.directory? @gem_home
 | 
			
		||||
 | 
			
		||||
      FileUtils.mkdir_p @gem_home unless File.directory? @gem_home
 | 
			
		||||
      # If it's still not writable, you've got issues.
 | 
			
		||||
      raise Gem::FilePermissionError, @gem_home if ! File.writable? @gem_home
 | 
			
		||||
      raise Gem::FilePermissionError, @gem_home unless File.writable? @gem_home
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @spec = @format.spec
 | 
			
		||||
| 
						 | 
				
			
			@ -157,6 +199,10 @@ class Gem::Installer
 | 
			
		|||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    Gem.pre_install_hooks.each do |hook|
 | 
			
		||||
      hook.call self
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    FileUtils.mkdir_p @gem_home unless File.directory? @gem_home
 | 
			
		||||
 | 
			
		||||
    Gem.ensure_gem_subdirectories @gem_home
 | 
			
		||||
| 
						 | 
				
			
			@ -181,7 +227,11 @@ class Gem::Installer
 | 
			
		|||
    @spec.loaded_from = File.join(@gem_home, 'specifications',
 | 
			
		||||
                                  "#{@spec.full_name}.gemspec")
 | 
			
		||||
 | 
			
		||||
    Gem.source_index.add_spec @spec
 | 
			
		||||
    @source_index.add_spec @spec
 | 
			
		||||
 | 
			
		||||
    Gem.post_install_hooks.each do |hook|
 | 
			
		||||
      hook.call self
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    return @spec
 | 
			
		||||
  rescue Zlib::GzipFile::Error
 | 
			
		||||
| 
						 | 
				
			
			@ -204,10 +254,10 @@ class Gem::Installer
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # True if the gems in Gem.source_index satisfy +dependency+.
 | 
			
		||||
  # True if the gems in the source_index satisfy +dependency+.
 | 
			
		||||
 | 
			
		||||
  def installation_satisfies_dependency?(dependency)
 | 
			
		||||
    Gem.source_index.find_name(dependency.name, dependency.version_requirements).size > 0
 | 
			
		||||
    @source_index.find_name(dependency.name, dependency.version_requirements).size > 0
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -109,6 +109,13 @@ module Gem::LocalRemoteOptions
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Is fetching of local and remote information enabled?
 | 
			
		||||
 | 
			
		||||
  def both?
 | 
			
		||||
    options[:domain] == :both
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Is local fetching enabled?
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -46,17 +46,17 @@ class Gem::Package::TarReader
 | 
			
		|||
      yield entry
 | 
			
		||||
 | 
			
		||||
      skip = (512 - (size % 512)) % 512
 | 
			
		||||
      pending = size - entry.bytes_read
 | 
			
		||||
 | 
			
		||||
      if @io.respond_to? :seek then
 | 
			
		||||
      begin
 | 
			
		||||
        # avoid reading...
 | 
			
		||||
        @io.seek(size - entry.bytes_read, IO::SEEK_CUR)
 | 
			
		||||
      else
 | 
			
		||||
        pending = size - entry.bytes_read
 | 
			
		||||
 | 
			
		||||
        @io.seek pending, IO::SEEK_CUR
 | 
			
		||||
        pending = 0
 | 
			
		||||
      rescue Errno::EINVAL, NameError
 | 
			
		||||
        while pending > 0 do
 | 
			
		||||
          bread = @io.read([pending, 4096].min).size
 | 
			
		||||
          bytes_read = @io.read([pending, 4096].min).size
 | 
			
		||||
          raise UnexpectedEOF if @io.eof?
 | 
			
		||||
          pending -= bread
 | 
			
		||||
          pending -= bytes_read
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,23 +13,6 @@ class Gem::Platform
 | 
			
		|||
 | 
			
		||||
  attr_accessor :version
 | 
			
		||||
 | 
			
		||||
  DEPRECATED_CONSTS = [
 | 
			
		||||
    :DARWIN,
 | 
			
		||||
    :LINUX_586,
 | 
			
		||||
    :MSWIN32,
 | 
			
		||||
    :PPC_DARWIN,
 | 
			
		||||
    :WIN32,
 | 
			
		||||
    :X86_LINUX
 | 
			
		||||
  ]
 | 
			
		||||
 | 
			
		||||
  def self.const_missing(name) # TODO remove six months from 2007/12
 | 
			
		||||
    if DEPRECATED_CONSTS.include? name then
 | 
			
		||||
      raise NameError, "#{name} has been removed, use CURRENT instead"
 | 
			
		||||
    else
 | 
			
		||||
      super
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def self.local
 | 
			
		||||
    arch = Gem::ConfigMap[:arch]
 | 
			
		||||
    arch = "#{arch}_60" if arch =~ /mswin32$/
 | 
			
		||||
| 
						 | 
				
			
			@ -73,7 +56,7 @@ class Gem::Platform
 | 
			
		|||
             else cpu
 | 
			
		||||
             end
 | 
			
		||||
 | 
			
		||||
      if arch.length == 2 and arch.last =~ /^\d+$/ then # for command-line
 | 
			
		||||
      if arch.length == 2 and arch.last =~ /^\d+(\.\d+)?$/ then # for command-line
 | 
			
		||||
        @os, @version = arch
 | 
			
		||||
        return
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -78,7 +78,7 @@ class Gem::RemoteFetcher
 | 
			
		|||
    if File.writable?(install_dir)
 | 
			
		||||
      cache_dir = File.join install_dir, 'cache'
 | 
			
		||||
    else
 | 
			
		||||
      cache_dir = File.join(ENV['HOME'], '.gem', 'cache')
 | 
			
		||||
      cache_dir = File.join(Gem.user_dir, 'cache')
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    gem_file_name = "#{spec.full_name}.gem"
 | 
			
		||||
| 
						 | 
				
			
			@ -93,7 +93,7 @@ class Gem::RemoteFetcher
 | 
			
		|||
    scheme = nil if scheme =~ /^[a-z]$/i
 | 
			
		||||
 | 
			
		||||
    case scheme
 | 
			
		||||
    when 'http' then
 | 
			
		||||
    when 'http', 'https' then
 | 
			
		||||
      unless File.exist? local_gem_path then
 | 
			
		||||
        begin
 | 
			
		||||
          say "Downloading gem #{gem_file_name}" if
 | 
			
		||||
| 
						 | 
				
			
			@ -139,8 +139,8 @@ class Gem::RemoteFetcher
 | 
			
		|||
  # Downloads +uri+ and returns it as a String.
 | 
			
		||||
 | 
			
		||||
  def fetch_path(uri, mtime = nil, head = false)
 | 
			
		||||
    data = open_uri_or_path(uri, mtime, head)
 | 
			
		||||
    data = Gem.gunzip data if uri.to_s =~ /gz$/ and not head
 | 
			
		||||
    data = open_uri_or_path uri, mtime, head
 | 
			
		||||
    data = Gem.gunzip data if data and not head and uri.to_s =~ /gz$/
 | 
			
		||||
    data
 | 
			
		||||
  rescue FetchError
 | 
			
		||||
    raise
 | 
			
		||||
| 
						 | 
				
			
			@ -216,8 +216,9 @@ class Gem::RemoteFetcher
 | 
			
		|||
    connection = @connections[connection_id]
 | 
			
		||||
 | 
			
		||||
    if uri.scheme == 'https' and not connection.started? then
 | 
			
		||||
      http_obj.use_ssl = true
 | 
			
		||||
      http_obj.verify_mode = OpenSSL::SSL::VERIFY_NONE
 | 
			
		||||
      require 'net/https'
 | 
			
		||||
      connection.use_ssl = true
 | 
			
		||||
      connection.verify_mode = OpenSSL::SSL::VERIFY_NONE
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    connection.start unless connection.started?
 | 
			
		||||
| 
						 | 
				
			
			@ -241,9 +242,10 @@ class Gem::RemoteFetcher
 | 
			
		|||
    response   = request uri, fetch_type, last_modified
 | 
			
		||||
 | 
			
		||||
    case response
 | 
			
		||||
    when Net::HTTPOK then
 | 
			
		||||
    when Net::HTTPOK, Net::HTTPNotModified then
 | 
			
		||||
      head ? response : response.body
 | 
			
		||||
    when Net::HTTPRedirection then
 | 
			
		||||
    when Net::HTTPMovedPermanently, Net::HTTPFound, Net::HTTPSeeOther,
 | 
			
		||||
         Net::HTTPTemporaryRedirect then
 | 
			
		||||
      raise FetchError.new('too many redirects', uri) if depth > 10
 | 
			
		||||
 | 
			
		||||
      open_uri_or_path(response['Location'], last_modified, head, depth + 1)
 | 
			
		||||
| 
						 | 
				
			
			@ -274,6 +276,7 @@ class Gem::RemoteFetcher
 | 
			
		|||
    request.add_field 'Keep-Alive', '30'
 | 
			
		||||
 | 
			
		||||
    if last_modified then
 | 
			
		||||
      last_modified = last_modified.utc
 | 
			
		||||
      request.add_field 'If-Modified-Since', last_modified.rfc2822
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -282,9 +285,6 @@ class Gem::RemoteFetcher
 | 
			
		|||
    retried = false
 | 
			
		||||
    bad_response = false
 | 
			
		||||
 | 
			
		||||
    # HACK work around EOFError bug in Net::HTTP
 | 
			
		||||
    # NOTE Errno::ECONNABORTED raised a lot on Windows, and make impossible
 | 
			
		||||
    # to install gems.
 | 
			
		||||
    begin
 | 
			
		||||
      @requests[connection.object_id] += 1
 | 
			
		||||
      response = connection.request request
 | 
			
		||||
| 
						 | 
				
			
			@ -297,6 +297,9 @@ class Gem::RemoteFetcher
 | 
			
		|||
 | 
			
		||||
      bad_response = true
 | 
			
		||||
      retry
 | 
			
		||||
    # HACK work around EOFError bug in Net::HTTP
 | 
			
		||||
    # NOTE Errno::ECONNABORTED raised a lot on Windows, and make impossible
 | 
			
		||||
    # to install gems.
 | 
			
		||||
    rescue EOFError, Errno::ECONNABORTED, Errno::ECONNRESET
 | 
			
		||||
      requests = @requests[connection.object_id]
 | 
			
		||||
      say "connection reset after #{requests} requests, retrying" if
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,5 +2,5 @@
 | 
			
		|||
# This file is auto-generated by build scripts.
 | 
			
		||||
# See:  rake update_version
 | 
			
		||||
module Gem
 | 
			
		||||
  RubyGemsVersion = '1.2.0.1824'
 | 
			
		||||
  RubyGemsVersion = '1.3.0'
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,9 @@
 | 
			
		|||
require 'rubygems'
 | 
			
		||||
require 'rubygems/user_interaction'
 | 
			
		||||
require 'rubygems/specification'
 | 
			
		||||
require 'rubygems/spec_fetcher'
 | 
			
		||||
module Gem
 | 
			
		||||
  autoload(:SpecFetcher, 'rubygems/spec_fetcher')
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
##
 | 
			
		||||
# The SourceIndex object indexes all the gems available from a
 | 
			
		||||
| 
						 | 
				
			
			@ -80,8 +82,14 @@ class Gem::SourceIndex
 | 
			
		|||
 | 
			
		||||
    def load_specification(file_name)
 | 
			
		||||
      begin
 | 
			
		||||
        spec_code = File.read(file_name).untaint
 | 
			
		||||
        spec_code = if RUBY_VERSION < '1.9' then
 | 
			
		||||
                      File.read file_name
 | 
			
		||||
                    else
 | 
			
		||||
                      File.read file_name, :encoding => 'UTF-8'
 | 
			
		||||
                    end.untaint
 | 
			
		||||
 | 
			
		||||
        gemspec = eval spec_code, binding, file_name
 | 
			
		||||
 | 
			
		||||
        if gemspec.is_a?(Gem::Specification)
 | 
			
		||||
          gemspec.loaded_from = file_name
 | 
			
		||||
          return gemspec
 | 
			
		||||
| 
						 | 
				
			
			@ -93,7 +101,7 @@ class Gem::SourceIndex
 | 
			
		|||
        alert_warning e
 | 
			
		||||
        alert_warning spec_code
 | 
			
		||||
      rescue Exception => e
 | 
			
		||||
        alert_warning(e.inspect.to_s + "\n" + spec_code)
 | 
			
		||||
        alert_warning "#{e.inspect}\n#{spec_code}"
 | 
			
		||||
        alert_warning "Invalid .gemspec format in '#{file_name}'"
 | 
			
		||||
      end
 | 
			
		||||
      return nil
 | 
			
		||||
| 
						 | 
				
			
			@ -230,7 +238,8 @@ class Gem::SourceIndex
 | 
			
		|||
  # Find a gem by an exact match on the short name.
 | 
			
		||||
 | 
			
		||||
  def find_name(gem_name, version_requirement = Gem::Requirement.default)
 | 
			
		||||
    search(/^#{gem_name}$/, version_requirement)
 | 
			
		||||
    dep = Gem::Dependency.new(/^#{gem_name}$/, version_requirement)
 | 
			
		||||
    search dep
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
| 
						 | 
				
			
			@ -246,7 +255,13 @@ class Gem::SourceIndex
 | 
			
		|||
    version_requirement = nil
 | 
			
		||||
    only_platform = false
 | 
			
		||||
 | 
			
		||||
    case gem_pattern # TODO warn after 2008/03, remove three months after
 | 
			
		||||
    # TODO - Remove support and warning for legacy arguments after 2008/11
 | 
			
		||||
    unless Gem::Dependency === gem_pattern
 | 
			
		||||
      warn "Gem::SourceIndex#search support for #{gem_pattern.class} patterns is deprecated"
 | 
			
		||||
      warn "#{caller[0]} is outdated" 
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    case gem_pattern
 | 
			
		||||
    when Regexp then
 | 
			
		||||
      version_requirement = platform_only || Gem::Requirement.default
 | 
			
		||||
    when Gem::Dependency then
 | 
			
		||||
| 
						 | 
				
			
			@ -270,7 +285,7 @@ class Gem::SourceIndex
 | 
			
		|||
 | 
			
		||||
    specs = @gems.values.select do |spec|
 | 
			
		||||
      spec.name =~ gem_pattern and
 | 
			
		||||
      version_requirement.satisfied_by? spec.version
 | 
			
		||||
        version_requirement.satisfied_by? spec.version
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    if only_platform then
 | 
			
		||||
| 
						 | 
				
			
			@ -539,7 +554,7 @@ module Gem
 | 
			
		|||
  # objects to load properly.
 | 
			
		||||
  Cache = SourceIndex
 | 
			
		||||
 | 
			
		||||
  # :starddoc:
 | 
			
		||||
  # :startdoc:
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -284,6 +284,10 @@ class Gem::SourceInfoCache
 | 
			
		|||
 | 
			
		||||
    cache_data.map do |source_uri, sic_entry|
 | 
			
		||||
      next unless Gem.sources.include? source_uri
 | 
			
		||||
      # TODO - Remove this gunk after 2008/11
 | 
			
		||||
      unless pattern.kind_of?(Gem::Dependency)
 | 
			
		||||
        pattern = Gem::Dependency.new(pattern, Gem::Requirement.default) 
 | 
			
		||||
      end
 | 
			
		||||
      sic_entry.source_index.search pattern, platform_only
 | 
			
		||||
    end.flatten.compact
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			@ -300,6 +304,11 @@ class Gem::SourceInfoCache
 | 
			
		|||
    cache_data.map do |source_uri, sic_entry|
 | 
			
		||||
      next unless Gem.sources.include? source_uri
 | 
			
		||||
 | 
			
		||||
      # TODO - Remove this gunk after 2008/11
 | 
			
		||||
      unless pattern.kind_of?(Gem::Dependency)
 | 
			
		||||
        pattern = Gem::Dependency.new(pattern, Gem::Requirement.default) 
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      sic_entry.source_index.search(pattern, only_platform).each do |spec|
 | 
			
		||||
        results << [spec, source_uri]
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -167,7 +167,7 @@ class Gem::SpecFetcher
 | 
			
		|||
 | 
			
		||||
      if all and @specs.include? source_uri then
 | 
			
		||||
        list[source_uri] = @specs[source_uri]
 | 
			
		||||
      elsif @latest_specs.include? source_uri then
 | 
			
		||||
      elsif not all and @latest_specs.include? source_uri then
 | 
			
		||||
        list[source_uri] = @latest_specs[source_uri]
 | 
			
		||||
      else
 | 
			
		||||
        specs = load_specs source_uri, file
 | 
			
		||||
| 
						 | 
				
			
			@ -182,6 +182,10 @@ class Gem::SpecFetcher
 | 
			
		|||
    list
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Loads specs in +file+, fetching from +source_uri+ if the on-disk cache is
 | 
			
		||||
  # out of date.
 | 
			
		||||
 | 
			
		||||
  def load_specs(source_uri, file)
 | 
			
		||||
    file_name  = "#{file}.#{Gem.marshal_version}"
 | 
			
		||||
    spec_path  = source_uri + "#{file_name}.gz"
 | 
			
		||||
| 
						 | 
				
			
			@ -192,7 +196,7 @@ class Gem::SpecFetcher
 | 
			
		|||
    if File.exist? local_file then
 | 
			
		||||
      spec_dump = @fetcher.fetch_path spec_path, File.mtime(local_file)
 | 
			
		||||
 | 
			
		||||
      if spec_dump.empty? then
 | 
			
		||||
      if spec_dump.nil? then
 | 
			
		||||
        spec_dump = Gem.read_binary local_file
 | 
			
		||||
      else
 | 
			
		||||
        loaded = true
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
				
			
			@ -34,16 +34,20 @@ class Gem::FakeFetcher
 | 
			
		|||
    path = path.to_s
 | 
			
		||||
    @paths << path
 | 
			
		||||
    raise ArgumentError, 'need full URI' unless path =~ %r'^http://'
 | 
			
		||||
    data = @data[path]
 | 
			
		||||
 | 
			
		||||
    if data.nil? then
 | 
			
		||||
      raise Gem::RemoteFetcher::FetchError.new('no data', path)
 | 
			
		||||
    unless @data.key? path then
 | 
			
		||||
      raise Gem::RemoteFetcher::FetchError.new("no data for #{path}", path)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    data = @data[path]
 | 
			
		||||
 | 
			
		||||
    if data.respond_to?(:call) then
 | 
			
		||||
      data.call
 | 
			
		||||
    else
 | 
			
		||||
      data = Gem.gunzip data if path.to_s =~ /gz$/ unless data.empty?
 | 
			
		||||
      if path.to_s =~ /gz$/ and not data.nil? and not data.empty? then
 | 
			
		||||
        data = Gem.gunzip data
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      data
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			@ -51,13 +55,15 @@ class Gem::FakeFetcher
 | 
			
		|||
  def fetch_size(path)
 | 
			
		||||
    path = path.to_s
 | 
			
		||||
    @paths << path
 | 
			
		||||
    raise ArgumentError, 'need full URI' unless path =~ %r'^http://'
 | 
			
		||||
    data = @data[path]
 | 
			
		||||
 | 
			
		||||
    if data.nil? then
 | 
			
		||||
      raise Gem::RemoteFetcher::FetchError.new("no data for #{path}", nil)
 | 
			
		||||
    raise ArgumentError, 'need full URI' unless path =~ %r'^http://'
 | 
			
		||||
 | 
			
		||||
    unless @data.key? path then
 | 
			
		||||
      raise Gem::RemoteFetcher::FetchError.new("no data for #{path}", path)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    data = @data[path]
 | 
			
		||||
 | 
			
		||||
    data.respond_to?(:call) ? data.call : data.length
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,9 +18,23 @@ class Gem::Uninstaller
 | 
			
		|||
  include Gem::UserInteraction
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Constructs an Uninstaller instance
 | 
			
		||||
  #
 | 
			
		||||
  # gem:: [String] The Gem name to uninstall
 | 
			
		||||
  # The directory a gem's executables will be installed into
 | 
			
		||||
 | 
			
		||||
  attr_reader :bin_dir
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # The gem repository the gem will be installed into
 | 
			
		||||
 | 
			
		||||
  attr_reader :gem_home
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # The Gem::Specification for the gem being uninstalled, only set during
 | 
			
		||||
  # #uninstall_gem
 | 
			
		||||
 | 
			
		||||
  attr_reader :spec
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Constructs an uninstaller that will uninstall +gem+
 | 
			
		||||
 | 
			
		||||
  def initialize(gem, options = {})
 | 
			
		||||
    @gem = gem
 | 
			
		||||
| 
						 | 
				
			
			@ -31,41 +45,62 @@ class Gem::Uninstaller
 | 
			
		|||
    @force_all = options[:all]
 | 
			
		||||
    @force_ignore = options[:ignore]
 | 
			
		||||
    @bin_dir = options[:bin_dir]
 | 
			
		||||
 | 
			
		||||
    spec_dir = File.join @gem_home, 'specifications'
 | 
			
		||||
    @source_index = Gem::SourceIndex.from_gems_in spec_dir
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Performs the uninstall of the Gem.  This removes the spec, the
 | 
			
		||||
  # Gem directory, and the cached .gem file,
 | 
			
		||||
  # Performs the uninstall of the gem.  This removes the spec, the Gem
 | 
			
		||||
  # directory, and the cached .gem file.
 | 
			
		||||
 | 
			
		||||
  def uninstall
 | 
			
		||||
    list = Gem.source_index.search(/^#{@gem}$/, @version)
 | 
			
		||||
    list = @source_index.find_name @gem, @version
 | 
			
		||||
 | 
			
		||||
    if list.empty? then
 | 
			
		||||
      raise Gem::InstallError, "Unknown gem #{@gem} #{@version}"
 | 
			
		||||
    elsif list.size > 1 && @force_all
 | 
			
		||||
      remove_all(list.dup)
 | 
			
		||||
      remove_executables(list.last)
 | 
			
		||||
    elsif list.size > 1
 | 
			
		||||
      say
 | 
			
		||||
 | 
			
		||||
    elsif list.size > 1 and @force_all then
 | 
			
		||||
      remove_all list.dup
 | 
			
		||||
 | 
			
		||||
    elsif list.size > 1 then
 | 
			
		||||
      gem_names = list.collect {|gem| gem.full_name} + ["All versions"]
 | 
			
		||||
      gem_name, index =
 | 
			
		||||
        choose_from_list("Select gem to uninstall:", gem_names)
 | 
			
		||||
      if index == list.size
 | 
			
		||||
        remove_all(list.dup)
 | 
			
		||||
        remove_executables(list.last)
 | 
			
		||||
      elsif index >= 0 && index < list.size
 | 
			
		||||
        to_remove = list[index]
 | 
			
		||||
        remove(to_remove, list)
 | 
			
		||||
        remove_executables(to_remove)
 | 
			
		||||
 | 
			
		||||
      say
 | 
			
		||||
      gem_name, index = choose_from_list "Select gem to uninstall:", gem_names
 | 
			
		||||
 | 
			
		||||
      if index == list.size then
 | 
			
		||||
        remove_all list.dup
 | 
			
		||||
      elsif index >= 0 && index < list.size then
 | 
			
		||||
        uninstall_gem list[index], list.dup
 | 
			
		||||
      else
 | 
			
		||||
        say "Error: must enter a number [1-#{list.size+1}]"
 | 
			
		||||
      end
 | 
			
		||||
    else
 | 
			
		||||
      remove(list[0], list.dup)
 | 
			
		||||
      remove_executables(list.last)
 | 
			
		||||
      uninstall_gem list.first, list.dup
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Uninstalls gem +spec+
 | 
			
		||||
 | 
			
		||||
  def uninstall_gem(spec, specs)
 | 
			
		||||
    @spec = spec
 | 
			
		||||
 | 
			
		||||
    Gem.pre_uninstall_hooks.each do |hook|
 | 
			
		||||
      hook.call self
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    specs.each { |s| remove_executables s }
 | 
			
		||||
    remove spec, specs
 | 
			
		||||
 | 
			
		||||
    Gem.post_uninstall_hooks.each do |hook|
 | 
			
		||||
      hook.call self
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @spec = nil
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
  # Removes installed executables and batch files (windows only) for
 | 
			
		||||
  # +gemspec+.
 | 
			
		||||
| 
						 | 
				
			
			@ -76,7 +111,7 @@ class Gem::Uninstaller
 | 
			
		|||
    if gemspec.executables.size > 0 then
 | 
			
		||||
      bindir = @bin_dir ? @bin_dir : (Gem.bindir @gem_home)
 | 
			
		||||
 | 
			
		||||
      list = Gem.source_index.search(gemspec.name).delete_if { |spec|
 | 
			
		||||
      list = @source_index.find_name(gemspec.name).delete_if { |spec|
 | 
			
		||||
        spec.version == gemspec.version
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -118,7 +153,7 @@ class Gem::Uninstaller
 | 
			
		|||
  # NOTE: removes uninstalled gems from +list+.
 | 
			
		||||
 | 
			
		||||
  def remove_all(list)
 | 
			
		||||
    list.dup.each { |spec| remove spec, list }
 | 
			
		||||
    list.dup.each { |spec| uninstall_gem spec, list }
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  ##
 | 
			
		||||
| 
						 | 
				
			
			@ -185,8 +220,7 @@ class Gem::Uninstaller
 | 
			
		|||
  def dependencies_ok?(spec)
 | 
			
		||||
    return true if @force_ignore
 | 
			
		||||
 | 
			
		||||
    source_index = Gem::SourceIndex.from_installed_gems
 | 
			
		||||
    deplist = Gem::DependencyList.from_source_index source_index
 | 
			
		||||
    deplist = Gem::DependencyList.from_source_index @source_index
 | 
			
		||||
    deplist.ok_to_remove?(spec.full_name) || ask_if_ok(spec)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,10 @@ require 'rubygems/test_utilities'
 | 
			
		|||
require File.join(File.expand_path(File.dirname(__FILE__)), 'mockgemui')
 | 
			
		||||
 | 
			
		||||
module Gem
 | 
			
		||||
  def self.searcher=(searcher)
 | 
			
		||||
    MUTEX.synchronize do @searcher = searcher end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def self.source_index=(si)
 | 
			
		||||
    @@source_index = si
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			@ -26,7 +30,7 @@ module Gem
 | 
			
		|||
  def self.win_platform=(val)
 | 
			
		||||
    @@win_platform = val
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  module DefaultUserInteraction
 | 
			
		||||
    @ui = MockGemUi.new
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			@ -89,6 +93,27 @@ class RubyGemTestCase < Test::Unit::TestCase
 | 
			
		|||
                                              'private_key.pem')
 | 
			
		||||
    @public_cert = File.expand_path File.join(File.dirname(__FILE__),
 | 
			
		||||
                                              'public_cert.pem')
 | 
			
		||||
 | 
			
		||||
    Gem.post_install_hooks.clear
 | 
			
		||||
    Gem.post_uninstall_hooks.clear
 | 
			
		||||
    Gem.pre_install_hooks.clear
 | 
			
		||||
    Gem.pre_uninstall_hooks.clear
 | 
			
		||||
 | 
			
		||||
    Gem.post_install do |installer|
 | 
			
		||||
      @post_install_hook_arg = installer
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    Gem.post_uninstall do |uninstaller|
 | 
			
		||||
      @post_uninstall_hook_arg = uninstaller
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    Gem.pre_install do |installer|
 | 
			
		||||
      @pre_install_hook_arg = installer
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    Gem.pre_uninstall do |uninstaller|
 | 
			
		||||
      @pre_uninstall_hook_arg = uninstaller
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def teardown
 | 
			
		||||
| 
						 | 
				
			
			@ -435,7 +460,15 @@ class RubyGemTestCase < Test::Unit::TestCase
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  @@ruby = rubybin
 | 
			
		||||
  @@rake = ENV["rake"] || (@@ruby + " " + File.expand_path("../../../bin/rake", __FILE__))
 | 
			
		||||
  env_rake = ENV['rake']
 | 
			
		||||
  ruby19_rake = @@ruby + " " + File.expand_path("../../../bin/rake", __FILE__)
 | 
			
		||||
  @@rake = if env_rake then
 | 
			
		||||
             ENV["rake"]
 | 
			
		||||
           elsif File.exist? ruby19_rake then
 | 
			
		||||
             ruby19_rake
 | 
			
		||||
           else
 | 
			
		||||
             'rake'
 | 
			
		||||
           end
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,8 +12,28 @@ require 'rubygems/user_interaction'
 | 
			
		|||
class MockGemUi < Gem::StreamUI
 | 
			
		||||
  class TermError < RuntimeError; end
 | 
			
		||||
 | 
			
		||||
  def initialize(input="")
 | 
			
		||||
    super(StringIO.new(input), StringIO.new, StringIO.new)
 | 
			
		||||
  module TTY
 | 
			
		||||
 | 
			
		||||
    attr_accessor :tty
 | 
			
		||||
 | 
			
		||||
    def tty?()
 | 
			
		||||
      @tty = true unless defined?(@tty)
 | 
			
		||||
      @tty
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def initialize(input = "")
 | 
			
		||||
    ins = StringIO.new input
 | 
			
		||||
    outs = StringIO.new
 | 
			
		||||
    errs = StringIO.new
 | 
			
		||||
 | 
			
		||||
    ins.extend TTY
 | 
			
		||||
    outs.extend TTY
 | 
			
		||||
    errs.extend TTY
 | 
			
		||||
 | 
			
		||||
    super ins, outs, errs
 | 
			
		||||
 | 
			
		||||
    @terminated = false
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -45,7 +45,12 @@ class TestGem < RubyGemTestCase
 | 
			
		|||
 | 
			
		||||
  def test_self_bindir_default_dir
 | 
			
		||||
    default = Gem.default_dir
 | 
			
		||||
    bindir = (defined? RUBY_FRAMEWORK_VERSION) ? '/usr/bin' : Config::CONFIG['bindir']    
 | 
			
		||||
    bindir = if defined?(RUBY_FRAMEWORK_VERSION) then
 | 
			
		||||
               '/usr/bin'
 | 
			
		||||
             else
 | 
			
		||||
               Config::CONFIG['bindir']
 | 
			
		||||
             end
 | 
			
		||||
 | 
			
		||||
    assert_equal bindir, Gem.bindir(default)
 | 
			
		||||
    assert_equal bindir, Gem.bindir(Pathname.new(default))
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			@ -218,6 +223,36 @@ class TestGem < RubyGemTestCase
 | 
			
		|||
    Gem.ssl_available = orig_Gem_ssl_available
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_self_find_files
 | 
			
		||||
    foo1 = quick_gem 'foo', '1' do |s|
 | 
			
		||||
      s.files << 'lib/foo/discover.rb'
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    foo2 = quick_gem 'foo', '2' do |s|
 | 
			
		||||
      s.files << 'lib/foo/discover.rb'
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    path = File.join 'gems', foo1.full_name, 'lib', 'foo', 'discover.rb'
 | 
			
		||||
    write_file(path) { |fp| fp.puts "# #{path}" }
 | 
			
		||||
 | 
			
		||||
    path = File.join 'gems', foo2.full_name, 'lib', 'foo', 'discover.rb'
 | 
			
		||||
    write_file(path) { |fp| fp.puts "# #{path}" }
 | 
			
		||||
 | 
			
		||||
    @fetcher = Gem::FakeFetcher.new
 | 
			
		||||
    Gem::RemoteFetcher.fetcher = @fetcher
 | 
			
		||||
 | 
			
		||||
    Gem.source_index = util_setup_spec_fetcher foo1, foo2
 | 
			
		||||
 | 
			
		||||
    Gem.searcher = nil
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      File.join(foo1.full_gem_path, 'lib', 'foo', 'discover.rb'),
 | 
			
		||||
      File.join(foo2.full_gem_path, 'lib', 'foo', 'discover.rb'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, Gem.find_files('foo/discover').sort
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_self_latest_load_paths
 | 
			
		||||
    util_make_gems
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -261,20 +296,21 @@ class TestGem < RubyGemTestCase
 | 
			
		|||
  unless win_platform?
 | 
			
		||||
    def test_self_path_APPLE_GEM_HOME
 | 
			
		||||
      Gem.clear_paths
 | 
			
		||||
      Dir.mktmpdir("apple_gem_home") {|d|
 | 
			
		||||
        Gem.const_set :APPLE_GEM_HOME, d
 | 
			
		||||
        assert Gem.path.include?(d)
 | 
			
		||||
      }
 | 
			
		||||
      apple_gem_home = File.join @tempdir, 'apple_gem_home'
 | 
			
		||||
      Gem.const_set :APPLE_GEM_HOME, apple_gem_home
 | 
			
		||||
 | 
			
		||||
      assert Gem.path.include?(apple_gem_home)
 | 
			
		||||
    ensure
 | 
			
		||||
      Gem.send :remove_const, :APPLE_GEM_HOME
 | 
			
		||||
    end
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
    def test_self_path_APPLE_GEM_HOME_GEM_PATH
 | 
			
		||||
      Gem.clear_paths
 | 
			
		||||
      ENV['GEM_PATH'] = @gemhome
 | 
			
		||||
      Gem.const_set :APPLE_GEM_HOME, '/tmp/apple_gem_home'
 | 
			
		||||
  
 | 
			
		||||
      assert !Gem.path.include?('/tmp/apple_gem_home')
 | 
			
		||||
      apple_gem_home = File.join @tempdir, 'apple_gem_home'
 | 
			
		||||
      Gem.const_set :APPLE_GEM_HOME, apple_gem_home
 | 
			
		||||
 | 
			
		||||
      assert !Gem.path.include?(apple_gem_home)
 | 
			
		||||
    ensure
 | 
			
		||||
      Gem.send :remove_const, :APPLE_GEM_HOME
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			@ -291,7 +327,7 @@ class TestGem < RubyGemTestCase
 | 
			
		|||
 | 
			
		||||
    assert_equal path_count + @additional.size, Gem.path.size,
 | 
			
		||||
                 "extra path components: #{Gem.path[2..-1].inspect}"
 | 
			
		||||
    assert_match Gem.dir, Gem.path.last
 | 
			
		||||
    assert_equal Gem.dir, Gem.path.last
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_self_path_duplicate
 | 
			
		||||
| 
						 | 
				
			
			@ -390,6 +426,44 @@ class TestGem < RubyGemTestCase
 | 
			
		|||
                 Gem.required_location("a", "code.rb", "= 2")
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_self_ruby_escaping_spaces_in_path
 | 
			
		||||
    orig_ruby = Gem.ruby
 | 
			
		||||
    orig_bindir = Gem::ConfigMap[:bindir]
 | 
			
		||||
    orig_ruby_install_name = Gem::ConfigMap[:ruby_install_name]
 | 
			
		||||
    orig_exe_ext = Gem::ConfigMap[:EXEEXT]
 | 
			
		||||
 | 
			
		||||
    Gem::ConfigMap[:bindir] = "C:/Ruby 1.8/bin"
 | 
			
		||||
    Gem::ConfigMap[:ruby_install_name] = "ruby"
 | 
			
		||||
    Gem::ConfigMap[:EXEEXT] = ".exe"
 | 
			
		||||
    Gem.instance_variable_set("@ruby", nil)
 | 
			
		||||
 | 
			
		||||
    assert_equal "\"C:/Ruby 1.8/bin/ruby.exe\"", Gem.ruby
 | 
			
		||||
  ensure
 | 
			
		||||
    Gem.instance_variable_set("@ruby", orig_ruby)
 | 
			
		||||
    Gem::ConfigMap[:bindir] = orig_bindir
 | 
			
		||||
    Gem::ConfigMap[:ruby_install_name] = orig_ruby_install_name
 | 
			
		||||
    Gem::ConfigMap[:EXEEXT] = orig_exe_ext
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_self_ruby_path_without_spaces
 | 
			
		||||
    orig_ruby = Gem.ruby
 | 
			
		||||
    orig_bindir = Gem::ConfigMap[:bindir]
 | 
			
		||||
    orig_ruby_install_name = Gem::ConfigMap[:ruby_install_name]
 | 
			
		||||
    orig_exe_ext = Gem::ConfigMap[:EXEEXT]
 | 
			
		||||
 | 
			
		||||
    Gem::ConfigMap[:bindir] = "C:/Ruby18/bin"
 | 
			
		||||
    Gem::ConfigMap[:ruby_install_name] = "ruby"
 | 
			
		||||
    Gem::ConfigMap[:EXEEXT] = ".exe"
 | 
			
		||||
    Gem.instance_variable_set("@ruby", nil)
 | 
			
		||||
 | 
			
		||||
    assert_equal "C:/Ruby18/bin/ruby.exe", Gem.ruby
 | 
			
		||||
  ensure
 | 
			
		||||
    Gem.instance_variable_set("@ruby", orig_ruby)
 | 
			
		||||
    Gem::ConfigMap[:bindir] = orig_bindir
 | 
			
		||||
    Gem::ConfigMap[:ruby_install_name] = orig_ruby_install_name
 | 
			
		||||
    Gem::ConfigMap[:EXEEXT] = orig_exe_ext
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_self_ruby_version
 | 
			
		||||
    version = RUBY_VERSION.dup
 | 
			
		||||
    version << ".#{RUBY_PATCHLEVEL}" if defined? RUBY_PATCHLEVEL
 | 
			
		||||
| 
						 | 
				
			
			@ -430,6 +504,11 @@ class TestGem < RubyGemTestCase
 | 
			
		|||
    assert_equal @additional + [Gem.dir], Gem.path
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_self_user_dir
 | 
			
		||||
    assert_equal File.join(@userhome, '.gem', Gem.ruby_engine,
 | 
			
		||||
                           Gem::ConfigMap[:ruby_version]), Gem.user_dir
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_self_user_home
 | 
			
		||||
    if ENV['HOME'] then
 | 
			
		||||
      assert_equal ENV['HOME'], Gem.user_home
 | 
			
		||||
| 
						 | 
				
			
			@ -438,6 +517,28 @@ class TestGem < RubyGemTestCase
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_self_user_home_user_drive_and_path
 | 
			
		||||
    Gem.clear_paths
 | 
			
		||||
 | 
			
		||||
    # safe-keep env variables
 | 
			
		||||
    orig_home, orig_user_profile = ENV['HOME'], ENV['USERPROFILE']
 | 
			
		||||
    orig_user_drive, orig_user_path = ENV['HOMEDRIVE'], ENV['HOMEPATH']
 | 
			
		||||
 | 
			
		||||
    # prepare the environment
 | 
			
		||||
    ENV.delete('HOME')
 | 
			
		||||
    ENV.delete('USERPROFILE')
 | 
			
		||||
    ENV['HOMEDRIVE'] = 'Z:'
 | 
			
		||||
    ENV['HOMEPATH'] = '\\Users\\RubyUser'
 | 
			
		||||
 | 
			
		||||
    assert_equal "Z:\\Users\\RubyUser", Gem.user_home
 | 
			
		||||
 | 
			
		||||
  ensure
 | 
			
		||||
    ENV['HOME'] = orig_home
 | 
			
		||||
    ENV['USERPROFILE'] = orig_user_profile
 | 
			
		||||
    ENV['USERDRIVE'] = orig_user_drive
 | 
			
		||||
    ENV['USERPATH'] = orig_user_path
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def util_ensure_gem_dirs
 | 
			
		||||
    Gem.ensure_gem_subdirectories @gemhome
 | 
			
		||||
    @additional.each do |dir|
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,7 +25,7 @@ class TestGemBuilder < RubyGemTestCase
 | 
			
		|||
  def test_build_validates
 | 
			
		||||
    builder = Gem::Builder.new Gem::Specification.new
 | 
			
		||||
 | 
			
		||||
    assert_raise Gem::InvalidSpecificationException do
 | 
			
		||||
    assert_raises Gem::InvalidSpecificationException do
 | 
			
		||||
      builder.build
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,7 +31,7 @@ class TestGemCommandManager < RubyGemTestCase
 | 
			
		|||
  def test_run_interrupt
 | 
			
		||||
    use_ui @ui do
 | 
			
		||||
      @command_manager.register_command :interrupt
 | 
			
		||||
      assert_raise MockGemUi::TermError do
 | 
			
		||||
      assert_raises MockGemUi::TermError do
 | 
			
		||||
        @command_manager.run 'interrupt'
 | 
			
		||||
      end
 | 
			
		||||
      assert_equal '', ui.output
 | 
			
		||||
| 
						 | 
				
			
			@ -41,7 +41,7 @@ class TestGemCommandManager < RubyGemTestCase
 | 
			
		|||
 | 
			
		||||
  def test_process_args_bad_arg
 | 
			
		||||
    use_ui @ui do
 | 
			
		||||
      assert_raise(MockGemUi::TermError) {
 | 
			
		||||
      assert_raises(MockGemUi::TermError) {
 | 
			
		||||
        @command_manager.process_args("--bad-arg")
 | 
			
		||||
      }
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -199,7 +199,7 @@ ERROR:  Only reverse dependencies for local gems are supported.
 | 
			
		|||
    @fetcher.data["#{@gem_repo}Marshal.#{Gem.marshal_version}"] =
 | 
			
		||||
      si.dump
 | 
			
		||||
 | 
			
		||||
    @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"] = nil
 | 
			
		||||
    @fetcher.data.delete "#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"
 | 
			
		||||
 | 
			
		||||
    FileUtils.rm File.join(@gemhome, 'specifications',
 | 
			
		||||
                           "#{foo.full_name}.gemspec")
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -43,7 +43,7 @@ class TestGemCommandsInstallCommand < RubyGemTestCase
 | 
			
		|||
      orig_dir = Dir.pwd
 | 
			
		||||
      begin
 | 
			
		||||
        Dir.chdir @tempdir
 | 
			
		||||
        e = assert_raise Gem::SystemExitException do
 | 
			
		||||
        e = assert_raises Gem::SystemExitException do
 | 
			
		||||
          @cmd.execute
 | 
			
		||||
        end
 | 
			
		||||
        assert_equal 0, e.exit_code
 | 
			
		||||
| 
						 | 
				
			
			@ -65,7 +65,7 @@ class TestGemCommandsInstallCommand < RubyGemTestCase
 | 
			
		|||
    @cmd.options[:args] = %w[no_such_gem]
 | 
			
		||||
 | 
			
		||||
    use_ui @ui do
 | 
			
		||||
      e = assert_raise Gem::SystemExitException do
 | 
			
		||||
      e = assert_raises Gem::SystemExitException do
 | 
			
		||||
        @cmd.execute
 | 
			
		||||
      end
 | 
			
		||||
      assert_equal 2, e.exit_code
 | 
			
		||||
| 
						 | 
				
			
			@ -91,7 +91,7 @@ class TestGemCommandsInstallCommand < RubyGemTestCase
 | 
			
		|||
    @cmd.options[:args] = %w[nonexistent]
 | 
			
		||||
 | 
			
		||||
    use_ui @ui do
 | 
			
		||||
      e = assert_raise Gem::SystemExitException do
 | 
			
		||||
      e = assert_raises Gem::SystemExitException do
 | 
			
		||||
        @cmd.execute
 | 
			
		||||
      end
 | 
			
		||||
      assert_equal 2, e.exit_code
 | 
			
		||||
| 
						 | 
				
			
			@ -114,7 +114,7 @@ class TestGemCommandsInstallCommand < RubyGemTestCase
 | 
			
		|||
    @cmd.options[:args] = [@a2.name]
 | 
			
		||||
 | 
			
		||||
    use_ui @ui do
 | 
			
		||||
      e = assert_raise Gem::SystemExitException do
 | 
			
		||||
      e = assert_raises Gem::SystemExitException do
 | 
			
		||||
        @cmd.execute
 | 
			
		||||
      end
 | 
			
		||||
      assert_equal 0, e.exit_code
 | 
			
		||||
| 
						 | 
				
			
			@ -146,7 +146,7 @@ class TestGemCommandsInstallCommand < RubyGemTestCase
 | 
			
		|||
      orig_dir = Dir.pwd
 | 
			
		||||
      begin
 | 
			
		||||
        Dir.chdir @tempdir
 | 
			
		||||
        e = assert_raise Gem::SystemExitException do
 | 
			
		||||
        e = assert_raises Gem::SystemExitException do
 | 
			
		||||
          @cmd.execute
 | 
			
		||||
        end
 | 
			
		||||
        assert_equal 0, e.exit_code
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										37
									
								
								test/rubygems/test_gem_commands_list_command.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								test/rubygems/test_gem_commands_list_command.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,37 @@
 | 
			
		|||
require 'test/unit'
 | 
			
		||||
require File.join(File.expand_path(File.dirname(__FILE__)), 'gemutilities')
 | 
			
		||||
require 'rubygems/commands/list_command'
 | 
			
		||||
 | 
			
		||||
class TestGemCommandsListCommand < RubyGemTestCase
 | 
			
		||||
 | 
			
		||||
  def setup
 | 
			
		||||
    super
 | 
			
		||||
 | 
			
		||||
    @cmd = Gem::Commands::ListCommand.new
 | 
			
		||||
 | 
			
		||||
    util_setup_fake_fetcher
 | 
			
		||||
 | 
			
		||||
    @si = util_setup_spec_fetcher @a1, @a2, @pl1
 | 
			
		||||
 | 
			
		||||
    @fetcher.data["#{@gem_repo}Marshal.#{Gem.marshal_version}"] = proc do
 | 
			
		||||
      raise Gem::RemoteFetcher::FetchError
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_execute_installed
 | 
			
		||||
    @cmd.handle_options %w[c --installed]
 | 
			
		||||
 | 
			
		||||
    e = assert_raise Gem::SystemExitException do
 | 
			
		||||
      use_ui @ui do
 | 
			
		||||
        @cmd.execute
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert_equal 0, e.exit_code
 | 
			
		||||
 | 
			
		||||
    assert_equal "true\n", @ui.output
 | 
			
		||||
 | 
			
		||||
    assert_equal '', @ui.error
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
							
								
								
									
										69
									
								
								test/rubygems/test_gem_commands_lock_command.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								test/rubygems/test_gem_commands_lock_command.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,69 @@
 | 
			
		|||
require 'test/unit'
 | 
			
		||||
require File.join(File.expand_path(File.dirname(__FILE__)), 'gemutilities')
 | 
			
		||||
require 'rubygems/commands/lock_command'
 | 
			
		||||
 | 
			
		||||
class TestGemCommandsLockCommand < RubyGemTestCase
 | 
			
		||||
 | 
			
		||||
  def setup
 | 
			
		||||
    super
 | 
			
		||||
 | 
			
		||||
    @a1 = quick_gem 'a', '1'
 | 
			
		||||
    @b1 = quick_gem 'b', '1' do |s|
 | 
			
		||||
      s.add_runtime_dependency 'a'
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @d1 = quick_gem 'd', '1' do |s|
 | 
			
		||||
      s.add_runtime_dependency 'z'
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @cmd = Gem::Commands::LockCommand.new
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_execute
 | 
			
		||||
    @cmd.handle_options %w[b-1]
 | 
			
		||||
 | 
			
		||||
    use_ui @ui do
 | 
			
		||||
      @cmd.execute
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    expected = <<-EXPECTED
 | 
			
		||||
require 'rubygems'
 | 
			
		||||
gem 'b', '= 1'
 | 
			
		||||
gem 'a', '= 1'
 | 
			
		||||
    EXPECTED
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, @ui.output
 | 
			
		||||
    assert_equal '', @ui.error
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_execute_missing_dependency
 | 
			
		||||
    @cmd.handle_options %w[d-1]
 | 
			
		||||
 | 
			
		||||
    use_ui @ui do
 | 
			
		||||
      @cmd.execute
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    expected = <<-EXPECTED
 | 
			
		||||
require 'rubygems'
 | 
			
		||||
gem 'd', '= 1'
 | 
			
		||||
# Unable to satisfy 'z (>= 0, runtime)' from currently installed gems
 | 
			
		||||
    EXPECTED
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, @ui.output
 | 
			
		||||
    assert_equal '', @ui.error
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_execute_strict
 | 
			
		||||
    @cmd.handle_options %w[c-1 --strict]
 | 
			
		||||
 | 
			
		||||
    e = assert_raise Gem::Exception do
 | 
			
		||||
      use_ui @ui do
 | 
			
		||||
        @cmd.execute
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert_equal 'Could not find gem c-1, try using the full name', e.message
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -180,7 +180,7 @@ pl (1)
 | 
			
		|||
    @fetcher.data["#{@gem_repo}Marshal.#{Gem.marshal_version}"] =
 | 
			
		||||
      si.dump
 | 
			
		||||
 | 
			
		||||
    @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"] = nil
 | 
			
		||||
    @fetcher.data.delete "#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"
 | 
			
		||||
 | 
			
		||||
    @cmd.handle_options %w[-r]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -265,6 +265,27 @@ pl (1)
 | 
			
		|||
    assert_equal '', @ui.error
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_execute_local_notty
 | 
			
		||||
    @cmd.handle_options %w[]
 | 
			
		||||
 | 
			
		||||
    @ui.outs.tty = false
 | 
			
		||||
 | 
			
		||||
    use_ui @ui do
 | 
			
		||||
      @cmd.execute
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    expected = <<-EOF
 | 
			
		||||
a (2, 1)
 | 
			
		||||
a_evil (9)
 | 
			
		||||
b (2)
 | 
			
		||||
c (1.2)
 | 
			
		||||
pl (1)
 | 
			
		||||
    EOF
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, @ui.output
 | 
			
		||||
    assert_equal '', @ui.error
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_execute_no_versions
 | 
			
		||||
    @cmd.handle_options %w[-r --no-versions]
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -284,5 +305,23 @@ pl
 | 
			
		|||
    assert_equal '', @ui.error
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_execute_notty
 | 
			
		||||
    @cmd.handle_options %w[-r]
 | 
			
		||||
 | 
			
		||||
    @ui.outs.tty = false
 | 
			
		||||
 | 
			
		||||
    use_ui @ui do
 | 
			
		||||
      @cmd.execute
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    expected = <<-EOF
 | 
			
		||||
a (2)
 | 
			
		||||
pl (1)
 | 
			
		||||
    EOF
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, @ui.output
 | 
			
		||||
    assert_equal '', @ui.error
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										60
									
								
								test/rubygems/test_gem_commands_uninstall_command.rb
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								test/rubygems/test_gem_commands_uninstall_command.rb
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,60 @@
 | 
			
		|||
require 'test/unit'
 | 
			
		||||
require File.join(File.expand_path(File.dirname(__FILE__)), 'gemutilities')
 | 
			
		||||
require File.join(File.expand_path(File.dirname(__FILE__)),
 | 
			
		||||
                  'gem_installer_test_case')
 | 
			
		||||
require 'rubygems/commands/uninstall_command'
 | 
			
		||||
 | 
			
		||||
class TestGemCommandsUninstallCommand < GemInstallerTestCase
 | 
			
		||||
 | 
			
		||||
  def setup
 | 
			
		||||
    super
 | 
			
		||||
 | 
			
		||||
    ui = MockGemUi.new
 | 
			
		||||
    util_setup_gem ui
 | 
			
		||||
 | 
			
		||||
    use_ui ui do
 | 
			
		||||
      @installer.install
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    @cmd = Gem::Commands::UninstallCommand.new
 | 
			
		||||
    @cmd.options[:executables] = true
 | 
			
		||||
    @executable = File.join(@gemhome, 'bin', 'executable')
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_execute_removes_executable
 | 
			
		||||
    if win_platform?
 | 
			
		||||
      assert_equal true, File.exist?(@executable)
 | 
			
		||||
    else
 | 
			
		||||
      assert_equal true, File.symlink?(@executable)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    # Evil hack to prevent false removal success
 | 
			
		||||
    FileUtils.rm_f @executable
 | 
			
		||||
    File.open(@executable, "wb+") {|f| f.puts "binary"}
 | 
			
		||||
 | 
			
		||||
    @cmd.options[:args] = Array(@spec.name)
 | 
			
		||||
    use_ui @ui do
 | 
			
		||||
      @cmd.execute
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    output = @ui.output.split "\n"
 | 
			
		||||
    assert_match(/Removing executable/, output.shift)
 | 
			
		||||
    assert_match(/Successfully uninstalled/, output.shift)
 | 
			
		||||
    assert_equal false, File.exist?(@executable)
 | 
			
		||||
    assert_nil output.shift, "UI output should have contained only two lines"
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_execute_not_installed
 | 
			
		||||
    @cmd.options[:args] = ["foo"]
 | 
			
		||||
    e = assert_raise(Gem::InstallError) do
 | 
			
		||||
      use_ui @ui do
 | 
			
		||||
        @cmd.execute
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert_match(/\AUnknown gem foo >= 0$/, e.message)
 | 
			
		||||
    output = @ui.output.split "\n"
 | 
			
		||||
    assert output.empty?, "UI output should be empty after an uninstall error"
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -57,6 +57,9 @@ class TestGemConfigFile < RubyGemTestCase
 | 
			
		|||
      fp.puts ":sources:"
 | 
			
		||||
      fp.puts "  - http://more-gems.example.com"
 | 
			
		||||
      fp.puts "install: --wrappers"
 | 
			
		||||
      fp.puts ":gempath:"
 | 
			
		||||
      fp.puts "- /usr/ruby/1.8/lib/ruby/gems/1.8"
 | 
			
		||||
      fp.puts "- /var/ruby/1.8/gem_home"
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    util_config_file
 | 
			
		||||
| 
						 | 
				
			
			@ -68,6 +71,8 @@ class TestGemConfigFile < RubyGemTestCase
 | 
			
		|||
    assert_equal false, @cfg.update_sources
 | 
			
		||||
    assert_equal %w[http://more-gems.example.com], Gem.sources
 | 
			
		||||
    assert_equal '--wrappers', @cfg[:install]
 | 
			
		||||
    assert_equal(['/usr/ruby/1.8/lib/ruby/gems/1.8', '/var/ruby/1.8/gem_home'],
 | 
			
		||||
                 @cfg.path)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_initialize_handle_arguments_config_file
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -53,12 +53,13 @@ class TestGemExtConfigureBuilder < RubyGemTestCase
 | 
			
		|||
    expected = %r(configure failed:
 | 
			
		||||
 | 
			
		||||
#{Regexp.escape sh_prefix_configure}#{Regexp.escape @dest_path}
 | 
			
		||||
.*?: #{shell_error_msg})
 | 
			
		||||
.*?: #{shell_error_msg}
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
    assert_match expected, error.message
 | 
			
		||||
 | 
			
		||||
    assert_equal "#{sh_prefix_configure}#{@dest_path}", output.shift
 | 
			
		||||
    assert_match %r(#{shell_error_msg}\n), output.shift
 | 
			
		||||
    assert_match %r(#{shell_error_msg}), output.shift
 | 
			
		||||
    assert_equal true, output.empty?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -32,6 +32,8 @@ class TestGemExtRakeBuilder < RubyGemTestCase
 | 
			
		|||
      end
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    output = output.join "\n"
 | 
			
		||||
 | 
			
		||||
    expected = [
 | 
			
		||||
      "#{@@ruby} mkrf_conf.rb",
 | 
			
		||||
      "",
 | 
			
		||||
| 
						 | 
				
			
			@ -39,7 +41,9 @@ class TestGemExtRakeBuilder < RubyGemTestCase
 | 
			
		|||
      "(in #{realdir})\n"
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, output
 | 
			
		||||
    assert_no_match %r%^rake failed:%, output
 | 
			
		||||
    assert_match %r%^#{Regexp.escape @@ruby} mkrf_conf\.rb%, output
 | 
			
		||||
    assert_match %r%^#{Regexp.escape @@rake} RUBYARCHDIR=#{Regexp.escape @dest_path} RUBYLIBDIR=#{Regexp.escape @dest_path}%, output
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_class_build_fail
 | 
			
		||||
| 
						 | 
				
			
			@ -69,7 +73,9 @@ rake failed:
 | 
			
		|||
#{@@rake} RUBYARCHDIR=#{@dest_path} RUBYLIBDIR=#{@dest_path}
 | 
			
		||||
    EOF
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, error.message.split("\n")[0..4].join("\n")
 | 
			
		||||
    assert_match %r%^rake failed:%, error.message
 | 
			
		||||
    assert_match %r%^#{Regexp.escape @@ruby} mkrf_conf\.rb%, error.message
 | 
			
		||||
    assert_match %r%^#{Regexp.escape @@rake} RUBYARCHDIR=#{Regexp.escape @dest_path} RUBYLIBDIR=#{Regexp.escape @dest_path}%, error.message
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,10 +5,6 @@ require 'rubygems/gem_path_searcher'
 | 
			
		|||
class Gem::GemPathSearcher
 | 
			
		||||
  attr_accessor :gemspecs
 | 
			
		||||
  attr_accessor :lib_dirs
 | 
			
		||||
 | 
			
		||||
  public :init_gemspecs
 | 
			
		||||
  public :matching_file
 | 
			
		||||
  public :lib_dirs_for
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
class TestGemGemPathSearcher < RubyGemTestCase
 | 
			
		||||
| 
						 | 
				
			
			@ -40,6 +36,10 @@ class TestGemGemPathSearcher < RubyGemTestCase
 | 
			
		|||
    assert_equal @foo1, @gps.find('foo')
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_find_all
 | 
			
		||||
    assert_equal [@foo1], @gps.find_all('foo')
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_init_gemspecs
 | 
			
		||||
    assert_equal [@bar2, @bar1, @foo2, @foo1], @gps.init_gemspecs
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			@ -51,9 +51,17 @@ class TestGemGemPathSearcher < RubyGemTestCase
 | 
			
		|||
    assert_equal expected, lib_dirs
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_matching_file
 | 
			
		||||
    assert !@gps.matching_file(@foo1, 'bar')
 | 
			
		||||
    assert @gps.matching_file(@foo1, 'foo')
 | 
			
		||||
  def test_matching_file_eh
 | 
			
		||||
    assert !@gps.matching_file?(@foo1, 'bar')
 | 
			
		||||
    assert @gps.matching_file?(@foo1, 'foo')
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_matching_files
 | 
			
		||||
    assert_equal [], @gps.matching_files(@foo1, 'bar')
 | 
			
		||||
 | 
			
		||||
    expected = File.join @foo1.full_gem_path, 'lib', 'foo.rb'
 | 
			
		||||
 | 
			
		||||
    assert_equal [expected], @gps.matching_files(@foo1, 'foo')
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,8 +41,8 @@ class TestGemInstallUpdateOptions < GemInstallerTestCase
 | 
			
		|||
 | 
			
		||||
    @installer = Gem::Installer.new @gem, @cmd.options
 | 
			
		||||
    @installer.install
 | 
			
		||||
    assert File.exist?(File.join(@userhome, '.gem', 'gems'))
 | 
			
		||||
    assert File.exist?(File.join(@userhome, '.gem', 'gems', 
 | 
			
		||||
    assert File.exist?(File.join(Gem.user_dir, 'gems'))
 | 
			
		||||
    assert File.exist?(File.join(Gem.user_dir, 'gems',
 | 
			
		||||
                                 @spec.full_name))
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ class TestGemInstallUpdateOptions < GemInstallerTestCase
 | 
			
		|||
    File.chmod 0755, @userhome
 | 
			
		||||
    FileUtils.chmod 0000, @gemhome
 | 
			
		||||
 | 
			
		||||
    assert_raise(Gem::FilePermissionError) do
 | 
			
		||||
    assert_raises(Gem::FilePermissionError) do
 | 
			
		||||
      @installer = Gem::Installer.new @gem, @cmd.options
 | 
			
		||||
    end
 | 
			
		||||
  ensure
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -70,7 +70,10 @@ load 'my_exec'
 | 
			
		|||
#{Gem.ruby}: No such file or directory -- extconf.rb (LoadError)
 | 
			
		||||
    EOF
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, File.read(gem_make_out)
 | 
			
		||||
    assert_match %r%#{Regexp.escape Gem.ruby} extconf.rb%,
 | 
			
		||||
                 File.read(gem_make_out)
 | 
			
		||||
    assert_match %r%#{Regexp.escape Gem.ruby}: No such file%,
 | 
			
		||||
                 File.read(gem_make_out)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_build_extensions_unsupported
 | 
			
		||||
| 
						 | 
				
			
			@ -287,7 +290,7 @@ load 'my_exec'
 | 
			
		|||
    Dir.mkdir util_inst_bindir
 | 
			
		||||
    File.chmod 0000, util_inst_bindir
 | 
			
		||||
 | 
			
		||||
    assert_raise Gem::FilePermissionError do
 | 
			
		||||
    assert_raises Gem::FilePermissionError do
 | 
			
		||||
      @installer.generate_bin
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -372,7 +375,7 @@ load 'my_exec'
 | 
			
		|||
    Dir.mkdir util_inst_bindir
 | 
			
		||||
    File.chmod 0000, util_inst_bindir
 | 
			
		||||
 | 
			
		||||
    assert_raise Gem::FilePermissionError do
 | 
			
		||||
    assert_raises Gem::FilePermissionError do
 | 
			
		||||
      @installer.generate_bin
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -529,6 +532,16 @@ load 'my_exec'
 | 
			
		|||
    Dir.mkdir util_inst_bindir
 | 
			
		||||
    util_setup_gem
 | 
			
		||||
 | 
			
		||||
    cache_file = File.join @gemhome, 'cache', "#{@spec.full_name}.gem"
 | 
			
		||||
 | 
			
		||||
    Gem.pre_install do |installer|
 | 
			
		||||
      assert !File.exist?(cache_file), 'cache file should not exist yet'
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    Gem.post_install do |installer|
 | 
			
		||||
      assert File.exist?(cache_file), 'cache file should exist'
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    build_rake_in do
 | 
			
		||||
      use_ui @ui do
 | 
			
		||||
        assert_equal @spec, @installer.install
 | 
			
		||||
| 
						 | 
				
			
			@ -552,6 +565,9 @@ load 'my_exec'
 | 
			
		|||
 | 
			
		||||
    assert_equal spec_file, @spec.loaded_from
 | 
			
		||||
    assert File.exist?(spec_file)
 | 
			
		||||
 | 
			
		||||
    assert_same @installer, @pre_install_hook_arg
 | 
			
		||||
    assert_same @installer, @post_install_hook_arg
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_install_bad_gem
 | 
			
		||||
| 
						 | 
				
			
			@ -586,6 +602,29 @@ load 'my_exec'
 | 
			
		|||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_install_check_dependencies_install_dir
 | 
			
		||||
    gemhome2 = "#{@gemhome}2"
 | 
			
		||||
    @spec.add_dependency 'b'
 | 
			
		||||
 | 
			
		||||
    b2 = quick_gem 'b', 2
 | 
			
		||||
 | 
			
		||||
    FileUtils.mv @gemhome, gemhome2
 | 
			
		||||
    Gem.source_index.gems.delete b2.full_name
 | 
			
		||||
    source_index = Gem::SourceIndex.from_gems_in File.join(gemhome2,
 | 
			
		||||
                                                           'specifications')
 | 
			
		||||
 | 
			
		||||
    util_setup_gem
 | 
			
		||||
 | 
			
		||||
    @installer = Gem::Installer.new @gem, :install_dir => gemhome2,
 | 
			
		||||
                                    :source_index => source_index
 | 
			
		||||
 | 
			
		||||
    use_ui @ui do
 | 
			
		||||
      @installer.install
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert File.exist?(File.join(gemhome2, 'gems', @spec.full_name))
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_install_force
 | 
			
		||||
    use_ui @ui do
 | 
			
		||||
      installer = Gem::Installer.new old_ruby_required, :force => true
 | 
			
		||||
| 
						 | 
				
			
			@ -641,13 +680,13 @@ load 'my_exec'
 | 
			
		|||
    assert File.exist?(File.join(@gemhome, 'specifications',
 | 
			
		||||
                                 "#{@spec.full_name}.gemspec"))
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  unless win_platform? # File.chmod doesn't work
 | 
			
		||||
    def test_install_user_local_fallback
 | 
			
		||||
      Dir.mkdir util_inst_bindir
 | 
			
		||||
      File.chmod 0755, @userhome
 | 
			
		||||
      File.chmod 0000, util_inst_bindir
 | 
			
		||||
      File.chmod 0000, Gem.dir
 | 
			
		||||
      install_dir = File.join @userhome, '.gem', 'gems', @spec.full_name
 | 
			
		||||
      @spec.executables = ["executable"]
 | 
			
		||||
 | 
			
		||||
      build_rake_in do
 | 
			
		||||
| 
						 | 
				
			
			@ -656,9 +695,10 @@ load 'my_exec'
 | 
			
		|||
          @installer.install
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
    
 | 
			
		||||
      assert File.exist?(File.join(install_dir, 'lib', 'code.rb'))
 | 
			
		||||
      assert File.exist?(File.join(@userhome, '.gem', 'bin', 'executable'))
 | 
			
		||||
 | 
			
		||||
      assert File.exist?(File.join(Gem.user_dir, 'gems',
 | 
			
		||||
                                   @spec.full_name, 'lib', 'code.rb'))
 | 
			
		||||
      assert File.exist?(File.join(Gem.user_dir, 'bin', 'executable'))
 | 
			
		||||
    ensure
 | 
			
		||||
      File.chmod 0755, Gem.dir
 | 
			
		||||
      File.chmod 0755, util_inst_bindir
 | 
			
		||||
| 
						 | 
				
			
			@ -676,13 +716,13 @@ load 'my_exec'
 | 
			
		|||
          @installer.install
 | 
			
		||||
        end
 | 
			
		||||
      end
 | 
			
		||||
      
 | 
			
		||||
      assert File.exist?(File.join(@userhome, '.gem', 'bin', 'executable'))
 | 
			
		||||
 | 
			
		||||
      assert File.exist?(File.join(Gem.user_dir, 'bin', 'executable'))
 | 
			
		||||
    ensure
 | 
			
		||||
      File.chmod 0755, util_inst_bindir
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  def test_install_with_message
 | 
			
		||||
    @spec.post_install_message = 'I am a shiny gem!'
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,6 +19,18 @@ class TestGemLocalRemoteOptions < RubyGemTestCase
 | 
			
		|||
    assert @cmd.handles?(args)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_both_eh
 | 
			
		||||
    assert_equal false, @cmd.both?
 | 
			
		||||
 | 
			
		||||
    @cmd.options[:domain] = :local
 | 
			
		||||
 | 
			
		||||
    assert_equal false, @cmd.both?
 | 
			
		||||
 | 
			
		||||
    @cmd.options[:domain] = :both
 | 
			
		||||
 | 
			
		||||
    assert_equal true, @cmd.both?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_local_eh
 | 
			
		||||
    assert_equal false, @cmd.local?
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,19 +62,19 @@ class TestGemPackageTarHeader < TarTestCase
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def test_initialize_bad
 | 
			
		||||
    assert_raise ArgumentError do
 | 
			
		||||
    assert_raises ArgumentError do
 | 
			
		||||
      Gem::Package::TarHeader.new :name => '', :size => '', :mode => ''
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert_raise ArgumentError do
 | 
			
		||||
    assert_raises ArgumentError do
 | 
			
		||||
      Gem::Package::TarHeader.new :name => '', :size => '', :prefix => ''
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert_raise ArgumentError do
 | 
			
		||||
    assert_raises ArgumentError do
 | 
			
		||||
      Gem::Package::TarHeader.new :name => '', :prefix => '', :mode => ''
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert_raise ArgumentError do
 | 
			
		||||
    assert_raises ArgumentError do
 | 
			
		||||
      Gem::Package::TarHeader.new :prefix => '', :size => '', :mode => ''
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,19 +5,6 @@ require 'rbconfig'
 | 
			
		|||
 | 
			
		||||
class TestGemPlatform < RubyGemTestCase
 | 
			
		||||
 | 
			
		||||
  def test_self_const_missing
 | 
			
		||||
    consts = [:DARWIN, :LINUX_586, :MSWIN32, :PPC_DARWIN, :WIN32, :X86_LINUX]
 | 
			
		||||
 | 
			
		||||
    consts.each do |const|
 | 
			
		||||
      e = assert_raise NameError do
 | 
			
		||||
        Gem::Platform.const_missing const
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      assert_equal "#{const} has been removed, use CURRENT instead",
 | 
			
		||||
                   e.message
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_self_local
 | 
			
		||||
    util_set_arch 'i686-darwin8.10.1'
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -105,6 +92,12 @@ class TestGemPlatform < RubyGemTestCase
 | 
			
		|||
    platform = Gem::Platform.new 'i386-mswin32-80'
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, platform.to_a, 'i386-mswin32-80'
 | 
			
		||||
 | 
			
		||||
    expected = ['x86', 'solaris', '2.10']
 | 
			
		||||
 | 
			
		||||
    platform = Gem::Platform.new 'i386-solaris-2.10'
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, platform.to_a, 'i386-solaris-2.10'
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_initialize_mswin32_vc6
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -268,15 +268,15 @@ gems:
 | 
			
		|||
    ensure
 | 
			
		||||
      File.chmod 0755, File.join(@gemhome, 'cache')
 | 
			
		||||
    end
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    def test_download_read_only
 | 
			
		||||
      File.chmod 0555, File.join(@gemhome, 'cache')
 | 
			
		||||
      File.chmod 0555, File.join(@gemhome)
 | 
			
		||||
 | 
			
		||||
      fetcher = util_fuck_with_fetcher File.read(@a1_gem)
 | 
			
		||||
      fetcher.download(@a1, 'http://gems.example.com')
 | 
			
		||||
      assert File.exist?(File.join(@userhome, '.gem',
 | 
			
		||||
                                   'cache', "#{@a1.full_name}.gem"))
 | 
			
		||||
      assert File.exist?(File.join(Gem.user_dir, 'cache',
 | 
			
		||||
                                   "#{@a1.full_name}.gem"))
 | 
			
		||||
    ensure
 | 
			
		||||
      File.chmod 0755, File.join(@gemhome)
 | 
			
		||||
      File.chmod 0755, File.join(@gemhome, 'cache')
 | 
			
		||||
| 
						 | 
				
			
			@ -391,6 +391,16 @@ gems:
 | 
			
		|||
    assert_equal 'foo', fetcher.fetch_path(@uri + 'foo.gz')
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_fetch_path_gzip_unmodified
 | 
			
		||||
    fetcher = Gem::RemoteFetcher.new nil
 | 
			
		||||
 | 
			
		||||
    def fetcher.open_uri_or_path(uri, mtime, head = nil)
 | 
			
		||||
      nil
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert_equal nil, fetcher.fetch_path(@uri + 'foo.gz', Time.at(0))
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_fetch_path_io_error
 | 
			
		||||
    fetcher = Gem::RemoteFetcher.new nil
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -441,10 +451,10 @@ gems:
 | 
			
		|||
    fetcher = Gem::RemoteFetcher.new nil
 | 
			
		||||
 | 
			
		||||
    def fetcher.open_uri_or_path(uri, mtime, head = nil)
 | 
			
		||||
      ''
 | 
			
		||||
      nil
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    assert_equal '', fetcher.fetch_path(URI.parse(@gem_repo), Time.at(0))
 | 
			
		||||
    assert_equal nil, fetcher.fetch_path(URI.parse(@gem_repo), Time.at(0))
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_get_proxy_from_env_empty
 | 
			
		||||
| 
						 | 
				
			
			@ -504,7 +514,7 @@ gems:
 | 
			
		|||
    def conn.request(req)
 | 
			
		||||
      unless defined? @requested then
 | 
			
		||||
        @requested = true
 | 
			
		||||
        res = Net::HTTPRedirection.new nil, 301, nil
 | 
			
		||||
        res = Net::HTTPMovedPermanently.new nil, 301, nil
 | 
			
		||||
        res.add_field 'Location', 'http://gems.example.com/real_path'
 | 
			
		||||
        res
 | 
			
		||||
      else
 | 
			
		||||
| 
						 | 
				
			
			@ -528,7 +538,7 @@ gems:
 | 
			
		|||
    conn = Object.new
 | 
			
		||||
    def conn.started?() true end
 | 
			
		||||
    def conn.request(req)
 | 
			
		||||
      res = Net::HTTPRedirection.new nil, 301, nil
 | 
			
		||||
      res = Net::HTTPMovedPermanently.new nil, 301, nil
 | 
			
		||||
      res.add_field 'Location', 'http://gems.example.com/redirect'
 | 
			
		||||
      res
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,6 +64,54 @@ class TestGemSourceIndex < RubyGemTestCase
 | 
			
		|||
    assert_equal a1.author, spec.author
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_self_load_specification_utf_8
 | 
			
		||||
    spec_dir = File.join @gemhome, 'specifications'
 | 
			
		||||
 | 
			
		||||
    FileUtils.rm_r spec_dir
 | 
			
		||||
 | 
			
		||||
    FileUtils.mkdir_p spec_dir
 | 
			
		||||
 | 
			
		||||
    spec_file = File.join spec_dir, "utf-8.gemspec"
 | 
			
		||||
    spec_data = <<-SPEC
 | 
			
		||||
Gem::Specification.new do |s|
 | 
			
		||||
  s.name = %q{utf}
 | 
			
		||||
  s.version = "8"
 | 
			
		||||
 | 
			
		||||
  s.required_rubygems_version = Gem::Requirement.new(">= 0")
 | 
			
		||||
  s.authors = ["\317\200"]
 | 
			
		||||
  s.date = %q{2008-09-10}
 | 
			
		||||
  s.description = %q{This is a test description}
 | 
			
		||||
  s.email = %q{example@example.com}
 | 
			
		||||
  s.has_rdoc = true
 | 
			
		||||
  s.homepage = %q{http://example.com}
 | 
			
		||||
  s.require_paths = ["lib"]
 | 
			
		||||
  s.rubygems_version = %q{1.2.0}
 | 
			
		||||
  s.summary = %q{this is a summary}
 | 
			
		||||
 | 
			
		||||
  if s.respond_to? :specification_version then
 | 
			
		||||
    current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
 | 
			
		||||
    s.specification_version = 2
 | 
			
		||||
 | 
			
		||||
    if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
 | 
			
		||||
    else
 | 
			
		||||
    end
 | 
			
		||||
  else
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
    SPEC
 | 
			
		||||
 | 
			
		||||
    spec_data.force_encoding 'UTF-8'
 | 
			
		||||
 | 
			
		||||
    File.open spec_file, 'w' do |io| io.write spec_data end
 | 
			
		||||
 | 
			
		||||
    spec = Gem::SourceIndex.load_specification spec_file
 | 
			
		||||
 | 
			
		||||
    pi = "\317\200"
 | 
			
		||||
    pi.force_encoding 'UTF-8' if pi.respond_to? :force_encoding
 | 
			
		||||
 | 
			
		||||
    assert_equal pi, spec.author
 | 
			
		||||
  end if Gem.ruby_version > Gem::Version.new('1.9')
 | 
			
		||||
 | 
			
		||||
  def test_self_load_specification_exception
 | 
			
		||||
    spec_dir = File.join @gemhome, 'specifications'
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -437,6 +485,27 @@ WARNING:  Invalid .gemspec format in '#{spec_file}'
 | 
			
		|||
    assert_equal [], missing
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_find_name
 | 
			
		||||
    assert_equal [@a1, @a2], @source_index.find_name('a')
 | 
			
		||||
    assert_equal [@a2], @source_index.find_name('a', '= 2')
 | 
			
		||||
    assert_equal [], @source_index.find_name('bogusstring')
 | 
			
		||||
    assert_equal [], @source_index.find_name('a', '= 3')
 | 
			
		||||
 | 
			
		||||
    source_index = Gem::SourceIndex.new
 | 
			
		||||
    source_index.add_spec @a1
 | 
			
		||||
    source_index.add_spec @a2
 | 
			
		||||
 | 
			
		||||
    assert_equal [@a1], source_index.find_name(@a1.name, '= 1')
 | 
			
		||||
 | 
			
		||||
    r1 = Gem::Requirement.create '= 1'
 | 
			
		||||
    assert_equal [@a1], source_index.find_name(@a1.name, r1)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_find_name_empty_cache
 | 
			
		||||
    empty_source_index = Gem::SourceIndex.new({})
 | 
			
		||||
    assert_equal [], empty_source_index.find_name("foo")
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_latest_specs
 | 
			
		||||
    p1_ruby = quick_gem 'p', '1'
 | 
			
		||||
    p1_platform = quick_gem 'p', '1' do |spec|
 | 
			
		||||
| 
						 | 
				
			
			@ -573,28 +642,12 @@ WARNING:  Invalid .gemspec format in '#{spec_file}'
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def test_search
 | 
			
		||||
    assert_equal [@a1, @a2, @a_evil9], @source_index.search('a')
 | 
			
		||||
    assert_equal [@a2], @source_index.search('a', '= 2')
 | 
			
		||||
    requirement = Gem::Requirement.create '= 9'
 | 
			
		||||
    with_version = Gem::Dependency.new(/^a/, requirement)
 | 
			
		||||
    assert_equal [@a_evil9], @source_index.search(with_version)
 | 
			
		||||
 | 
			
		||||
    assert_equal [], @source_index.search('bogusstring')
 | 
			
		||||
    assert_equal [], @source_index.search('a', '= 3')
 | 
			
		||||
 | 
			
		||||
    source_index = Gem::SourceIndex.new
 | 
			
		||||
    source_index.add_spec @a1
 | 
			
		||||
    source_index.add_spec @a2
 | 
			
		||||
 | 
			
		||||
    assert_equal [@a1], source_index.search(@a1.name, '= 1')
 | 
			
		||||
 | 
			
		||||
    r1 = Gem::Requirement.create '= 1'
 | 
			
		||||
    assert_equal [@a1], source_index.search(@a1.name, r1)
 | 
			
		||||
 | 
			
		||||
    dep = Gem::Dependency.new @a1.name, r1
 | 
			
		||||
    assert_equal [@a1], source_index.search(dep)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_search_empty_cache
 | 
			
		||||
    empty_source_index = Gem::SourceIndex.new({})
 | 
			
		||||
    assert_equal [], empty_source_index.search("foo")
 | 
			
		||||
    with_default = Gem::Dependency.new(/^a/, Gem::Requirement.default)
 | 
			
		||||
    assert_equal [@a1, @a2, @a_evil9], @source_index.search(with_default)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_search_platform
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -224,7 +224,8 @@ class TestGemSourceInfoCache < RubyGemTestCase
 | 
			
		|||
 | 
			
		||||
    @sic.set_cache_data @gem_repo => sice
 | 
			
		||||
    latest = @sic.latest_cache_data
 | 
			
		||||
    gems = latest[@gem_repo].source_index.search('a').map { |s| s.full_name }
 | 
			
		||||
    beginning_with_a = Gem::Dependency.new(/^a/, Gem::Requirement.default)
 | 
			
		||||
    gems = latest[@gem_repo].source_index.search(beginning_with_a).map { |s| s.full_name }
 | 
			
		||||
 | 
			
		||||
    assert_equal %w[a-2 a_evil-9], gems
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,7 +67,7 @@ class TestGemSpecFetcher < RubyGemTestCase
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def test_fetch_legacy_repo
 | 
			
		||||
    @fetcher.data["#{@gem_repo}specs.#{Gem.marshal_version}.gz"] = nil
 | 
			
		||||
    @fetcher.data.delete "#{@gem_repo}specs.#{Gem.marshal_version}.gz"
 | 
			
		||||
    @fetcher.data["#{@gem_repo}yaml"] = ''
 | 
			
		||||
    util_setup_source_info_cache @a1, @a2
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -259,6 +259,16 @@ RubyGems will revert to legacy indexes degrading performance.
 | 
			
		|||
    assert_equal specs, cached_specs
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_list_latest_all
 | 
			
		||||
    specs = @sf.list false
 | 
			
		||||
 | 
			
		||||
    assert_equal [@latest_specs], specs.values
 | 
			
		||||
 | 
			
		||||
    specs = @sf.list true
 | 
			
		||||
 | 
			
		||||
    assert_equal [@specs], specs.values, 'specs file not loaded'
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_load_specs
 | 
			
		||||
    specs = @sf.load_specs @uri, 'specs'
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -280,7 +290,7 @@ RubyGems will revert to legacy indexes degrading performance.
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def test_load_specs_cached
 | 
			
		||||
    @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"] = ''
 | 
			
		||||
    @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}.gz"] = nil
 | 
			
		||||
    @fetcher.data["#{@gem_repo}latest_specs.#{Gem.marshal_version}"] =
 | 
			
		||||
      ' ' * Marshal.dump(@latest_specs).length
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -500,7 +500,7 @@ end
 | 
			
		|||
  end
 | 
			
		||||
 | 
			
		||||
  def test_has_rdoc_eh
 | 
			
		||||
    assert_equal true, @a1.has_rdoc?
 | 
			
		||||
    assert @a1.has_rdoc?
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_hash
 | 
			
		||||
| 
						 | 
				
			
			@ -634,7 +634,10 @@ end
 | 
			
		|||
 | 
			
		||||
    ruby_code = @a2.to_ruby
 | 
			
		||||
 | 
			
		||||
    expected = "Gem::Specification.new do |s|
 | 
			
		||||
    expected = <<-SPEC
 | 
			
		||||
# -*- encoding: utf-8 -*-
 | 
			
		||||
 | 
			
		||||
Gem::Specification.new do |s|
 | 
			
		||||
  s.name = %q{a}
 | 
			
		||||
  s.version = \"2\"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -654,7 +657,7 @@ end
 | 
			
		|||
    current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
 | 
			
		||||
    s.specification_version = #{Gem::Specification::CURRENT_SPECIFICATION_VERSION}
 | 
			
		||||
 | 
			
		||||
    if current_version >= 3 then
 | 
			
		||||
    if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
 | 
			
		||||
      s.add_runtime_dependency(%q<b>, [\"= 1\"])
 | 
			
		||||
    else
 | 
			
		||||
      s.add_dependency(%q<b>, [\"= 1\"])
 | 
			
		||||
| 
						 | 
				
			
			@ -663,7 +666,7 @@ end
 | 
			
		|||
    s.add_dependency(%q<b>, [\"= 1\"])
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
"
 | 
			
		||||
    SPEC
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, ruby_code
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -679,7 +682,10 @@ end
 | 
			
		|||
    local = Gem::Platform.local
 | 
			
		||||
    expected_platform = "[#{local.cpu.inspect}, #{local.os.inspect}, #{local.version.inspect}]"
 | 
			
		||||
 | 
			
		||||
    expected = "Gem::Specification.new do |s|
 | 
			
		||||
    expected = <<-SPEC
 | 
			
		||||
# -*- encoding: utf-8 -*-
 | 
			
		||||
 | 
			
		||||
Gem::Specification.new do |s|
 | 
			
		||||
  s.name = %q{a}
 | 
			
		||||
  s.version = \"1\"
 | 
			
		||||
  s.platform = Gem::Platform.new(#{expected_platform})
 | 
			
		||||
| 
						 | 
				
			
			@ -706,7 +712,7 @@ end
 | 
			
		|||
    current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
 | 
			
		||||
    s.specification_version = 2
 | 
			
		||||
 | 
			
		||||
    if current_version >= 3 then
 | 
			
		||||
    if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
 | 
			
		||||
      s.add_runtime_dependency(%q<rake>, [\"> 0.4\"])
 | 
			
		||||
      s.add_runtime_dependency(%q<jabber4r>, [\"> 0.0.0\"])
 | 
			
		||||
      s.add_runtime_dependency(%q<pqa>, [\"> 0.4\", \"<= 0.6\"])
 | 
			
		||||
| 
						 | 
				
			
			@ -721,7 +727,7 @@ end
 | 
			
		|||
    s.add_dependency(%q<pqa>, [\"> 0.4\", \"<= 0.6\"])
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
"
 | 
			
		||||
    SPEC
 | 
			
		||||
 | 
			
		||||
    assert_equal expected, ruby_code
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,7 +63,7 @@ class TestGemStreamUI < RubyGemTestCase
 | 
			
		|||
    @in.tty = false
 | 
			
		||||
 | 
			
		||||
    timeout(0.1) do
 | 
			
		||||
      assert_raise(Gem::OperationNotSupportedError) do
 | 
			
		||||
      assert_raises(Gem::OperationNotSupportedError) do
 | 
			
		||||
        @sui.ask_yes_no("do coconuts migrate?")
 | 
			
		||||
      end
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -62,5 +62,26 @@ class TestGemUninstaller < GemInstallerTestCase
 | 
			
		|||
    assert_equal true, uninstaller.path_ok?(@spec)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def test_uninstall
 | 
			
		||||
    uninstaller = Gem::Uninstaller.new @spec.name, :executables => true
 | 
			
		||||
 | 
			
		||||
    gem_dir = File.join @gemhome, 'gems', @spec.full_name
 | 
			
		||||
 | 
			
		||||
    Gem.pre_uninstall do
 | 
			
		||||
      assert File.exist?(gem_dir), 'gem_dir should exist'
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    Gem.post_uninstall do
 | 
			
		||||
      assert !File.exist?(gem_dir), 'gem_dir should not exist'
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    uninstaller.uninstall
 | 
			
		||||
 | 
			
		||||
    assert !File.exist?(gem_dir)
 | 
			
		||||
 | 
			
		||||
    assert_same uninstaller, @pre_uninstall_hook_arg
 | 
			
		||||
    assert_same uninstaller, @post_uninstall_hook_arg
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -107,7 +107,7 @@ class TestGemVersion < RubyGemTestCase
 | 
			
		|||
 | 
			
		||||
  def test_illformed_requirements
 | 
			
		||||
    [ ">>> 1.3.5", "> blah" ].each do |rq|
 | 
			
		||||
      assert_raise(ArgumentError, "req [#{rq}] should fail") {
 | 
			
		||||
      assert_raises(ArgumentError, "req [#{rq}] should fail") {
 | 
			
		||||
        Gem::Version::Requirement.new(rq)
 | 
			
		||||
      }
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue