class Gem::Commands::QueryCommand

def output_query_results(spec_tuples)

def output_query_results(spec_tuples)
  output = []
  versions = Hash.new { |h,name| h[name] = [] }
  spec_tuples.each do |spec_tuple, source|
    versions[spec_tuple.name] << [spec_tuple, source]
  end
  versions = versions.sort_by do |(n,_),_|
    n.downcase
  end
  versions.each do |gem_name, matching_tuples|
    matching_tuples = matching_tuples.sort_by { |n,_| n.version }.reverse
    platforms = Hash.new { |h,version| h[version] = [] }
    matching_tuples.map do |n,_|
      platforms[n.version] << n.platform if n.platform
    end
    seen = {}
    matching_tuples.delete_if do |n,_|
      if seen[n.version] then
        true
      else
        seen[n.version] = true
        false
      end
    end
    entry = gem_name.dup
    if options[:versions] then
      list = if platforms.empty? or options[:details] then
               matching_tuples.map { |n,_| n.version }.uniq
             else
               platforms.sort.reverse.map do |version, pls|
                 if pls == [Gem::Platform::RUBY] then
                   version
                 else
                   ruby = pls.delete Gem::Platform::RUBY
                   platform_list = [ruby, *pls.sort].compact
                   "#{version} #{platform_list.join ' '}"
                 end
               end
             end.join ', '
      entry << " (#{list})"
    end
    if options[:details] then
      detail_tuple = matching_tuples.first
      spec = detail_tuple.last
      unless spec.kind_of? Gem::Specification
        spec = spec.fetch_spec detail_tuple.first
      end
      entry << "\n"
      non_ruby = platforms.any? do |_, pls|
        pls.any? { |pl| pl != Gem::Platform::RUBY }
      end
      if non_ruby then
        if platforms.length == 1 then
          title = platforms.values.length == 1 ? 'Platform' : 'Platforms'
          entry << "    #{title}: #{platforms.values.sort.join ', '}\n"
        else
          entry << "    Platforms:\n"
          platforms.sort_by do |version,|
            version
          end.each do |version, pls|
            label = "        #{version}: "
            data = format_text pls.sort.join(', '), 68, label.length
            data[0, label.length] = label
            entry << data << "\n"
          end
        end
      end
      authors = "Author#{spec.authors.length > 1 ? 's' : ''}: "
      authors << spec.authors.join(', ')
      entry << format_text(authors, 68, 4)
      if spec.rubyforge_project and not spec.rubyforge_project.empty? then
        rubyforge = "Rubyforge: http://rubyforge.org/projects/#{spec.rubyforge_project}"
        entry << "\n" << format_text(rubyforge, 68, 4)
      end
      if spec.homepage and not spec.homepage.empty? then
        entry << "\n" << format_text("Homepage: #{spec.homepage}", 68, 4)
      end
      if spec.license and not spec.license.empty? then
        licenses = "License#{spec.licenses.length > 1 ? 's' : ''}: "
        licenses << spec.licenses.join(', ')
        entry << "\n" << format_text(licenses, 68, 4)
      end
      if spec.loaded_from then
        if matching_tuples.length == 1 then
          loaded_from = File.dirname File.dirname(spec.loaded_from)
          entry << "\n" << "    Installed at: #{loaded_from}"
        else
          label = 'Installed at'
          matching_tuples.each do |n,s|
            loaded_from = File.dirname File.dirname(s.loaded_from)
            entry << "\n" << "    #{label} (#{n.version}): #{loaded_from}"
            label = ' ' * label.length
          end
        end
      end
      entry << "\n\n" << format_text(spec.summary, 68, 4)
    end
    output << entry
  end
  say output.join(options[:details] ? "\n\n" : "\n")
end