Created
May 23, 2010 21:15
-
-
Save octplane/411253 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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