aboutsummaryrefslogtreecommitdiffstats
path: root/Library/Contributions/cmd/brew-server
diff options
context:
space:
mode:
Diffstat (limited to 'Library/Contributions/cmd/brew-server')
-rwxr-xr-xLibrary/Contributions/cmd/brew-server208
1 files changed, 208 insertions, 0 deletions
diff --git a/Library/Contributions/cmd/brew-server b/Library/Contributions/cmd/brew-server
new file mode 100755
index 000000000..a87322409
--- /dev/null
+++ b/Library/Contributions/cmd/brew-server
@@ -0,0 +1,208 @@
+#!/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 &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.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_formulae
+ Formula.select{|formula| formula.installed?}
+end
+
+get '/installed' do
+
+ s = <<-HTML
+ <html>
+ <head>
+ <title>Installed formulae</title>
+ #{css_style}
+ </head>
+ <body>
+ <h1>Installed Fomulas</h1>
+ <ul>
+ HTML
+
+ installed_formulae.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"