brew/Library/Homebrew/cmd/create.rb

127 lines
3.2 KiB
Ruby
Raw Normal View History

require 'formula'
require 'blacklist'
module Homebrew extend self
def create
if ARGV.include? '--macports'
exec "open", "http://www.macports.org/ports.php?by=name&substr=#{ARGV.next}"
elsif ARGV.include? '--fink'
exec "open", "http://pdb.finkproject.org/pdb/browse.php?summary=#{ARGV.next}"
elsif ARGV.named.empty?
raise UsageError
else
paths = ARGV.named.map do |url|
fc = FormulaCreator.new
fc.url = url
fc.mode = if ARGV.include? '--cmake'
:cmake
elsif ARGV.include? '--autotools'
:autotools
end
if fc.name.to_s.strip.empty?
path = Pathname.new url
print "Formula name [#{path.stem}]: "
fc.name = __gets || path.stem
end
unless ARGV.force?
if msg = blacklisted?(fc.name)
raise "#{fc.name} is blacklisted for creation.\n#{msg}\nIf you really want to create this formula use --force."
end
if Formula.aliases.include? fc.name
realname = Formula.caniconical_name fc.name
raise <<-EOS.undent
The formula #{realname} is already aliased to #{fc.name}
Please check that you are not creating a duplicate.
To force creation use --force.
EOS
end
end
fc.generate
fc.path
end
exec_editor *paths
end
end
def __gets
gots = $stdin.gets.chomp
if gots.empty? then nil else gots end
end
end
class FormulaCreator
attr :url
attr :md5
attr :name, true
attr :path
attr :mode, true
def url= url
@url = url
path = Pathname.new url
/(.*?)[-_.]?#{path.version}/.match path.basename
@name = $1
@path = Formula.path $1
end
def version
Pathname.new(url).version
end
def generate
raise "#{path} already exists" if path.exist?
raise VersionUndetermined if version.nil?
require 'digest'
require 'erb'
if version.nil?
opoo "Version cannot be determined from URL."
puts "You'll need to add an explicit 'version' to the formula."
else
puts "Version detected as #{version}."
end
unless ARGV.include? "--no-md5" and version
strategy = detect_download_strategy url
@md5 = strategy.new(url, name, version, nil).fetch.md5 if strategy == CurlDownloadStrategy
end
path.write ERB.new(template, nil, '>').result(binding)
end
def template; <<-EOS.undent
require 'formula'
2011-03-09 21:11:03 -08:00
class #{Formula.class_s name} < Formula
url '#{url}'
homepage ''
md5 '#{md5}'
<% if mode == :cmake %>
depends_on 'cmake'
<% elsif mode == nil %>
# depends_on 'cmake'
<% end %>
def install
<% if mode == :cmake %>
system "cmake . \#{std_cmake_parameters}"
<% elsif mode == :autotools %>
system "./configure", "--disable-debug", "--disable-dependency-tracking",
"--prefix=\#{prefix}"
<% else %>
system "./configure", "--disable-debug", "--disable-dependency-tracking",
"--prefix=\#{prefix}"
# system "cmake . \#{std_cmake_parameters}"
<% end %>
system "make install"
end
end
EOS
end
end