Module: Homebrew::Search Private

Included in:
Cask::Cmd::AbstractCommand, Descriptions, Homebrew
Defined in:
Library/Homebrew/search.rb,
Library/Homebrew/extend/os/mac/search.rb

Overview

This module is part of a private API. You should avoid using this module if possible, as it may be removed or be changed in the future.

Helper module for searching formulae or casks.

Defined Under Namespace

Modules: Extension

Instance Method Summary collapse

Instance Method Details

#query_regexp(query) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


12
13
14
15
16
17
18
19
20
# File 'Library/Homebrew/search.rb', line 12

def query_regexp(query)
  if m = query.match(%r{^/(.*)/$})
    Regexp.new(m[1])
  else
    query
  end
rescue RegexpError
  raise "#{query} is not a valid regex."
end

#search_casks(_string_or_regex) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


107
108
109
# File 'Library/Homebrew/search.rb', line 107

def search_casks(_string_or_regex)
  []
end

#search_descriptions(string_or_regex) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


22
23
24
25
26
27
28
# File 'Library/Homebrew/search.rb', line 22

def search_descriptions(string_or_regex)
  ohai "Formulae"
  CacheStoreDatabase.use(:descriptions) do |db|
    cache_store = DescriptionCacheStore.new(db)
    Descriptions.search(string_or_regex, :desc, cache_store).print
  end
end

#search_formulae(string_or_regex) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'Library/Homebrew/search.rb', line 73

def search_formulae(string_or_regex)
  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

  aliases = Formula.alias_full_names
  results = (Formula.full_names + aliases)
            .extend(Searchable)
            .search(string_or_regex)
            .sort

  results.map do |name|
    formula, canonical_full_name = begin
      f = Formulary.factory(name)
      [f, f.full_name]
    rescue
      [nil, name]
    end

    # Ignore aliases from results when the full name was also found
    next if aliases.include?(name) && results.include?(canonical_full_name)

    if formula&.any_version_installed?
      pretty_installed(name)
    else
      name
    end
  end.compact
end

#search_taps(query, silent: false) ⇒ Object

This method is part of a private API. You should avoid using this method if possible, as it may be removed or be changed in the future.


30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# File 'Library/Homebrew/search.rb', line 30

def search_taps(query, silent: false)
  if query.match?(Regexp.union(HOMEBREW_TAP_FORMULA_REGEX, HOMEBREW_TAP_CASK_REGEX))
    _, _, query = query.split("/", 3)
  end

  results = { formulae: [], casks: [] }

  return results if Homebrew::EnvConfig.no_github_api?

  unless silent
    # Use stderr to avoid breaking parsed output
    $stderr.puts Formatter.headline("Searching taps on GitHub...", color: :blue)
  end

  matches = begin
    GitHub.search_code(
      user:      "Homebrew",
      path:      ["Formula", "Casks", "."],
      filename:  query,
      extension: "rb",
    )
  rescue GitHub::Error => e
    opoo "Error searching on GitHub: #{e}\n"
    return results
  end

  matches.each do |match|
    name = File.basename(match["path"], ".rb")
    tap = Tap.fetch(match["repository"]["full_name"])
    full_name = "#{tap.name}/#{name}"

    next if tap.installed?

    if match["path"].start_with?("Casks/")
      results[:casks] = [*results[:casks], full_name].sort
    else
      results[:formulae] = [*results[:formulae], full_name].sort
    end
  end

  results
end