
Reader methods for specific checksum types have been absent from the Formula class for some time, so there isn't any reason to expose them in SoftwareSpec, either. Thus, these methods now only act as setters, and #checksum should be used to access the constructed Checksum object.
165 lines
3.7 KiB
Ruby
165 lines
3.7 KiB
Ruby
require 'download_strategy'
|
|
require 'checksums'
|
|
require 'version'
|
|
|
|
class SoftwareSpec
|
|
attr_reader :checksum, :mirrors, :specs
|
|
|
|
def initialize url=nil, version=nil
|
|
@url = url
|
|
@version = version
|
|
@mirrors = []
|
|
@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
|
|
|
|
# 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)
|
|
end
|
|
EOS
|
|
end
|
|
|
|
def url val=nil, specs={}
|
|
return @url if val.nil?
|
|
@url = val
|
|
@using = specs.delete(:using)
|
|
@specs.merge!(specs)
|
|
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
|
|
end
|
|
|
|
def mirror val
|
|
@mirrors ||= []
|
|
@mirrors << val
|
|
end
|
|
end
|
|
|
|
class HeadSoftwareSpec < SoftwareSpec
|
|
def initialize url=nil, version=Version.new(:HEAD)
|
|
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
|
|
|
|
def initialize
|
|
super
|
|
@revision = 0
|
|
@prefix = '/usr/local'
|
|
@cellar = '/usr/local/Cellar'
|
|
@cat_without_underscores = false
|
|
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)
|
|
@#{cksum} ||= Hash.new
|
|
case val
|
|
when Hash
|
|
key, value = val.shift
|
|
@#{cksum}[value] = Checksum.new(:#{cksum}, key)
|
|
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
|
|
end
|
|
EOS
|
|
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
|
|
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
|