diff options
author | Tim Smith <tsmith@chef.io> | 2020-04-20 12:49:00 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-20 12:49:00 -0700 |
commit | bb7bcf31d4876b2606aba82a75792a950ee3a8a9 (patch) | |
tree | 562372490c21d3024a412b848025317830d144b7 /lib/chef | |
parent | 9b1744ec6a8eaf2be5aad1b4e3445ea98dd15e03 (diff) | |
parent | 3d451d7ff97d2ed999dd7bdf9d26c892df357347 (diff) | |
download | chef-bb7bcf31d4876b2606aba82a75792a950ee3a8a9.tar.gz |
Merge pull request #9694 from chef/pacman_multipackage
Add multipackage support to pacman package resource
Diffstat (limited to 'lib/chef')
-rw-r--r-- | lib/chef/provider/package/pacman.rb | 59 |
1 files changed, 25 insertions, 34 deletions
diff --git a/lib/chef/provider/package/pacman.rb b/lib/chef/provider/package/pacman.rb index a3b2d75846..2de2d12579 100644 --- a/lib/chef/provider/package/pacman.rb +++ b/lib/chef/provider/package/pacman.rb @@ -27,29 +27,13 @@ class Chef provides :package, platform: "arch" provides :pacman_package + use_multipackage_api + allow_nils + def load_current_resource @current_resource = Chef::Resource::Package.new(new_resource.name) current_resource.package_name(new_resource.package_name) - - logger.trace("#{new_resource} checking pacman for #{new_resource.package_name}") - status = shell_out("pacman", "-Qi", new_resource.package_name) - status.stdout.each_line do |line| - case line - when /^Version(\s?)*: (.+)$/ - logger.trace("#{new_resource} current version is #{$2}") - current_resource.version($2) - end - end - - unless status.exitstatus == 0 || status.exitstatus == 1 - raise Chef::Exceptions::Package, "pacman failed - #{status.inspect}!" - end - - current_resource - end - - def candidate_version - return @candidate_version if @candidate_version + current_resource.version = [] repos = %w{extra core community} @@ -58,31 +42,38 @@ class Chef repos = pacman.scan(/\[(.+)\]/).flatten end - package_repos = repos.map { |r| Regexp.escape(r) }.join("|") - + repos = Regexp.union(repos) status = shell_out("pacman", "-Sl") - status.stdout.each_line do |line| - case line - when /^(#{package_repos}) #{Regexp.escape(new_resource.package_name)} (.+)$/ - # $2 contains a string like "4.4.0-1" or "3.10-4 [installed]" - # simply split by space and use first token - @candidate_version = $2.split(" ").first - end - end unless status.exitstatus == 0 || status.exitstatus == 1 raise Chef::Exceptions::Package, "pacman failed - #{status.inspect}!" end - unless @candidate_version - raise Chef::Exceptions::Package, "pacman does not have a version of package #{new_resource.package_name}" + pkg_db_data = status.stdout + @candidate_version = [] + package_name_array.each do |pkg| + pkg_data = pkg_db_data.match(/(#{repos}) #{pkg} (?<candidate>.*?-[0-9]+)(?<installed> \[.*?( (?<current>.*?-[0-9]+))?\])?\n/m) + unless pkg_data + raise Chef::Exceptions::Package, "pacman does not have a version of package #{pkg}" + end + + @candidate_version << pkg_data[:candidate] + if pkg_data[:installed] + current_resource.version << (pkg_data[:current] || pkg_data[:candidate]) + else + current_resource.version << nil + end end + current_resource + end + + def candidate_version @candidate_version end def install_package(name, version) - shell_out!( "pacman", "--sync", "--noconfirm", "--noprogressbar", options, name) + shell_out!("pacman", "--sync", "--noconfirm", "--noprogressbar", options, *name) end def upgrade_package(name, version) @@ -90,7 +81,7 @@ class Chef end def remove_package(name, version) - shell_out!( "pacman", "--remove", "--noconfirm", "--noprogressbar", options, name ) + shell_out!("pacman", "--remove", "--noconfirm", "--noprogressbar", options, *name) end def purge_package(name, version) |