Skip to content

Commit

Permalink
brew search <user>/<repo> [substring]
Browse files Browse the repository at this point in the history
For example `brew search homebrew/science` to get a list of all formulae
from that tap, even if not yet tapped.

`brew search <user>/<repo>/<substr>` or
`brew search <user>/<repo> <substr>` to grep for `<substr>`
inside of the tap `<user>/<repo>`.
  • Loading branch information
samueljohn committed Sep 3, 2013
1 parent 040bb3e commit cf8f4cc
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 8 deletions.
18 changes: 14 additions & 4 deletions Library/Contributions/manpages/brew.1.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,11 @@ Note that these flags should only appear after a command.
* `list`:
List all installed formulae.

* `search`, `-S` <text>|/<text>/:
* `search` <text>|/<text>/:
Perform a substring search of formula names for <text>. If <text> 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 <text> is extended online to some popular taps.
If no search term is given, all locally available formulae are listed.

## COMMANDS

Expand Down Expand Up @@ -272,10 +273,19 @@ Note that these flags should only appear after a command.
If `--force` is passed, and there are multiple versions of <formula>
installed, delete all installed versions.

* `search`, `-S` <text>|/<text>/:
* `search`, `-S`:
Display all locally available formulae for brewing (including tapped ones).
No online search is performed if called without arguments.

* `search`, `-S` <tap>:
Display all formulae in a <tap>, even if not yet tapped.
<tap> is of the form <user>/<repo>, e.g. `brew search homebrew/dupes`.

* `search`, `-S` [<tap>] <text>|/<text>/:
Perform a substring search of formula names for <text>. If <text> 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 <text> is extended online to some popular taps.
If a <tap> is specified, the search is restricted to it.

* `search --debian`|`--fedora`|`--fink`|`--macports`|`--opensuse`|`--ubuntu` <text>:
Search for <text> in the given package manager's list.
Expand Down
23 changes: 23 additions & 0 deletions Library/Homebrew/cmd/search.rb
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,12 @@
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}"
Expand All @@ -19,6 +25,23 @@ def search
exec_browser "http://packages.ubuntu.com/search?keywords=#{ARGV.next}&searchon=names&suite=all&section=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)
Expand Down
16 changes: 12 additions & 4 deletions share/man/man1/brew.1
Original file line number Diff line number Diff line change
Expand Up @@ -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"
.
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit cf8f4cc

Please sign in to comment.