
The code was sucking. To the extent that maintenance was hard. It's a lot easier to work with code that is sensibly split at sensible boundaries. So now it is more like that. But the refactor is minimal. Because we don't want you to have more merge hell than absolutely necessary. If you merge you will need to pay attention to brew.h.rb (as it is deleted) and bin/brew (as command logic is gone). It will be painful, but you will just have to help git out by moving any changes around manually. Note compatibility.rb. It ensures that any function renames or removals don't break anything. We're pretty serious about backwards compatibility. And that's because we encourage you to hack around with the innards. And we couldn't do that if we would then just make stuff disappear behind your back.
175 lines
3.3 KiB
Ruby
Executable File
175 lines
3.3 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: 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>
|
|
</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 |name|
|
|
s << "<dd>#{link_to_formula(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
|
|
|
|
puts "View our tasting menu at http://localhost:4567/\nUse \"Control-C\" to exit.\n\n"
|