diff --git a/Library/Homebrew/cmd/search.rb b/Library/Homebrew/cmd/search.rb index 942a14c7cb1e5797c5a324cfef082bb01efc7bbc..bcb66f362ffd97aa1d8d9a7437acc9a12c2d067a 100644 --- a/Library/Homebrew/cmd/search.rb +++ b/Library/Homebrew/cmd/search.rb @@ -108,36 +108,36 @@ module Homebrew return [] end - results = [] - tree = {} + @@remote_tap_formulae ||= Hash.new do |cache, key| + user, repo = key.split("/", 2) + tree = {} - GitHub.open "https://api.github.com/repos/#{user}/homebrew-#{repo}/git/trees/HEAD?recursive=1" do |json| - user = user.downcase if user == "Homebrew" # special handling for the Homebrew organization - json["tree"].each do |object| - next unless object["type"] == "blob" + GitHub.open "https://api.github.com/repos/#{user}/homebrew-#{repo}/git/trees/HEAD?recursive=1" do |json| + json["tree"].each do |object| + next unless object["type"] == "blob" - subtree, file = File.split(object["path"]) + subtree, file = File.split(object["path"]) - if File.extname(file) == ".rb" - tree[subtree] ||= [] - tree[subtree] << file + if File.extname(file) == ".rb" + tree[subtree] ||= [] + tree[subtree] << file + end end end - end - paths = tree["Formula"] || tree["HomebrewFormula"] || tree["Casks"] || tree["."] || [] - paths.each do |path| - name = File.basename(path, ".rb") - results << "#{user}/#{repo}/#{name}" if rx === name + paths = tree["Formula"] || tree["HomebrewFormula"] || tree["Casks"] || tree["."] || [] + cache[key] = paths.map { |path| File.basename(path, ".rb") } end + + names = @@remote_tap_formulae["#{user}/#{repo}"] + user = user.downcase if user == "Homebrew" # special handling for the Homebrew organization + names.select { |name| rx === name }.map { |name| "#{user}/#{repo}/#{name}" } rescue GitHub::HTTPNotFoundError => e opoo "Failed to search tap: #{user}/#{repo}. Please run `brew update`" [] rescue GitHub::Error => e SEARCH_ERROR_QUEUE << e [] - else - results end def search_formulae rx