
Rationale: some users insist on replacing the /usr/bin/ruby symlink to point to another ruby on their system, which may break homebrew. Use the full Framework path instead, which is less likely to be tampered with. This also reorganizes the brew --config checks to reflect the different path. Fixes Homebrew/homebrew#12009. Closes Homebrew/homebrew#12333. Signed-off-by: Misty De Meo <mistydemeo@gmail.com>
209 lines
4.0 KiB
Ruby
Executable File
209 lines
4.0 KiB
Ruby
Executable File
#!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby
|
|
|
|
## brew server: Run a local webserver for browsing available and installed brews.
|
|
# Note: this external command is ruby, but set up as a shell script, so that it gets exec'd.
|
|
# This is required for sinatra's run-loop to take over.
|
|
|
|
$:.unshift(ENV['HOMEBREW_LIBRARY_PATH'])
|
|
|
|
require 'global'
|
|
require 'formula'
|
|
|
|
require 'rubygems'
|
|
|
|
begin
|
|
require 'sinatra'
|
|
rescue LoadError
|
|
onoe 'Sinatra required but not found'
|
|
puts 'To install: /usr/bin/gem install sinatra'
|
|
exit 1
|
|
end
|
|
|
|
require 'cgi'
|
|
|
|
|
|
def link_to_formula name
|
|
"<a href=\"/formula/#{CGI.escape(name)}\">#{name}</a>"
|
|
end
|
|
|
|
def css_style
|
|
"" # No CSS defined yet.
|
|
end
|
|
|
|
def search_form
|
|
<<-EOS
|
|
<form action="/search">
|
|
Search: <input name="q" type="text"> <input type="submit">
|
|
</form>
|
|
EOS
|
|
end
|
|
|
|
def html_page
|
|
body = <<-HTML
|
|
<html>
|
|
<head>
|
|
<title>Homebrew Menu</title>
|
|
#{css_style}
|
|
</head>
|
|
<body>
|
|
<div id="wrap">
|
|
<div id="header">
|
|
<h1><a href="./">Homebrew</a></h1>
|
|
<p id="subtitle"><strong>The missing package manager for OS X</strong></p>
|
|
<p id="installed"><a href="/installed">Show installed packages</a></p>
|
|
</div>
|
|
|
|
<div id="informations">
|
|
HTML
|
|
yield body
|
|
body += <<-HTML
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
HTML
|
|
return body
|
|
end
|
|
|
|
get '/' do
|
|
return html_page do |s|
|
|
s << <<-HTML
|
|
<div class="row">#{search_form}</div>
|
|
<div class="row">
|
|
<ul>
|
|
HTML
|
|
Formula.names do |name|
|
|
s << "<li>#{link_to_formula(name)}</li>"
|
|
end
|
|
s << <<-HTML
|
|
</ul>
|
|
</div>
|
|
HTML
|
|
end
|
|
end
|
|
|
|
get '/search' do
|
|
q = params['q']
|
|
results = search_brews(q)
|
|
|
|
s = <<-HTML
|
|
<html>
|
|
<head>
|
|
<title>Search Results</title>
|
|
#{css_style}
|
|
</head>
|
|
<body>
|
|
<h1>Results</h1>
|
|
#{search_form}
|
|
<h4>Searched for “#{q}”</h4>
|
|
<ul>
|
|
HTML
|
|
|
|
results.each do |name|
|
|
s << "<li>#{link_to_formula(name)}</li>"
|
|
end
|
|
|
|
s += <<-HTML
|
|
</ul>
|
|
</body>
|
|
</html>
|
|
HTML
|
|
|
|
return s
|
|
end
|
|
|
|
get '/formula/:name' do
|
|
klass = Formula.factory(params[:name])
|
|
|
|
installed = klass.installed? ? "Installed at" : "Not installed."
|
|
installed_dd = klass.installed? ? "<a href=\"file://#{klass.prefix}\">#{klass.prefix}</a>" : ""
|
|
|
|
s = ""
|
|
s << <<-HTML
|
|
<html>
|
|
<head>
|
|
<title>Formula: #{klass.name}</title>
|
|
#{css_style}
|
|
</head>
|
|
<body>
|
|
<div>← <a href="/">Back to menu</a></div>
|
|
<h1>#{klass.name}</h1>
|
|
<dl>
|
|
<dt>Version</dt>
|
|
<dd>#{klass.version}</dd>
|
|
|
|
<dt>Homepage</dt>
|
|
<dd><a href="#{klass.homepage}">#{klass.homepage}</a></dd>
|
|
|
|
<dt>Download</dt>
|
|
<dd><a href="#{klass.url}">#{klass.url}</a></dd>
|
|
|
|
<dt>#{installed}</dt>
|
|
<dd>#{installed_dd}</dd>
|
|
HTML
|
|
|
|
unless klass.deps.count == 0
|
|
s << <<-HTML
|
|
<dt>Depends on</td>
|
|
HTML
|
|
klass.deps.each do |dep|
|
|
s << "<dd>#{link_to_formula(dep.name)}</dd>"
|
|
end
|
|
end
|
|
|
|
used_by = Formula.all.select{|ff| ff.deps.include?(klass.name)}.map{|f| f.name}.flatten.uniq.sort
|
|
unless used_by.empty?
|
|
s << <<-HTML
|
|
<dt>Used by</td>
|
|
HTML
|
|
if used_by != nil
|
|
used_by.each do |name|
|
|
s << "<dd>#{link_to_formula(name)}</dd>"
|
|
end
|
|
end
|
|
end
|
|
|
|
s += <<-HTML
|
|
</dl>
|
|
</body>
|
|
</html>
|
|
HTML
|
|
|
|
return s
|
|
end
|
|
|
|
|
|
def installed_formulas
|
|
Formula.all.select{|formula| formula.installed?}
|
|
end
|
|
|
|
get '/installed' do
|
|
|
|
s = <<-HTML
|
|
<html>
|
|
<head>
|
|
<title>Installed Formulas</title>
|
|
#{css_style}
|
|
</head>
|
|
<body>
|
|
<h1>Installed Fomulas</h1>
|
|
<ul>
|
|
HTML
|
|
|
|
installed_formulas.each do |formula|
|
|
s << "<li>#{link_to_formula(formula.name)}</li>"
|
|
end
|
|
|
|
s += <<-HTML
|
|
</ul>
|
|
<div>← <a href="/">Back to menu</a></div>
|
|
</body>
|
|
</html>
|
|
HTML
|
|
|
|
return s
|
|
end
|
|
|
|
|
|
puts "View our tasting menu at http://localhost:4567/\nUse \"Control-C\" to exit.\n\n"
|