2012-03-10 09:24:10 -08:00

209 lines
3.9 KiB
Ruby
Executable File

#!/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 &ldquo;#{q}&rdquo;</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>&larr; <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>&larr; <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"