class Chef::Provider::Package::Portage
Constants
- PACKAGE_NAME_PATTERN
Public Instance Methods
candidate_version()
click to toggle source
# File lib/chef/provider/package/portage.rb, line 66 def candidate_version return @candidate_version if @candidate_version pkginfo = shell_out("portageq", "best_visible", "/", new_resource.package_name) if pkginfo.exitstatus != 0 pkginfo.stderr.each_line do |line| # cspell:disable-next-line if /[Uu]nqualified atom .*match.* multiple/.match?(line) raise_error_for_query("matched multiple packages (please specify a category):\n#{pkginfo.inspect}") end end if pkginfo.stdout.strip.empty? raise_error_for_query("did not find a matching package:\n#{pkginfo.inspect}") end raise_error_for_query("resulted in an unknown error:\n#{pkginfo.inspect}") end if pkginfo.stdout.lines.count > 1 raise_error_for_query("produced unexpected output (multiple lines):\n#{pkginfo.inspect}") end pkginfo.stdout.chomp! if /-r\d+$/.match?(pkginfo.stdout) # Latest/Best version of the package is a revision (-rX). @candidate_version = pkginfo.stdout.split(/(?<=-)/).last(2).join else # Latest/Best version of the package is NOT a revision (-rX). @candidate_version = pkginfo.stdout.split("-").last end @candidate_version end
install_package(name, version)
click to toggle source
# File lib/chef/provider/package/portage.rb, line 102 def install_package(name, version) pkg = "=#{name}-#{version}" if version =~ /^\~(.+)/ # If we start with a tilde pkg = "~#{name}-#{$1}" end shell_out!( "emerge", "-g", "--color", "n", "--nospinner", "--quiet", options, pkg ) end
load_current_resource()
click to toggle source
# File lib/chef/provider/package/portage.rb, line 33 def load_current_resource @current_resource = Chef::Resource::PortagePackage.new(new_resource.name) current_resource.package_name(new_resource.package_name) category, pkg = PACKAGE_NAME_PATTERN.match(new_resource.package_name)[1, 2] globsafe_category = category ? Chef::Util::PathHelper.escape_glob_dir(category) : nil globsafe_pkg = Chef::Util::PathHelper.escape_glob_dir(pkg) possibilities = Dir["/var/db/pkg/#{globsafe_category || "*"}/#{globsafe_pkg}-*"].map { |d| d.sub(%r{/var/db/pkg/}, "") } versions = possibilities.map do |entry| if entry =~ %r{[^/]+/#{Regexp.escape(pkg)}\-(\d[\.\d]*[a-z]?((_(alpha|beta|pre|rc|p)\d*)*)?(-r\d+)?)} [$&, $1] end end.compact if versions.size > 1 atoms = versions.map(&:first).sort categories = atoms.map { |v| v.split("/")[0] }.uniq if !category && categories.size > 1 raise Chef::Exceptions::Package, "Multiple packages found for #{new_resource.package_name}: #{atoms.join(" ")}. Specify a category." end elsif versions.size == 1 current_resource.version(versions.first.last) logger.trace("#{new_resource} current version #{$1}") end current_resource end
purge_package(name, version)
click to toggle source
# File lib/chef/provider/package/portage.rb, line 127 def purge_package(name, version) remove_package(name, version) end
raise_error_for_query(msg)
click to toggle source
# File lib/chef/provider/package/portage.rb, line 62 def raise_error_for_query(msg) raise Chef::Exceptions::Package, "Query for '#{new_resource.package_name}' #{msg}" end
remove_package(name, version)
click to toggle source
# File lib/chef/provider/package/portage.rb, line 117 def remove_package(name, version) pkg = if version "=#{new_resource.package_name}-#{version}" else new_resource.package_name.to_s end shell_out!( "emerge", "--unmerge", "--color", "n", "--nospinner", "--quiet", options, pkg ) end
upgrade_package(name, version)
click to toggle source
# File lib/chef/provider/package/portage.rb, line 113 def upgrade_package(name, version) install_package(name, version) end