2019-04-19 15:38:03 +09:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2018-06-05 15:39:09 +02:00
|
|
|
require "searchable"
|
2018-10-13 08:22:51 -07:00
|
|
|
require "description_cache_store"
|
2018-06-05 15:39:09 +02:00
|
|
|
|
2018-06-02 20:49:14 +02:00
|
|
|
module Homebrew
|
|
|
|
module Search
|
|
|
|
def query_regexp(query)
|
|
|
|
if m = query.match(%r{^/(.*)/$})
|
|
|
|
Regexp.new(m[1])
|
|
|
|
else
|
2018-06-05 15:39:09 +02:00
|
|
|
query
|
2018-06-02 20:49:14 +02:00
|
|
|
end
|
|
|
|
rescue RegexpError
|
|
|
|
raise "#{query} is not a valid regex."
|
|
|
|
end
|
|
|
|
|
2018-06-18 16:09:13 +02:00
|
|
|
def search_descriptions(string_or_regex)
|
|
|
|
ohai "Formulae"
|
2018-10-13 08:22:51 -07:00
|
|
|
CacheStoreDatabase.use(:descriptions) do |db|
|
|
|
|
cache_store = DescriptionCacheStore.new(db)
|
|
|
|
Descriptions.search(string_or_regex, :desc, cache_store).print
|
|
|
|
end
|
2018-06-18 16:09:13 +02:00
|
|
|
end
|
|
|
|
|
2018-06-02 20:49:14 +02:00
|
|
|
def search_taps(query, silent: false)
|
2018-06-13 07:49:01 +02:00
|
|
|
if query.match?(Regexp.union(HOMEBREW_TAP_FORMULA_REGEX, HOMEBREW_TAP_CASK_REGEX))
|
|
|
|
_, _, query = query.split("/", 3)
|
|
|
|
end
|
|
|
|
|
2018-06-06 13:24:55 +02:00
|
|
|
results = { formulae: [], casks: [] }
|
|
|
|
|
2020-04-05 15:44:50 +01:00
|
|
|
return results if Homebrew::EnvConfig.no_github_api?
|
2018-06-02 20:49:14 +02:00
|
|
|
|
|
|
|
unless silent
|
|
|
|
# Use stderr to avoid breaking parsed output
|
|
|
|
$stderr.puts Formatter.headline("Searching taps on GitHub...", color: :blue)
|
|
|
|
end
|
|
|
|
|
2018-06-06 13:24:55 +02:00
|
|
|
matches = begin
|
|
|
|
GitHub.search_code(
|
2018-11-02 17:18:07 +00:00
|
|
|
user: "Homebrew",
|
|
|
|
path: ["Formula", "Casks", "."],
|
|
|
|
filename: query,
|
2018-06-06 13:24:55 +02:00
|
|
|
extension: "rb",
|
|
|
|
)
|
2019-04-04 19:49:06 +01:00
|
|
|
rescue GitHub::Error => e
|
|
|
|
opoo "Error searching on GitHub: #{e}\n"
|
2018-06-06 13:24:55 +02:00
|
|
|
return results
|
|
|
|
end
|
2018-06-02 20:49:14 +02:00
|
|
|
|
2018-06-06 13:24:55 +02:00
|
|
|
matches.each do |match|
|
2018-06-02 20:49:14 +02:00
|
|
|
name = File.basename(match["path"], ".rb")
|
|
|
|
tap = Tap.fetch(match["repository"]["full_name"])
|
|
|
|
full_name = "#{tap.name}/#{name}"
|
|
|
|
|
2018-06-09 12:20:58 +02:00
|
|
|
next if tap.installed?
|
2018-06-06 13:24:55 +02:00
|
|
|
|
|
|
|
if match["path"].start_with?("Casks/")
|
|
|
|
results[:casks] = [*results[:casks], full_name].sort
|
2018-06-02 20:49:14 +02:00
|
|
|
else
|
2018-06-06 13:24:55 +02:00
|
|
|
results[:formulae] = [*results[:formulae], full_name].sort
|
2018-06-02 20:49:14 +02:00
|
|
|
end
|
|
|
|
end
|
2018-06-06 13:24:55 +02:00
|
|
|
|
|
|
|
results
|
2018-06-02 20:49:14 +02:00
|
|
|
end
|
|
|
|
|
2018-06-05 15:39:09 +02:00
|
|
|
def search_formulae(string_or_regex)
|
2018-06-13 07:49:01 +02:00
|
|
|
if string_or_regex.is_a?(String) && string_or_regex.match?(HOMEBREW_TAP_FORMULA_REGEX)
|
|
|
|
return begin
|
|
|
|
[Formulary.factory(string_or_regex).name]
|
|
|
|
rescue FormulaUnavailableError
|
|
|
|
[]
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-06-02 20:49:14 +02:00
|
|
|
aliases = Formula.alias_full_names
|
2018-06-05 10:55:00 +02:00
|
|
|
results = (Formula.full_names + aliases)
|
2018-06-05 15:39:09 +02:00
|
|
|
.extend(Searchable)
|
|
|
|
.search(string_or_regex)
|
2018-06-05 10:55:00 +02:00
|
|
|
.sort
|
2018-06-02 20:49:14 +02:00
|
|
|
|
|
|
|
results.map do |name|
|
2018-06-07 17:57:26 +02:00
|
|
|
formula, canonical_full_name = begin
|
|
|
|
f = Formulary.factory(name)
|
|
|
|
[f, f.full_name]
|
2018-06-02 20:49:14 +02:00
|
|
|
rescue
|
2018-06-07 17:57:26 +02:00
|
|
|
[nil, name]
|
2018-06-02 20:49:14 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
# Ignore aliases from results when the full name was also found
|
|
|
|
next if aliases.include?(name) && results.include?(canonical_full_name)
|
|
|
|
|
2018-06-07 17:57:26 +02:00
|
|
|
if formula&.any_version_installed?
|
2018-06-02 20:49:14 +02:00
|
|
|
pretty_installed(name)
|
|
|
|
else
|
|
|
|
name
|
|
|
|
end
|
|
|
|
end.compact
|
|
|
|
end
|
2018-06-07 14:42:58 +02:00
|
|
|
|
2018-06-13 07:49:01 +02:00
|
|
|
def search_casks(_string_or_regex)
|
|
|
|
[]
|
2018-06-07 14:42:58 +02:00
|
|
|
end
|
2018-06-02 20:49:14 +02:00
|
|
|
end
|
|
|
|
end
|
2018-06-13 07:49:01 +02:00
|
|
|
|
|
|
|
require "extend/os/search"
|