brew/Library/Homebrew/formula_support.rb

165 lines
3.7 KiB
Ruby
Raw Normal View History

require 'download_strategy'
require 'checksums'
require 'version'
2012-04-05 21:09:24 -05:00
class SoftwareSpec
attr_reader :checksum, :mirrors, :specs
def initialize url=nil, version=nil
@url = url
@version = version
@mirrors = []
2013-02-11 20:50:52 -06:00
@specs = {}
end
def download_strategy
@download_strategy ||= DownloadStrategyDetector.detect(@url, @using)
end
def verify_download_integrity fn
fn.verify_checksum @checksum
rescue ChecksumMissingError
opoo "Cannot verify package integrity"
puts "The formula did not provide a download checksum"
puts "For your reference the SHA1 is: #{fn.sha1}"
rescue ChecksumMismatchError => e
e.advice = <<-EOS.undent
Archive: #{fn}
(To retry an incomplete download, remove the file above.)
EOS
raise e
end
2012-04-05 21:09:24 -05:00
# The methods that follow are used in the block-form DSL spec methods
Checksum::TYPES.each do |cksum|
class_eval <<-EOS, __FILE__, __LINE__ + 1
def #{cksum}(val)
@checksum = Checksum.new(:#{cksum}, val)
2012-04-05 21:09:24 -05:00
end
EOS
2012-04-05 21:09:24 -05:00
end
2013-02-11 20:50:52 -06:00
def url val=nil, specs={}
2012-04-05 21:09:24 -05:00
return @url if val.nil?
@url = val
2013-02-11 20:50:52 -06:00
@using = specs.delete(:using)
@specs.merge!(specs)
2012-04-05 21:09:24 -05:00
end
def version val=nil
@version ||= case val
when nil then Version.parse(@url)
when Hash
key, value = val.shift
scheme = VersionSchemeDetector.new(value).detect
scheme.new(key)
else Version.new(val)
end
2012-04-05 21:09:24 -05:00
end
def mirror val
2012-04-05 21:09:24 -05:00
@mirrors ||= []
@mirrors << val
2012-04-05 21:09:24 -05:00
end
end
class HeadSoftwareSpec < SoftwareSpec
def initialize url=nil, version=Version.new(:HEAD)
2012-04-05 21:09:24 -05:00
super
end
def verify_download_integrity fn
return
end
end
class Bottle < SoftwareSpec
attr_writer :url
# TODO: Can be removed when all bottles migrated to underscored cat symbols.
attr_reader :cat_without_underscores
2012-04-05 21:09:24 -05:00
def initialize
super
2012-04-05 21:09:24 -05:00
@revision = 0
@prefix = '/usr/local'
@cellar = '/usr/local/Cellar'
@cat_without_underscores = false
2012-04-05 21:09:24 -05:00
end
# Checksum methods in the DSL's bottle block optionally take
# a Hash, which indicates the platform the checksum applies on.
Checksum::TYPES.each do |cksum|
class_eval <<-EOS, __FILE__, __LINE__ + 1
def #{cksum}(val)
2012-04-05 21:09:24 -05:00
@#{cksum} ||= Hash.new
case val
when Hash
key, value = val.shift
@#{cksum}[value] = Checksum.new(:#{cksum}, key)
2012-04-05 21:09:24 -05:00
end
if @#{cksum}.has_key? MacOS.cat
@checksum = @#{cksum}[MacOS.cat]
elsif @#{cksum}.has_key? MacOS.cat_without_underscores
@checksum = @#{cksum}[MacOS.cat_without_underscores]
@cat_without_underscores = true
end
2012-04-05 21:09:24 -05:00
end
EOS
2012-04-05 21:09:24 -05:00
end
def root_url val=nil
val.nil? ? @root_url : @root_url = val
end
def prefix val=nil
val.nil? ? @prefix : @prefix = val
end
def cellar val=nil
val.nil? ? @cellar : @cellar = val
end
def revision val=nil
val.nil? ? @revision : @revision = val
2012-04-05 21:09:24 -05:00
end
end
# Used to annotate formulae that duplicate OS X provided software
# or cause conflicts when linked in.
class KegOnlyReason
attr_reader :reason, :explanation
def initialize reason, explanation=nil
@reason = reason
@explanation = explanation
@valid = case @reason
when :provided_pre_mountain_lion then MacOS.version < :mountain_lion
else true
end
end
def valid?
@valid
end
def to_s
case @reason
when :provided_by_osx then <<-EOS.undent
Mac OS X already provides this software and installing another version in
parallel can cause all kinds of trouble.
#{@explanation}
EOS
when :provided_pre_mountain_lion then <<-EOS.undent
Mac OS X already provides this software in versions before Mountain Lion.
#{@explanation}
EOS
else
@reason
end.strip
end
end