Files

Class/Module Index [+]

Quicksearch

Chef::Provider::Package::Portage

Public Instance Methods

candidate_version() click to toggle source
# File lib/chef/provider/package/portage.rb, line 90
def candidate_version
  return @candidate_version if @candidate_version

  status = popen4("emerge --color n --nospinner --search #{@new_resource.package_name.split('/').last}") do |pid, stdin, stdout, stderr|
    available, installed = parse_emerge(@new_resource.package_name, stdout.read)
    @candidate_version = available
  end

  unless status.exitstatus == 0
    raise Chef::Exceptions::Package, "emerge --search failed - #{status.inspect}!"
  end

  @candidate_version

end
install_package(name, version) click to toggle source
# File lib/chef/provider/package/portage.rb, line 107
def install_package(name, version)
  pkg = "=#{name}-#{version}"

  if(version =~ /^\~(.+)/)
    # If we start with a tilde
    pkg = "~#{name}-#{$1}"
  end

  run_command_with_systems_locale(
    :command => "emerge -g --color n --nospinner --quiet#{expand_options(@new_resource.options)} #{pkg}"
  )
end
load_current_resource() click to toggle source
# File lib/chef/provider/package/portage.rb, line 29
def load_current_resource
  @current_resource = Chef::Resource::Package.new(@new_resource.name)
  @current_resource.package_name(@new_resource.package_name)

  @current_resource.version(nil)

  category, pkg = %{^#{PACKAGE_NAME_PATTERN}$}.match(@new_resource.package_name)[1,2]

  possibilities = Dir["/var/db/pkg/#{category || "*"}/#{pkg}-*"].map {|d| d.sub(%{/var/db/pkg/}, "") }
  versions = possibilities.map do |entry|
    if(entry =~ %{[^/]+/#{Regexp.escape(pkg)}\-(\d[\.\d]*((_(alpha|beta|pre|rc|p)\d*)*)?(-r\d+)?)})
      [$&, $1]
    end
  end.compact

  if versions.size > 1
    atoms = versions.map {|v| v.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)
    Chef::Log.debug("#{@new_resource} current version #{$1}")
  end

  @current_resource
end
parse_emerge(package, txt) click to toggle source
# File lib/chef/provider/package/portage.rb, line 59
def parse_emerge(package, txt)
  availables = {}
  found_package_name = nil

  txt.each_line do |line|
    if line =~ /\*\s+#{PACKAGE_NAME_PATTERN}/
      found_package_name = $&.gsub(/\*/, '').strip
      if package =~ /\// #the category is specified
        if found_package_name == package
          availables[found_package_name] = nil
        end
      else #the category is not specified
        if found_package_name.split("/").last == package
          availables[found_package_name] = nil
        end
      end
    end

    if line =~ /Latest version available: (.*)/ && availables.has_key?(found_package_name)
      availables[found_package_name] = $1.strip
    end
  end

  if availables.size > 1
    # shouldn't happen if a category is specified so just use `package`
    raise Chef::Exceptions::Package, "Multiple emerge results found for #{package}: #{availables.keys.join(" ")}. Specify a category."
  end

  availables.values.first
end
purge_package(name, version) click to toggle source
# File lib/chef/provider/package/portage.rb, line 136
def purge_package(name, version)
  remove_package(name, version)
end
remove_package(name, version) click to toggle source
# File lib/chef/provider/package/portage.rb, line 124
def remove_package(name, version)
  if(version)
    pkg = "=#{@new_resource.package_name}-#{version}"
  else
    pkg = "#{@new_resource.package_name}"
  end

  run_command_with_systems_locale(
    :command => "emerge --unmerge --color n --nospinner --quiet#{expand_options(@new_resource.options)} #{pkg}"
  )
end
upgrade_package(name, version) click to toggle source
# File lib/chef/provider/package/portage.rb, line 120
def upgrade_package(name, version)
  install_package(name, version)
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.