summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Wrock <matt@mattwrock.com>2016-01-13 14:44:24 -0800
committerMatt Wrock <matt@mattwrock.com>2016-01-14 12:14:22 -0800
commit1d26aaa3c2eb663b002f144568017a6aa1925013 (patch)
treee27dd213e60334fbf7a1a56945b93e3264ccdde5
parentdc62c8d52b83adbb2be402bb246794d23d404fd1 (diff)
downloadchef-1d26aaa3c2eb663b002f144568017a6aa1925013.tar.gz
fix candidate version filtering
-rw-r--r--lib/chef/provider/package/chocolatey.rb33
-rw-r--r--spec/functional/resource/chocolatey_package_spec.rb38
2 files changed, 54 insertions, 17 deletions
diff --git a/lib/chef/provider/package/chocolatey.rb b/lib/chef/provider/package/chocolatey.rb
index 55ac304a79..3bf2ced297 100644
--- a/lib/chef/provider/package/chocolatey.rb
+++ b/lib/chef/provider/package/chocolatey.rb
@@ -66,7 +66,7 @@ class Chef
# @param names [Array<String>] array of package names to install
# @param versions [Array<String>] array of versions to install
def install_package(names, versions)
- name_versions_to_install = desired_name_versions.select { |n, v| names.include?(n) }
+ name_versions_to_install = desired_name_versions.select { |n, v| lowercase_names(names).include?(n) }
name_nil_versions = name_versions_to_install.select { |n,v| v.nil? }
name_has_versions = name_versions_to_install.reject { |n,v| v.nil? }
@@ -88,7 +88,7 @@ class Chef
# @param names [Array<String>] array of package names to install
# @param versions [Array<String>] array of versions to install
def upgrade_package(names, versions)
- name_versions_to_install = desired_name_versions.select { |n, v| names.include?(n) }
+ name_versions_to_install = desired_name_versions.select { |n, v| lowercase_names(names).include?(n) }
name_nil_versions = name_versions_to_install.select { |n,v| v.nil? }
name_has_versions = name_versions_to_install.reject { |n,v| v.nil? }
@@ -181,7 +181,7 @@ class Chef
# @return [Hash] Mapping of requested names to versions
def desired_name_versions
desired_versions = new_resource.version || new_resource.package_name.map { nil }
- Hash[*new_resource.package_name.zip(desired_versions).flatten]
+ Hash[*lowercase_names(new_resource.package_name).zip(desired_versions).flatten]
end
# Helper to construct optional args out of new_resource
@@ -213,8 +213,11 @@ class Chef
begin
cmd = [ "list -ar #{package_name_array.join ' '}" ]
cmd.push( "-source #{new_resource.source}" ) if new_resource.source
- parse_list_output(*cmd).reject do |name,version|
- desired_name_versions[name] && desired_name_versions[name] != version
+ parse_list_output(*cmd).each_with_object({}) do |name_version, available|
+ name, version = name_version
+ if desired_name_versions[name].nil? || desired_name_versions[name] == version
+ available[name] = version
+ end
end
end
end
@@ -224,21 +227,29 @@ class Chef
#
# @return [Hash] name-to-version mapping of installed packages
def installed_packages
- @installed_packages ||= parse_list_output("list -l -r")
+ @installed_packages ||= Hash[*parse_list_output("list -l -r").flatten]
end
# Helper to convert choco.exe list output to a Hash
# (names are downcased for case-insenstive matching)
#
# @param cmd [String] command to run
- # @return [String] list output converted to ruby Hash
+ # @return [Array] list output converted to ruby Hash
def parse_list_output(*args)
- hash = {}
+ list = []
choco_command(*args).stdout.each_line do |line|
- name, version = line.split("|")
- hash[name.downcase] = version.chomp
+ name, version = line.split('|')
+ list << [ name.downcase, version.chomp ]
end
- hash
+ list
+ end
+
+ # Helper to downcase all names in an array
+ #
+ # @param names [Array] original mixed case names
+ # @return [Array] same names in lower case
+ def lowercase_names(names)
+ names.map { |name| name.downcase }
end
end
end
diff --git a/spec/functional/resource/chocolatey_package_spec.rb b/spec/functional/resource/chocolatey_package_spec.rb
index c180f8a938..ad9025420b 100644
--- a/spec/functional/resource/chocolatey_package_spec.rb
+++ b/spec/functional/resource/chocolatey_package_spec.rb
@@ -75,13 +75,39 @@ describe Chef::Resource::ChocolateyPackage, :windows_only do
end
end
- context 'installing a bogus package' do
- let(:package_name) { 'blah' }
- let(:package_source) { nil }
+ it 'raises if package is not found' do
+ subject.package_name 'blah'
+ expect{ subject.run_action(:install) }.to raise_error Chef::Exceptions::Package
+ end
- it 'raises if package is not found' do
- expect{ subject.run_action(:install) }.to raise_error Chef::Exceptions::Package
- end
+ it 'raises if package version is not found' do
+ subject.version '3.0'
+ expect{ subject.run_action(:install) }.to raise_error Chef::Exceptions::Package
+ end
+ end
+
+ context 'upgrading a package' do
+ after { Chef::Resource::ChocolateyPackage.new(package_name, run_context).run_action(:remove) }
+
+ it 'upgrades to a specific version' do
+ subject.version '1.0'
+ subject.run_action(:install)
+ expect(package_list.call).to eq("#{package_name}|1.0")
+
+ subject.version '1.5'
+ subject.run_action(:upgrade)
+ expect(package_list.call).to eq("#{package_name}|1.5")
+ end
+
+ it 'upgrades to the latest version if no version given' do
+ subject.version '1.0'
+ subject.run_action(:install)
+ expect(package_list.call).to eq("#{package_name}|1.0")
+
+ subject2 = Chef::Resource::ChocolateyPackage.new('test-A', run_context)
+ subject2.source package_source
+ subject2.run_action(:upgrade)
+ expect(package_list.call).to eq("#{package_name}|2.0")
end
end