Skip to content

Instantly share code, notes, and snippets.

@danielsdeleo
Forked from octplane/fastergem.rb
Created May 23, 2010 21:20
Show Gist options
  • Save danielsdeleo/411256 to your computer and use it in GitHub Desktop.
Save danielsdeleo/411256 to your computer and use it in GitHub Desktop.
class Chef
class Provider
class Package
class Rubygems
Chef::Log.info "Patch rubygems provider"
@@GEM_CACHE = {}
@@GEM_CACHE_TIMESTAMP = nil
def lookup_in_source(gem, source)
@@GEM_CACHE[source] ||= Gem::SpecFetcher.fetcher.load_specs(URI.parse(source), 'latespecs')
all_versions = @@GEM_CACHE[source].reject{ |name, v, p| name!=gem || v.prerelease? }. {|n,v,p|v}.sort
version = all_versions.last.to_s
Chef::Log.debug "Look for #{gem} in #{source} -> #{version}"
version.empty? ? nil : version
end
def load_current_resource
@current_resource = Chef::Resource::Package.new(@new_resource.name)
@current_resource.package_name(@new_resource.package_name)
@current_resource.version(nil)
if @@GEM_CACHE_TIMESTAMP.nil? || Time.now - @@GEM_CACHE_TIMESTAMP > 3*60
Chef::Log.info "Gem: Purging source list cache"
Gem.refresh()
@@GEM_CACHE.clear
@@GEM_CACHE_TIMESTAMP = Time.now
end
# if a version is specified and we have it, then it is our current
if @new_resource.version
found = Gem.source_index.find_name(@new_resource.package_name, Gem::Requirement.new(@_resource.version))
@current_resource.version(@new_resource.version) unless found.empty?
end
if !@current_resource.version && Gem.available?(@new_resource.package_name)
# else it is the gem-preffered installed version
gems = Gem.source_index.find_name(@new_resource.package_name)
if gems.size > 0
@current_resource.version(gems.map{|g| g.version}.sort.last.to_s)
end
end
if !@new_resource.version.nil?
@candidate_version = @new_resource.version
else
if @new_resource.source
@candidate_version = lookup_in_source @new_resource.package_name, @new_resource.sou
end
if @candidate_version.nil?
Gem.sources.each do |source|
@candidate_version = lookup_in_source(@new_resource.package_name, source)
break if !@candidate_version.nil?
end
end
end
unless @candidate_version
raise Chef::Exceptions::Package, "No version found for #{@new_resource.name}"
end
Chef::Log.debug "Gem: #{@new_resource.package_name} required:#{@new_resource.version} cent:#{@current_resource.version} candidate:#{@candidate_version} (from #{@new_resource.source})"
end
def install_package(name, version)
src = nil
if @new_resource.source
src = " --source=#{@new_resource.source} --source=http://gemcutter.org --source=httpgems.github.com"
end
run_command(
:command => "#{gem_binary_path} install #{name} -q --no-rdoc --no-ri -v '#{version}'#c} #{opts}"
)
end
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment