diff options
author | Steven Murawski <steven.murawski@gmail.com> | 2017-04-27 11:08:43 -0500 |
---|---|---|
committer | Steven Murawski <steven.murawski@gmail.com> | 2017-05-08 18:03:59 -0500 |
commit | 9ccfafa0a3f4dfc26e1ed866e5cf51b9527c7863 (patch) | |
tree | dcf9d486cc56ebaee1ae6b8ca38391314f1a3bae | |
parent | 0ad389f48d43ebfc4347c41a3573ee855993c5f1 (diff) | |
download | chef-9ccfafa0a3f4dfc26e1ed866e5cf51b9527c7863.tar.gz |
Make the cab compare on name and version, not just name. The new servicing model with package rollups all share the same name, so we need to differentiate on version.
Signed-off-by: Steven Murawski <steven.murawski@gmail.com>
-rw-r--r-- | lib/chef/provider/package/cab.rb | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/lib/chef/provider/package/cab.rb b/lib/chef/provider/package/cab.rb index 3a8cc507f9..21ea95b85e 100644 --- a/lib/chef/provider/package/cab.rb +++ b/lib/chef/provider/package/cab.rb @@ -81,34 +81,39 @@ class Chef end def installed_version - stdout = dism_command("/Get-PackageInfo /PackagePath:\"#{cab_file_source}\"").stdout - package_info = parse_dism_get_package_info(stdout) # e.g. Package_for_KB2975719~31bf3856ad364e35~amd64~~6.3.1.8 - package = split_package_identity(package_info["package_information"]["package_identity"]) + package = new_cab_identity # Search for just the package name to catch a different version being installed Chef::Log.debug("#{new_resource} searching for installed package #{package['name']}") - found_packages = installed_packages.select { |p| p["package_identity"] =~ /^#{package['name']}~/ } + existing_package_identities = installed_packages.map do |p| + split_package_identity(p["package_identity"]) + end + found_packages = existing_package_identities.select do |existing_package_ident| + existing_package_ident["name"] == package["name"] + end if found_packages.empty? nil elsif found_packages.length == 1 - stdout = dism_command("/Get-PackageInfo /PackageName:\"#{found_packages.first['package_identity']}\"").stdout - find_version(stdout) + found_packages.first["version"] else # Presuming this won't happen, otherwise we need to handle it raise Chef::Exceptions::Package, "Found multiple packages installed matching name #{package['name']}, found: #{found_packages.length} matches" end end - def package_version - Chef::Log.debug("#{new_resource} getting product version for package at #{cab_file_source}") + def cab_identity_from_cab_file stdout = dism_command("/Get-PackageInfo /PackagePath:\"#{cab_file_source}\"").stdout - find_version(stdout) + package_info = parse_dism_get_package_info(stdout) + split_package_identity(package_info["package_information"]["package_identity"]) end - def find_version(stdout) - package_info = parse_dism_get_package_info(stdout) - package = split_package_identity(package_info["package_information"]["package_identity"]) - package["version"] + def new_cab_identity + Chef::Log.debug("#{new_resource} getting product version for package at #{cab_file_source}") + @new_cab_identity ||= cab_identity_from_cab_file + end + + def package_version + new_cab_identity["version"].chomp end # returns a hash of package state information given the output of dism /get-packages |