From 79439626b5e7564566bdf8736916342e2bb5e1a7 Mon Sep 17 00:00:00 2001 From: Jack Nagel Date: Wed, 11 Jan 2012 20:49:08 -0600 Subject: [PATCH] search: return matches from open pull requests When search can't find any local results, hit the GitHub API and search the titles of pending pull requests. This will help people find the many proposed formulae and prevent them from wasting time duplicating them. Closes Homebrew/homebrew#9018. Signed-off-by: Jack Nagel --- Library/Homebrew/cmd/search.rb | 26 ++++++++++++++++---------- Library/Homebrew/utils.rb | 24 ++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 10 deletions(-) diff --git a/Library/Homebrew/cmd/search.rb b/Library/Homebrew/cmd/search.rb index b4611c0cd4..66ce5d379b 100644 --- a/Library/Homebrew/cmd/search.rb +++ b/Library/Homebrew/cmd/search.rb @@ -9,7 +9,13 @@ module Homebrew extend self exec "open", "http://pdb.finkproject.org/pdb/browse.php?summary=#{ARGV.next}" else query = ARGV.first - search_results = search_brews query + rx = if query =~ %r{^/(.*)/$} + Regexp.new($1) + else + /.*#{Regexp.escape query}.*/i + end + + search_results = search_brews rx puts_columns search_results if not query.to_s.empty? and $stdout.tty? and msg = blacklisted?(query) @@ -20,19 +26,20 @@ module Homebrew extend self end puts msg end + + if search_results.empty? and not blacklisted? query + pulls = GitHub.find_pull_requests rx + unless pulls.empty? + puts "Open pull requests matching \"#{query}\":", *pulls.map { |p| " #{p}" } + end + end end end - def search_brews text - if text.to_s.empty? + def search_brews rx + if rx.to_s.empty? Formula.names else - rx = if text =~ %r{^/(.*)/$} - Regexp.new($1) - else - /.*#{Regexp.escape text}.*/i - end - aliases = Formula.aliases results = (Formula.names+aliases).grep rx @@ -45,5 +52,4 @@ module Homebrew extend self end end end - end diff --git a/Library/Homebrew/utils.rb b/Library/Homebrew/utils.rb index 97fa46f7b8..71417e61a2 100644 --- a/Library/Homebrew/utils.rb +++ b/Library/Homebrew/utils.rb @@ -427,4 +427,28 @@ module GitHub extend self rescue [] end + + def find_pull_requests rx + require 'open-uri' + require 'vendor/multi_json' + + pulls = [] + uri = URI.parse("https://api.github.com/repos/mxcl/homebrew/pulls") + uri.query = "per_page=100" + + open uri do |f| + MultiJson.decode((f.read)).each do |pull| + pulls << pull['html_url'] if rx.match pull['title'] + end + + uri = if f.meta['link'] =~ /rel="next"/ + f.meta['link'].slice(URI.regexp) + else + nil + end + end while uri + pulls + rescue + [] + end end