lib/rubygems/remote_fetcher.rb
##
# Moves the gem +spec+ from +source_uri+ to the cache dir unless it is
# already there.  If the source_uri is local the gem cache dir copy is
# always replaced.
Moves the gem +spec+ from +source_uri+ to the cache dir unless it is
already there.  If the source_uri is local the gem cache dir copy is
always replaced.
Moves the gem + spec + from + source_uri + to the cache dir unless it is already there . If the source_uri is local the gem cache dir copy is always replaced .
def download(spec, source_uri, install_dir = Gem.dir)
    Gem.ensure_gem_subdirectories(install_dir) rescue nil
    if File.writable?(install_dir)
      cache_dir = File.join install_dir, "cache"
    else
      cache_dir = File.join Gem.user_dir, "cache"
    end
    gem_file_name = File.basename spec.cache_file
    local_gem_path = File.join cache_dir, gem_file_name
    FileUtils.mkdir_p cache_dir rescue nil unless File.exist? cache_dir
    unless URI::Generic === source_uri
      source_uri = URI.parse(URI.const_defined?(:DEFAULT_PARSER) ?
                             URI::DEFAULT_PARSER.escape(source_uri.to_s) :
                             URI.escape(source_uri.to_s))
    end
    scheme = source_uri.scheme
    scheme = nil if scheme =~ /^[a-z]$/i
    case scheme
    when 'http', 'https' then
      unless File.exist? local_gem_path then
        begin
          say "Downloading gem #{gem_file_name}" if
            Gem.configuration.really_verbose
          remote_gem_path = source_uri + "gems/#{gem_file_name}"
          gem = self.fetch_path remote_gem_path
        rescue Gem::RemoteFetcher::FetchError
          raise if spec.original_platform == spec.platform
          alternate_name = "#{spec.original_name}.gem"
          say "Failed, downloading gem #{alternate_name}" if
            Gem.configuration.really_verbose
          remote_gem_path = source_uri + "gems/#{alternate_name}"
          gem = self.fetch_path remote_gem_path
        end
        File.open local_gem_path, 'wb' do |fp|
          fp.write gem
        end
      end
    when 'file' then
      begin
        path = source_uri.path
        path = File.dirname(path) if File.extname(path) == '.gem'
        remote_gem_path = correct_for_windows_path(File.join(path, 'gems', gem_file_name))
        FileUtils.cp(remote_gem_path, local_gem_path)
      rescue Errno::EACCES
        local_gem_path = source_uri.to_s
      end
      say "Using local gem #{local_gem_path}" if
        Gem.configuration.really_verbose
    when nil then 
      source_path = if Gem.win_platform? && source_uri.scheme &&
                       !source_uri.path.include?(':') then
                      "#{source_uri.scheme}:#{source_uri.path}"
                    else
                      source_uri.path
                    end
      source_path = unescape source_path
      begin
        FileUtils.cp source_path, local_gem_path unless
          File.expand_path(source_path) == File.expand_path(local_gem_path)
      rescue Errno::EACCES
        local_gem_path = source_uri.to_s
      end
      say "Using local gem #{local_gem_path}" if
        Gem.configuration.really_verbose
    else
      raise Gem::InstallError, "unsupported URI scheme #{source_uri.scheme}"
    end
    local_gem_path
  end
def download ( spec , source_uri , install_dir = Gem . dir ) Gem . ensure_gem_subdirectories ( install_dir ) rescue nil if File . writable? ( install_dir ) cache_dir = File . join install_dir , "cache" else cache_dir = File . join Gem . user_dir , "cache" end gem_file_name = File . basename spec . cache_file local_gem_path = File . join cache_dir , gem_file_name FileUtils . mkdir_p cache_dir rescue nil unless File . exist? cache_dir unless URI :: Generic === source_uri source_uri = URI . parse ( URI . const_defined? ( :DEFAULT_PARSER ) ? URI :: DEFAULT_PARSER . escape ( source_uri . to_s ) : URI . escape ( source_uri . to_s ) ) end scheme = source_uri . scheme scheme = nil if scheme =~ / ^[a-z]$ /i case scheme when 'http' , 'https' then unless File . exist? local_gem_path then begin say "Downloading gem #{gem_file_name}" if Gem . configuration . really_verbose remote_gem_path = source_uri + "gems/#{gem_file_name}" gem = self . fetch_path remote_gem_path rescue Gem :: RemoteFetcher :: FetchError raise if spec . original_platform == spec . platform alternate_name = "#{spec.original_name}.gem" say "Failed, downloading gem #{alternate_name}" if Gem . configuration . really_verbose remote_gem_path = source_uri + "gems/#{alternate_name}" gem = self . fetch_path remote_gem_path end File . open local_gem_path , 'wb' do | fp | fp . write gem end end when 'file' then begin path = source_uri . path path = File . dirname ( path ) if File . extname ( path ) == '.gem' remote_gem_path = correct_for_windows_path ( File . join ( path , 'gems' , gem_file_name ) ) FileUtils . cp ( remote_gem_path , local_gem_path ) rescue Errno :: EACCES local_gem_path = source_uri . to_s end say "Using local gem #{local_gem_path}" if Gem . configuration . really_verbose when nil then source_path = if Gem . win_platform? && source_uri . scheme && ! source_uri . path . include? ( ':' ) then "#{source_uri.scheme}:#{source_uri.path}" else source_uri . path end source_path = unescape source_path begin FileUtils . cp source_path , local_gem_path unless File . expand_path ( source_path ) == File . expand_path ( local_gem_path ) rescue Errno :: EACCES local_gem_path = source_uri . to_s end say "Using local gem #{local_gem_path}" if Gem . configuration . really_verbose else raise Gem :: InstallError , "unsupported URI scheme #{source_uri.scheme}" end local_gem_path end
Moves the gem +spec+ from +source_uri+ to the cache dir unless it is
already there.
Moves the gem + spec + from + source_uri + to the cache dir unless it is already there .
# Always escape URI's to deal with potential spaces and such # URI.parse gets confused by MS Windows paths with forward slashes. # TODO test for local overriding cache
spec
<not_specific>
source_uri
<not_specific>
install_dir
<not_specific>
dir
<not_specific>