| 
									
										
										
										
											2012-05-19 19:57:56 -05:00
										 |  |  | #!/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby | 
					
						
							| 
									
										
										
										
											2010-06-02 15:06:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | ## 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']) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-17 08:28:16 -07:00
										 |  |  | require 'global' | 
					
						
							|  |  |  | require 'formula' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-02 15:06:54 -07:00
										 |  |  | require 'rubygems' | 
					
						
							| 
									
										
										
										
											2010-08-17 08:28:16 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | begin | 
					
						
							|  |  |  |   require 'sinatra' | 
					
						
							|  |  |  | rescue LoadError | 
					
						
							|  |  |  |   onoe 'Sinatra required but not found' | 
					
						
							| 
									
										
										
										
											2011-09-30 08:05:28 -07:00
										 |  |  |   puts 'To install: /usr/bin/gem install sinatra' | 
					
						
							| 
									
										
										
										
											2010-08-17 08:28:16 -07:00
										 |  |  |   exit 1 | 
					
						
							|  |  |  | end | 
					
						
							| 
									
										
										
										
											2010-06-02 15:06:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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> | 
					
						
							| 
									
										
										
										
											2011-09-30 16:28:18 +02:00
										 |  |  |                                 <p id="installed"><a href="/installed">Show installed packages</a></p> | 
					
						
							| 
									
										
										
										
											2010-06-02 15:06:54 -07:00
										 |  |  |   			</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 | 
					
						
							| 
									
										
										
										
											2010-07-18 14:21:47 -07:00
										 |  |  |     Formula.names do |name| | 
					
						
							| 
									
										
										
										
											2010-06-02 15:06:54 -07:00
										 |  |  |       s << "<li>#{link_to_formula(name)}</li>" | 
					
						
							|  |  |  |     end | 
					
						
							|  |  |  |     s << <<-HTML | 
					
						
							|  |  |  |       </ul> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |     HTML | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | end | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | get '/search' do | 
					
						
							|  |  |  |   q = params['q'] | 
					
						
							| 
									
										
										
										
											2010-06-17 10:51:45 -07:00
										 |  |  |   results = search_brews(q) | 
					
						
							| 
									
										
										
										
											2010-06-02 15:06:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   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 | 
					
						
							| 
									
										
										
										
											2012-02-28 19:56:35 -08:00
										 |  |  |     klass.deps.each do |dep| | 
					
						
							|  |  |  |       s << "<dd>#{link_to_formula(dep.name)}</dd>" | 
					
						
							| 
									
										
										
										
											2010-06-02 15:06:54 -07:00
										 |  |  |     end | 
					
						
							|  |  |  |   end | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-08-21 11:39:45 -04:00
										 |  |  |   used_by = Formula.select{|ff| ff.deps.include?(klass.name)}.map{|f| f.name}.flatten.uniq.sort | 
					
						
							| 
									
										
										
										
											2010-08-17 08:28:16 -07:00
										 |  |  |   unless used_by.empty? | 
					
						
							| 
									
										
										
										
											2010-06-02 15:06:54 -07:00
										 |  |  |     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 | 
					
						
							| 
									
										
										
										
											2010-08-17 08:28:16 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-30 16:28:18 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | def installed_formulas | 
					
						
							| 
									
										
										
										
											2012-08-21 11:39:45 -04:00
										 |  |  |   Formula.select{|formula| formula.installed?} | 
					
						
							| 
									
										
										
										
											2011-09-30 16:28:18 +02:00
										 |  |  | 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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-17 08:28:16 -07:00
										 |  |  | puts "View our tasting menu at http://localhost:4567/\nUse \"Control-C\" to exit.\n\n" |