brew/Library/Homebrew/bottles.rb
Jack Nagel b45cadd19a bottles: fix options hashes
Defaults can't be specified in the parameter list, as they will be
overwritten by whatever is passed in. Instead the defaults must be
merged with the argument in the method body.
2013-12-08 16:41:35 -06:00

145 lines
3.8 KiB
Ruby

require 'tab'
require 'os/mac'
require 'extend/ARGV'
require 'bottle_version'
def bottle_filename f, options={}
options = { :tag => bottle_tag }.merge(options)
name = f.name.downcase
version = f.stable.version
options[:revision] ||= f.bottle.revision.to_i if f.bottle
"#{name}-#{version}#{bottle_native_suffix(options)}"
end
def install_bottle? f, options={:warn=>false}
return true if f.local_bottle_path
return false if ARGV.build_from_source?
return true if ARGV.force_bottle?
return false unless f.pour_bottle?
return false unless f.default_build?
return false unless bottle_current?(f)
if f.bottle.cellar != :any && f.bottle.cellar != HOMEBREW_CELLAR.to_s
if options[:warn]
opoo "Building source; cellar of #{f}'s bottle is #{f.bottle.cellar}"
end
return false
end
true
end
def built_as_bottle? f
return false unless f.installed?
tab = Tab.for_keg(f.installed_prefix)
tab.built_as_bottle
end
def bottle_current? f
f.bottle and f.bottle.url and not f.bottle.checksum.empty?
end
def bottle_file_outdated? f, file
filename = file.basename.to_s
return nil unless f and f.bottle and f.bottle.url \
and filename.match(bottle_regex)
bottle_ext = filename[bottle_native_regex, 1]
bottle_url_ext = f.bottle.url[bottle_native_regex, 1]
bottle_ext && bottle_url_ext && bottle_ext != bottle_url_ext
end
def bottle_native_suffix options={}
options = { :tag => bottle_tag }.merge(options)
".#{options[:tag]}#{bottle_suffix(options[:revision])}"
end
def bottle_suffix revision=nil
revision = revision.to_i > 0 ? ".#{revision}" : ""
".bottle#{revision}.tar.gz"
end
def bottle_native_regex
/(\.#{bottle_tag}\.bottle\.(\d+\.)?tar\.gz)$/o
end
def bottle_regex
Pathname::BOTTLE_EXTNAME_RX
end
def bottle_root_url f
root_url = f.bottle.root_url
root_url ||= 'https://downloads.sf.net/project/machomebrew/Bottles'
end
def bottle_url f, tag=bottle_tag
"#{bottle_root_url(f)}/#{bottle_filename(f, {:tag => tag})}"
end
def bottle_tag
if MacOS.version >= :lion
MacOS.cat
elsif MacOS.version == :snow_leopard
Hardware::CPU.is_64_bit? ? :snow_leopard : :snow_leopard_32
else
# Return, e.g., :tiger_g3, :leopard_g5_64, :leopard_64 (which is Intel)
if Hardware::CPU.type == :ppc
tag = "#{MacOS.cat}_#{Hardware::CPU.family}".to_sym
else
tag = MacOS.cat
end
MacOS.prefer_64_bit? ? "#{tag}_64".to_sym : tag
end
end
def bottle_filename_formula_name filename
path = Pathname.new filename
version = BottleVersion.parse(path).to_s
basename = path.basename.to_s
basename.rpartition("-#{version}").first
end
class BottleCollector
def initialize
@bottles = {}
end
def add(checksum, tag, url=nil)
@bottles[tag] = checksum
end
def fetch_bottle_for(tag)
return [@bottles[tag], tag] if @bottles[tag]
find_altivec_tag(tag) || find_or_later_tag(tag)
end
def keys; @bottles.keys; end
def [](arg); @bottles[arg]; end
# This allows generic Altivec PPC bottles to be supported in some
# formulae, while also allowing specific bottles in others; e.g.,
# sometimes a formula has just :tiger_altivec, other times it has
# :tiger_g4, :tiger_g5, etc.
def find_altivec_tag(tag)
if tag.to_s =~ /(\w+)_(g4|g4e|g5)$/
altitag = "#{$1}_altivec".to_sym
return [@bottles[altitag], altitag] if @bottles[altitag]
end
end
# Allows a bottle tag to specify a specific OS or later,
# so the same bottle can target multiple OSs.
# Not used in core, used in taps.
def find_or_later_tag(tag)
results = @bottles.find_all {|k,v| k.to_s =~ /_or_later$/}
results.each do |key, hsh|
later_tag = key.to_s[/(\w+)_or_later$/, 1].to_sym
bottle_version = MacOS::Version.from_symbol(later_tag)
return [hsh, key] if bottle_version <= MacOS::Version.from_symbol(tag)
end
nil
end
end