Please review pull request #614: Bug/2.7.x/13397 ensure latest multiple gems opened by (cprice-puppet)
Description:
As of 2.7.12, if you had "ensure=>latest" for any gem package
resource, puppet would not correctly detect that the gem
was already installed and would attempt to install it on
every run. (This was because the "latest" method on the
gem provider was always returning an array, when it should
always be returning a single value.)
- Opened: Fri Mar 30 00:22:02 UTC 2012
- Based on: puppetlabs:2.7.x (2d51b642fcd1fd835d3a5d21bb09b3b74718c874)
- Requested merge: cprice-puppet:bug/2.7.x/13397-ensure-latest-multiple-gems (e24755dafe0fd739e2b9894bcce431585bb0e815)
Diff follows:
diff --git a/lib/puppet/provider/package/gem.rb b/lib/puppet/provider/package/gem.rb
index 2cd907b..331615f 100755
--- a/lib/puppet/provider/package/gem.rb
+++ b/lib/puppet/provider/package/gem.rb
@@ -104,7 +104,7 @@ def latest
# This always gets the latest version available.
hash = self.class.gemlist(:justme => resource[:name])
- hash[:ensure]
+ hash[:ensure][0]
end
def query
diff --git a/lib/puppet/type/package.rb b/lib/puppet/type/package.rb
index bfd6e42..c7d4316 100644
--- a/lib/puppet/type/package.rb
+++ b/lib/puppet/type/package.rb
@@ -141,16 +141,20 @@ def insync?(is)
end
end
- case is
- when @latest
- return true
- when :present
- # This will only happen on retarded packaging systems
- # that can't query versions.
- return true
- else
- self.debug "#{@resource.name} #{is.inspect} is installed, latest is #{@latest.inspect}"
+ case
+ when is.is_a?(Array) && is.include?(@latest)
+ return true
+ when is == @latest
+ return true
+ when is == :present
+ # This will only happen on retarded packaging systems
+ # that can't query versions.
+ return true
+ else
+ self.debug "#{@resource.name} #{is.inspect} is installed, latest is #{@latest.inspect}"
end
+
+
when :absent
return true if is == :absent or is == :purged
when :purged
diff --git a/spec/unit/provider/package/gem_spec.rb b/spec/unit/provider/package/gem_spec.rb
index 7c3cbde..516e579 100755
--- a/spec/unit/provider/package/gem_spec.rb
+++ b/spec/unit/provider/package/gem_spec.rb
@@ -87,6 +87,21 @@
end
end
+ describe "#latest" do
+ it "should return a single value for 'latest'" do
+ #gemlist is used for retrieving both local and remote version numbers, and there are cases
+ # (particularly local) where it makes sense for it to return an array. That doesn't make
+ # sense for '#latest', though.
+ provider.class.expects(:gemlist).with({ :justme => 'myresource'}).returns({
+ :name => 'myresource',
+ :ensure => ["3.0"],
+ :provider => :gem,
+ })
+ provider.latest.should == "3.0"
+ end
+ end
+
+
describe "#instances" do
before do
provider_class.stubs(:command).with(:gemcmd).returns "/my/gem"
diff --git a/spec/unit/type/package_spec.rb b/spec/unit/type/package_spec.rb
index 921af54..003d1f6 100755
--- a/spec/unit/type/package_spec.rb
+++ b/spec/unit/type/package_spec.rb
@@ -270,6 +270,16 @@ def setprops(properties)
@provider.expects(:install).never
@catalog.apply
end
+
+ describe "when ensure is set to 'latest'" do
+ it "should not install if the value is in the array" do
+ @provider.expects(:latest).returns("3.0")
+ @package[:ensure] = "latest"
+ @package.property(:ensure).insync?(installed_versions).should be_true
+ @provider.expects(:install).never
+ @catalog.apply
+ end
+ end
end
end
end
-- You received this message because you are subscribed to the Google Groups "Puppet Developers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to [email protected].
For more options, visit this group at http://groups.google.com/group/puppet-dev?hl=en.
