diff --git a/Library/Homebrew/cmd/search.rb b/Library/Homebrew/cmd/search.rb index aa80ec5895b600f807c224e0559d819a51fd8400..5342b23b6eda1795f34b77ebe53eac3a16768770 100644 --- a/Library/Homebrew/cmd/search.rb +++ b/Library/Homebrew/cmd/search.rb @@ -40,8 +40,8 @@ module Homebrew exec_browser "http://packages.ubuntu.com/search?keywords=#{ARGV.next}&searchon=names&suite=all§ion=all" elsif ARGV.include? "--desc" query = ARGV.next - rx = query_regexp(query) - Descriptions.search(rx, :desc).print + regex = query_regexp(query) + Descriptions.search(regex, :desc).print elsif ARGV.first =~ HOMEBREW_TAP_FORMULA_REGEX query = ARGV.first user, repo, name = query.split("/", 3) @@ -55,10 +55,10 @@ module Homebrew puts_columns Array(result) else query = ARGV.first - rx = query_regexp(query) - local_results = search_formulae(rx) + regex = query_regexp(query) + local_results = search_formulae(regex) puts_columns(local_results) - tap_results = search_taps(rx) + tap_results = search_taps(regex) puts_columns(tap_results) if $stdout.tty? @@ -112,15 +112,17 @@ module Homebrew odie "#{query} is not a valid regex" end - def search_taps(rx) + def search_taps(regex_or_string) SEARCHABLE_TAPS.map do |user, repo| - Thread.new { search_tap(user, repo, rx) } + Thread.new { search_tap(user, repo, regex_or_string) } end.inject([]) do |results, t| results.concat(t.value) end end - def search_tap(user, repo, rx) + def search_tap(user, repo, regex_or_string) + regex = regex_or_string.is_a?(String) ? /^#{Regexp.escape(regex_or_string)}$/ : regex_or_string + if (HOMEBREW_LIBRARY/"Taps/#{user.downcase}/homebrew-#{repo.downcase}").directory? && \ user != "Caskroom" return [] @@ -150,7 +152,7 @@ module Homebrew names = remote_tap_formulae["#{user}/#{repo}"] user = user.downcase if user == "Homebrew" # special handling for the Homebrew organization - names.select { |name| name =~ rx }.map { |name| "#{user}/#{repo}/#{name}" } + names.select { |name| name =~ regex }.map { |name| "#{user}/#{repo}/#{name}" } rescue GitHub::HTTPNotFoundError opoo "Failed to search tap: #{user}/#{repo}. Please run `brew update`" [] @@ -159,9 +161,9 @@ module Homebrew [] end - def search_formulae(rx) + def search_formulae(regex) aliases = Formula.alias_full_names - results = (Formula.full_names+aliases).grep(rx).sort + results = (Formula.full_names+aliases).grep(regex).sort results.map do |name| begin diff --git a/Library/Homebrew/test/test_search_remote_tap.rb b/Library/Homebrew/test/test_search_remote_tap.rb new file mode 100644 index 0000000000000000000000000000000000000000..9dd9ee6544413d67de0cd3d75824229a941896a4 --- /dev/null +++ b/Library/Homebrew/test/test_search_remote_tap.rb @@ -0,0 +1,19 @@ +require "testing_env" +require "cmd/search" + +class SearchRemoteTapTests < Homebrew::TestCase + def test_search_remote_tap + json_response = { + "tree" => [ + { + "path" => "Formula/not-a-formula.rb", + "type" => "blob", + }, + ], + } + + GitHub.stubs(:open).yields(json_response) + + assert_equal ["homebrew/not-a-tap/not-a-formula"], Homebrew.search_tap("homebrew", "not-a-tap", "not-a-formula") + end +end