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