mirror of
https://github.com/Homebrew/brew.git
synced 2025-07-14 16:09:03 +08:00
Move SoftwareSpec to a separate file
This commit is contained in:
parent
f0da9c2457
commit
a31fcb554c
@ -11,6 +11,7 @@ require 'compilers'
|
|||||||
require 'build_environment'
|
require 'build_environment'
|
||||||
require 'build_options'
|
require 'build_options'
|
||||||
require 'formulary'
|
require 'formulary'
|
||||||
|
require 'software_spec'
|
||||||
|
|
||||||
|
|
||||||
class Formula
|
class Formula
|
||||||
|
@ -1,118 +1,5 @@
|
|||||||
require 'download_strategy'
|
|
||||||
require 'checksum'
|
|
||||||
require 'version'
|
|
||||||
|
|
||||||
FormulaConflict = Struct.new(:name, :reason)
|
FormulaConflict = Struct.new(:name, :reason)
|
||||||
|
|
||||||
class SoftwareSpec
|
|
||||||
attr_reader :checksum, :mirrors, :specs
|
|
||||||
attr_reader :using # for auditing
|
|
||||||
|
|
||||||
def initialize url=nil, version=nil
|
|
||||||
@url = url
|
|
||||||
@version = version
|
|
||||||
@mirrors = []
|
|
||||||
@specs = {}
|
|
||||||
@checksum = nil
|
|
||||||
@using = nil
|
|
||||||
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
|
|
||||||
|
|
||||||
def detect_version(val)
|
|
||||||
case val
|
|
||||||
when nil then Version.detect(url, specs)
|
|
||||||
when String then Version.new(val)
|
|
||||||
when Hash then Version.new_with_scheme(*val.shift)
|
|
||||||
else
|
|
||||||
raise TypeError, "version '#{val.inspect}' should be a string"
|
|
||||||
end
|
|
||||||
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 ||= detect_version(val)
|
|
||||||
end
|
|
||||||
|
|
||||||
def mirror val
|
|
||||||
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
|
|
||||||
attr_rw :root_url, :prefix, :cellar, :revision
|
|
||||||
|
|
||||||
def initialize
|
|
||||||
super
|
|
||||||
@revision = 0
|
|
||||||
@prefix = '/usr/local'
|
|
||||||
@cellar = '/usr/local/Cellar'
|
|
||||||
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=nil)
|
|
||||||
return @#{cksum} if val.nil?
|
|
||||||
@#{cksum} ||= Hash.new
|
|
||||||
case val
|
|
||||||
when Hash
|
|
||||||
key, value = val.shift
|
|
||||||
@#{cksum}[value] = Checksum.new(:#{cksum}, key)
|
|
||||||
end
|
|
||||||
|
|
||||||
if @#{cksum}.has_key? bottle_tag
|
|
||||||
@checksum = @#{cksum}[bottle_tag]
|
|
||||||
end
|
|
||||||
end
|
|
||||||
EOS
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
# Used to annotate formulae that duplicate OS X provided software
|
# Used to annotate formulae that duplicate OS X provided software
|
||||||
# or cause conflicts when linked in.
|
# or cause conflicts when linked in.
|
||||||
class KegOnlyReason
|
class KegOnlyReason
|
||||||
|
111
Library/Homebrew/software_spec.rb
Normal file
111
Library/Homebrew/software_spec.rb
Normal file
@ -0,0 +1,111 @@
|
|||||||
|
require 'download_strategy'
|
||||||
|
require 'checksum'
|
||||||
|
require 'version'
|
||||||
|
|
||||||
|
class SoftwareSpec
|
||||||
|
attr_reader :checksum, :mirrors, :specs
|
||||||
|
attr_reader :using # for auditing
|
||||||
|
|
||||||
|
def initialize url=nil, version=nil
|
||||||
|
@url = url
|
||||||
|
@version = version
|
||||||
|
@mirrors = []
|
||||||
|
@specs = {}
|
||||||
|
@checksum = nil
|
||||||
|
@using = nil
|
||||||
|
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
|
||||||
|
|
||||||
|
def detect_version(val)
|
||||||
|
case val
|
||||||
|
when nil then Version.detect(url, specs)
|
||||||
|
when String then Version.new(val)
|
||||||
|
when Hash then Version.new_with_scheme(*val.shift)
|
||||||
|
else
|
||||||
|
raise TypeError, "version '#{val.inspect}' should be a string"
|
||||||
|
end
|
||||||
|
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 ||= detect_version(val)
|
||||||
|
end
|
||||||
|
|
||||||
|
def mirror val
|
||||||
|
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
|
||||||
|
attr_rw :root_url, :prefix, :cellar, :revision
|
||||||
|
|
||||||
|
def initialize
|
||||||
|
super
|
||||||
|
@revision = 0
|
||||||
|
@prefix = '/usr/local'
|
||||||
|
@cellar = '/usr/local/Cellar'
|
||||||
|
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=nil)
|
||||||
|
return @#{cksum} if val.nil?
|
||||||
|
@#{cksum} ||= Hash.new
|
||||||
|
case val
|
||||||
|
when Hash
|
||||||
|
key, value = val.shift
|
||||||
|
@#{cksum}[value] = Checksum.new(:#{cksum}, key)
|
||||||
|
end
|
||||||
|
|
||||||
|
if @#{cksum}.has_key? bottle_tag
|
||||||
|
@checksum = @#{cksum}[bottle_tag]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
EOS
|
||||||
|
end
|
||||||
|
end
|
@ -1,5 +1,5 @@
|
|||||||
require 'testing_env'
|
require 'testing_env'
|
||||||
require 'formula_support'
|
require 'software_spec'
|
||||||
require 'bottles'
|
require 'bottles'
|
||||||
|
|
||||||
class SoftwareSpecTests < Test::Unit::TestCase
|
class SoftwareSpecTests < Test::Unit::TestCase
|
||||||
|
Loading…
x
Reference in New Issue
Block a user