summaryrefslogtreecommitdiffstats
path: root/lib/puppet/provider/package/gem.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/puppet/provider/package/gem.rb')
-rwxr-xr-xlib/puppet/provider/package/gem.rb45
1 files changed, 33 insertions, 12 deletions
diff --git a/lib/puppet/provider/package/gem.rb b/lib/puppet/provider/package/gem.rb
index bb09bc5b0..133243c86 100755
--- a/lib/puppet/provider/package/gem.rb
+++ b/lib/puppet/provider/package/gem.rb
@@ -1,9 +1,12 @@
require 'puppet/provider/package'
+require 'uri'
# Ruby gems support.
Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package do
- desc "Ruby Gem support. By default uses remote gems, but you can specify
- the path to a local gem via ``source``."
+ desc "Ruby Gem support. If a URL is passed via ``source``, then that URL is used as the
+ remote gem repository; if a source is present but is not a valid URL, it will be
+ interpreted as the path to a local gem file. If source is not present at all,
+ the gem will be installed from the default gem repositories."
has_feature :versionable
@@ -65,20 +68,38 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package d
end
def install(useversion = true)
- command = ["install"]
- if (! @resource.should(:ensure).is_a? Symbol) and useversion
- command << "-v" << @resource.should(:ensure)
+ command = [command(:gemcmd), "install"]
+ if (! resource[:ensure].is_a? Symbol) and useversion
+ command << "-v" << resource[:ensure]
end
# Always include dependencies
command << "--include-dependencies"
- if source = @resource[:source]
- command << source
+ if source = resource[:source]
+ begin
+ uri = URI.parse(source)
+ rescue => detail
+ fail "Invalid source '%s': %s" % [uri, detail]
+ end
+
+ case uri.scheme
+ when nil:
+ # no URI scheme => interpret the source as a local file
+ command << source
+ when /file/i
+ command << uri.path
+ when 'puppet'
+ # we don't support puppet:// URLs (yet)
+ raise Puppet::Error.new("puppet:// URLs are not supported as gem sources")
+ else
+ # interpret it as a gem repository
+ command << "--source" << "#{source}" << resource[:name]
+ end
else
- command << @resource[:name]
+ command << resource[:name]
end
- output = gemcmd(*command)
+ output = execute(command)
# Apparently some stupid gem versions don't exit non-0 on failure
if output.include?("ERROR")
self.fail "Could not install: %s" % output.chomp
@@ -87,17 +108,17 @@ Puppet::Type.type(:package).provide :gem, :parent => Puppet::Provider::Package d
def latest
# This always gets the latest version available.
- hash = self.class.gemlist(:justme => @resource[:name])
+ hash = self.class.gemlist(:justme => resource[:name])
return hash[:ensure]
end
def query
- self.class.gemlist(:justme => @resource[:name], :local => true)
+ self.class.gemlist(:justme => resource[:name], :local => true)
end
def uninstall
- gemcmd "uninstall", "-x", "-a", @resource[:name]
+ gemcmd "uninstall", "-x", "-a", resource[:name]
end
def update