From 9b755e5ad2638ef792a0ee20670de79fe9e878e2 Mon Sep 17 00:00:00 2001 From: Samuel John Date: Tue, 29 Jan 2013 23:34:55 +0100 Subject: [PATCH] brew search / [substring] For example `brew search homebrew/science` to get a list of all formulae from that tap, even if not yet tapped. `brew search //` or `brew search / ` to grep for `` inside of the tap `/`. --- Library/Contributions/manpages/brew.1.md | 18 ++++++++++++++---- Library/Homebrew/cmd/search.rb | 23 +++++++++++++++++++++++ share/man/man1/brew.1 | 16 ++++++++++++---- 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/Library/Contributions/manpages/brew.1.md b/Library/Contributions/manpages/brew.1.md index 723d945a0e..0e3c11584e 100644 --- a/Library/Contributions/manpages/brew.1.md +++ b/Library/Contributions/manpages/brew.1.md @@ -30,10 +30,11 @@ Note that these flags should only appear after a command. * `list`: List all installed formulae. - * `search`, `-S` |//: + * `search` |//: Perform a substring search of formula names for . If is surrounded with slashes, then it is interpreted as a regular expression. - If no search term is given, all available formula are displayed. + The search for is extended online to some popular taps. + If no search term is given, all locally available formulae are listed. ## COMMANDS @@ -272,10 +273,19 @@ Note that these flags should only appear after a command. If `--force` is passed, and there are multiple versions of installed, delete all installed versions. - * `search`, `-S` |//: + * `search`, `-S`: + Display all locally available formulae for brewing (including tapped ones). + No online search is performed if called without arguments. + + * `search`, `-S` : + Display all formulae in a , even if not yet tapped. + is of the form /, e.g. `brew search homebrew/dupes`. + + * `search`, `-S` [] |//: Perform a substring search of formula names for . If is surrounded with slashes, then it is interpreted as a regular expression. - If no search term is given, all available formula are displayed. + The search for is extended online to some popular taps. + If a is specified, the search is restricted to it. * `search --debian`|`--fedora`|`--fink`|`--macports`|`--opensuse`|`--ubuntu` : Search for in the given package manager's list. diff --git a/Library/Homebrew/cmd/search.rb b/Library/Homebrew/cmd/search.rb index f18f21ca31..b2febbdba0 100644 --- a/Library/Homebrew/cmd/search.rb +++ b/Library/Homebrew/cmd/search.rb @@ -4,6 +4,12 @@ require 'utils' require 'utils/json' module Homebrew extend self + + # A regular expession to capture the username (one or more char but no `/`, + # which has to be escaped like `\/`), repository, followed by an optional `/` + # and an optional query. + TAP_QUERY_REGEX = /^([^\/]+)\/([^\/]+)\/?(.+)?$/ + def search if ARGV.include? '--macports' exec_browser "http://www.macports.org/ports.php?by=name&substr=#{ARGV.next}" @@ -19,6 +25,23 @@ module Homebrew extend self exec_browser "http://packages.ubuntu.com/search?keywords=#{ARGV.next}&searchon=names&suite=all§ion=all" elsif (query = ARGV.first).nil? puts_columns Formula.names + elsif ARGV.first =~ TAP_QUERY_REGEX + # So look for user/repo/query or list all formulae by the tap + # we downcase to avoid case-insensitive filesystem issues. + user, repo, query = $1.downcase, $2.downcase, $3 + tap_dir = HOMEBREW_LIBRARY/"Taps/#{user}-#{repo}" + # If, instead of `user/repo/query` the user wrote `user/repo query`: + query = ARGV[1] if query.nil? + if tap_dir.directory? + # There is a local tap already: + result = Dir["#{tap_dir}/*.rb"].map{ |f| File.basename(f).chomp('.rb') } + result = result.grep(query_regexp(query)) unless query.nil? + else + # Search online: + query = '' if query.nil? + result = search_tap(user, repo, query_regexp(query)) + end + puts_columns result else rx = query_regexp(query) local_results = search_formulae(rx) diff --git a/share/man/man1/brew.1 b/share/man/man1/brew.1 index c5f1e00c51..94d8473b62 100644 --- a/share/man/man1/brew.1 +++ b/share/man/man1/brew.1 @@ -38,8 +38,8 @@ Fetch the newest version of Homebrew from GitHub using \fBgit\fR(1)\. List all installed formulae\. . .TP -\fBsearch\fR, \fB\-S\fR \fItext\fR|/\fItext\fR/ -Perform a substring search of formula names for \fItext\fR\. If \fItext\fR is surrounded with slashes, then it is interpreted as a regular expression\. If no search term is given, all available formula are displayed\. +\fBsearch\fR \fItext\fR|/\fItext\fR/ +Perform a substring search of formula names for \fItext\fR\. If \fItext\fR is surrounded with slashes, then it is interpreted as a regular expression\. The search for \fItext\fR is extended online to some popular taps\. If no search term is given, all locally available formulae are listed\. . .SH "COMMANDS" . @@ -298,8 +298,16 @@ Uninstall \fIformula\fR\. If \fB\-\-force\fR is passed, and there are multiple versions of \fIformula\fR installed, delete all installed versions\. . .TP -\fBsearch\fR, \fB\-S\fR \fItext\fR|/\fItext\fR/ -Perform a substring search of formula names for \fItext\fR\. If \fItext\fR is surrounded with slashes, then it is interpreted as a regular expression\. If no search term is given, all available formula are displayed\. +\fBsearch\fR, \fB\-S\fR +Display all locally available formulae for brewing (including tapped ones)\. No online search is performed if called without arguments\. +. +.TP +\fBsearch\fR, \fB\-S\fR \fItap\fR +Display all formulae in a \fItap\fR, even if not yet tapped\. \fItap\fR is of the form \fIuser\fR/\fIrepo\fR, e\.g\. \fBbrew search homebrew/dupes\fR\. +. +.TP +\fBsearch\fR, \fB\-S\fR [\fItap\fR] \fItext\fR|/\fItext\fR/ +Perform a substring search of formula names for \fItext\fR\. If \fItext\fR is surrounded with slashes, then it is interpreted as a regular expression\. The search for \fItext\fR is extended online to some popular taps\. If a \fItap\fR is specified, the search is restricted to it\. . .TP \fBsearch \-\-debian\fR|\fB\-\-fedora\fR|\fB\-\-fink\fR|\fB\-\-macports\fR|\fB\-\-opensuse\fR|\fB\-\-ubuntu\fR \fItext\fR