# File lib/puppet/provider/package/portage.rb, line 73
 73:   def query
 74:     result_format = /^(\S+)\s+(\S+)\s+\[(\S*)\]\s+\[(\S+)\]\s+(\S+)\s+(.*)$/
 75:     result_fields = [:category, :name, :ensure, :version_available, :vendor, :description]
 76: 
 77:     version_format = "{last}<version>{}"
 78:     search_format = "<category> <name> [<installedversions:LASTVERSION>] [<bestversion:LASTVERSION>] <homepage> <description>\n"
 79: 
 80:     search_field = package_name.count('/') > 0 ? "--category-name" : "--name"
 81:     search_value = package_name
 82: 
 83:     begin
 84:       update_eix if !FileUtils.uptodate?("/var/cache/eix", %w{/usr/bin/eix /usr/portage/metadata/timestamp})
 85: 
 86:       search_output = nil
 87:       Puppet::Util::Execution.withenv :LASTVERSION => version_format do
 88:         search_output = eix "--nocolor", "--pure-packages", "--stable", "--format", search_format, "--exact", search_field, search_value
 89:       end
 90: 
 91:       packages = []
 92:       search_output.each do |search_result|
 93:         match = result_format.match(search_result)
 94: 
 95:         if match
 96:           package = {}
 97:           result_fields.zip(match.captures) do |field, value|
 98:             package[field] = value unless !value or value.empty?
 99:           end
100:           package[:ensure] = package[:ensure] ? package[:ensure] : :absent
101:           packages << package
102:         end
103:       end
104: 
105:       case packages.size
106:         when 0
107:           not_found_value = "#{@resource[:category] ? @resource[:category] : "<unspecified category>"}/#{@resource[:name]}"
108:           raise Puppet::Error.new("No package found with the specified name [#{not_found_value}]")
109:         when 1
110:           return packages[0]
111:         else
112:           raise Puppet::Error.new("More than one package with the specified name [#{search_value}], please use the category parameter to disambiguate")
113:       end
114:     rescue Puppet::ExecutionFailure => detail
115:       raise Puppet::Error.new(detail)
116:     end
117:   end