summaryrefslogtreecommitdiff
path: root/lib/chef
diff options
context:
space:
mode:
authorTim Smith <tsmith@chef.io>2020-04-20 12:49:00 -0700
committerGitHub <noreply@github.com>2020-04-20 12:49:00 -0700
commitbb7bcf31d4876b2606aba82a75792a950ee3a8a9 (patch)
tree562372490c21d3024a412b848025317830d144b7 /lib/chef
parent9b1744ec6a8eaf2be5aad1b4e3445ea98dd15e03 (diff)
parent3d451d7ff97d2ed999dd7bdf9d26c892df357347 (diff)
downloadchef-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.rb59
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)