diff options
Diffstat (limited to 'Library/Contributions/cmd/brew-server')
| -rwxr-xr-x | Library/Contributions/cmd/brew-server | 208 |
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 “#{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.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>← <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" |
