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