Sha256: de9e6cdb535efe57d21e78cc700475098650002462c40e73c6a8f6bc813d53c7

Contents?: true

Size: 1.32 KB

Versions: 1

Compression:

Stored size: 1.32 KB

Contents

require 'timeout'

module Rip
  class RemoteGemPackage < Package
    handles do |source|
      RemoteGemPackage.new(source).exists?
    end

    @@remotes = %w( gems.github.com gems.rubyforge.org )
    @@exists_cache = {}

    def exists?
      return false unless source =~ /^[\w-]+$/
      return true if @@exists_cache[source] || File.exists?(cache_path)

      FileUtils.mkdir_p cache_path

      Dir.chdir cache_path do
        @@remotes.each do |remote|
          ui.puts "Searching %s for %s..." % [ remote, source ]

          source_flag = "--source=http://#{remote}/"
          if rgem("fetch #{source} #{source_flag}") =~ /Downloaded (.+)/
            @@exists_cache[source] = $1
            return true
          end
        end
      end

      false
    end

    def rgem(command)
      Timeout.timeout(5) do
        `gem #{command}`
      end
    rescue Timeout::Error
      ''
    end

    def meta_package?
      true
    end

    def fetch!
    end

    def unpack!
      installer = Installer.new
      installer.install actual_package
      installer.manager.sources[actual_package.name] = source
      installer.manager.save
    end

    def version
      actual_package ? actual_package.version : super
    end

    memoize :actual_package
    def actual_package
      Package.for(Dir[cache_path + '/*'].first)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
rip-0.0.1 lib/rip/packages/remote_gem_package.rb