| 
									
										
										
										
											2020-10-10 14:16:11 +02:00
										 |  |  | # typed: true | 
					
						
							| 
									
										
										
										
											2019-04-19 15:38:03 +09:00
										 |  |  | # frozen_string_literal: true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-05 15:29:01 -07:00
										 |  |  | require "formula" | 
					
						
							| 
									
										
										
										
											2015-09-09 13:55:19 +08:00
										 |  |  | require "formula_versions" | 
					
						
							| 
									
										
										
										
											2018-06-05 10:55:00 +02:00
										 |  |  | require "search" | 
					
						
							| 
									
										
										
										
											2018-06-05 15:39:09 +02:00
										 |  |  | require "searchable" | 
					
						
							| 
									
										
										
										
											2015-05-05 15:29:01 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-14 04:11:34 +02:00
										 |  |  | # Helper class for printing and searching descriptions. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | # @api private | 
					
						
							| 
									
										
										
										
											2015-05-05 15:29:01 -07:00
										 |  |  | class Descriptions | 
					
						
							| 
									
										
										
										
											2018-06-05 10:55:00 +02:00
										 |  |  |   extend Homebrew::Search | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-05 15:29:01 -07:00
										 |  |  |   # Given a regex, find all formulae whose specified fields contain a match. | 
					
						
							| 
									
										
										
										
											2018-10-13 08:22:51 -07:00
										 |  |  |   def self.search(string_or_regex, field, cache_store) | 
					
						
							|  |  |  |     cache_store.populate_if_empty! | 
					
						
							| 
									
										
										
										
											2018-06-05 15:39:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-05 15:29:01 -07:00
										 |  |  |     results = case field | 
					
						
							|  |  |  |     when :name | 
					
						
							| 
									
										
										
										
											2018-10-13 08:22:51 -07:00
										 |  |  |       cache_store.search(string_or_regex) { |name, _| name } | 
					
						
							| 
									
										
										
										
											2015-05-05 15:29:01 -07:00
										 |  |  |     when :desc | 
					
						
							| 
									
										
										
										
											2018-10-13 08:22:51 -07:00
										 |  |  |       cache_store.search(string_or_regex) { |_, desc| desc } | 
					
						
							| 
									
										
										
										
											2015-05-05 15:29:01 -07:00
										 |  |  |     when :either | 
					
						
							| 
									
										
										
										
											2018-10-13 08:22:51 -07:00
										 |  |  |       cache_store.search(string_or_regex) | 
					
						
							| 
									
										
										
										
											2015-05-05 15:29:01 -07:00
										 |  |  |     end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     new(results) | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Create an actual instance. | 
					
						
							|  |  |  |   def initialize(descriptions) | 
					
						
							|  |  |  |     @descriptions = descriptions | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   # Take search results -- a hash mapping formula names to descriptions -- and | 
					
						
							|  |  |  |   # print them. | 
					
						
							|  |  |  |   def print | 
					
						
							| 
									
										
										
										
											2016-08-30 21:38:13 +02:00
										 |  |  |     blank = Formatter.warning("[no description]") | 
					
						
							| 
									
										
										
										
											2016-04-11 17:09:40 -04:00
										 |  |  |     @descriptions.keys.sort.each do |full_name| | 
					
						
							|  |  |  |       short_name = short_names[full_name] | 
					
						
							| 
									
										
										
										
											2018-10-13 08:22:51 -07:00
										 |  |  |       printed_name = if short_name_counts[short_name] == 1
 | 
					
						
							|  |  |  |         short_name | 
					
						
							|  |  |  |       else | 
					
						
							|  |  |  |         full_name | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-04-11 17:09:40 -04:00
										 |  |  |       description = @descriptions[full_name] || blank | 
					
						
							| 
									
										
										
										
											2016-08-26 16:04:47 +02:00
										 |  |  |       puts "#{Tty.bold}#{printed_name}:#{Tty.reset} #{description}" | 
					
						
							| 
									
										
										
										
											2015-05-05 15:29:01 -07:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							| 
									
										
										
										
											2016-04-11 17:09:40 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |   private | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def short_names | 
					
						
							|  |  |  |     @short_names ||= Hash[@descriptions.keys.map { |k| [k, k.split("/").last] }] | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   def short_name_counts | 
					
						
							|  |  |  |     @short_name_counts ||= | 
					
						
							| 
									
										
										
										
											2018-10-13 08:22:51 -07:00
										 |  |  |       short_names.values | 
					
						
							|  |  |  |                  .each_with_object(Hash.new(0)) do |name, counts| | 
					
						
							|  |  |  |         counts[name] += 1
 | 
					
						
							|  |  |  |       end | 
					
						
							| 
									
										
										
										
											2016-04-11 17:09:40 -04:00
										 |  |  |   end | 
					
						
							| 
									
										
										
										
											2015-05-05 15:29:01 -07:00
										 |  |  | end |