2012-03-07 21:30:03 -05:00
|
|
|
require 'tab'
|
2013-10-18 12:56:51 -05:00
|
|
|
require 'os/mac'
|
2012-03-07 21:30:03 -05:00
|
|
|
require 'extend/ARGV'
|
2013-08-03 20:02:10 -07:00
|
|
|
require 'bottle_version'
|
2012-03-07 21:30:03 -05:00
|
|
|
|
2014-03-10 14:56:02 -05:00
|
|
|
def bottle_filename options={}
|
2014-07-15 17:05:15 -05:00
|
|
|
name = options.fetch(:name)
|
|
|
|
version = options.fetch(:version)
|
|
|
|
tag = options.fetch(:tag)
|
|
|
|
revision = options.fetch(:revision)
|
|
|
|
"#{name}-#{version}.#{tag}#{bottle_suffix(revision)}"
|
2012-03-07 21:30:03 -05:00
|
|
|
end
|
|
|
|
|
2012-08-25 11:31:57 -07:00
|
|
|
def built_as_bottle? f
|
2012-07-22 16:07:20 +01:00
|
|
|
return false unless f.installed?
|
2012-08-25 11:31:57 -07:00
|
|
|
tab = Tab.for_keg(f.installed_prefix)
|
2013-06-27 10:09:18 +01:00
|
|
|
tab.built_as_bottle
|
2012-03-07 21:30:03 -05:00
|
|
|
end
|
|
|
|
|
2012-04-30 15:10:51 -05:00
|
|
|
def bottle_file_outdated? f, file
|
|
|
|
filename = file.basename.to_s
|
2014-07-13 11:17:08 -05:00
|
|
|
return unless f.bottle && filename.match(Pathname::BOTTLE_EXTNAME_RX)
|
2012-04-30 15:10:51 -05:00
|
|
|
|
2013-06-06 14:11:44 -05:00
|
|
|
bottle_ext = filename[bottle_native_regex, 1]
|
|
|
|
bottle_url_ext = f.bottle.url[bottle_native_regex, 1]
|
2012-04-30 15:10:51 -05:00
|
|
|
|
|
|
|
bottle_ext && bottle_url_ext && bottle_ext != bottle_url_ext
|
|
|
|
end
|
|
|
|
|
2014-07-13 19:29:36 -05:00
|
|
|
def bottle_suffix revision
|
|
|
|
revision = revision > 0 ? ".#{revision}" : ""
|
2013-02-09 19:06:54 -08:00
|
|
|
".bottle#{revision}.tar.gz"
|
2012-03-07 21:30:03 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def bottle_native_regex
|
2013-06-06 16:02:27 -05:00
|
|
|
/(\.#{bottle_tag}\.bottle\.(\d+\.)?tar\.gz)$/o
|
2012-03-07 21:30:03 -05:00
|
|
|
end
|
|
|
|
|
2014-07-13 19:29:36 -05:00
|
|
|
def bottle_url(root_url, filename_options)
|
2014-03-10 14:56:02 -05:00
|
|
|
"#{root_url}/#{bottle_filename(filename_options)}"
|
2012-03-18 20:37:10 +13:00
|
|
|
end
|
2013-06-06 16:02:27 -05:00
|
|
|
|
|
|
|
def bottle_tag
|
2013-10-23 00:09:35 +01:00
|
|
|
if MacOS.version >= :lion
|
2013-06-06 16:02:27 -05:00
|
|
|
MacOS.cat
|
2013-10-23 00:09:35 +01:00
|
|
|
elsif MacOS.version == :snow_leopard
|
2013-06-13 12:04:58 -05:00
|
|
|
Hardware::CPU.is_64_bit? ? :snow_leopard : :snow_leopard_32
|
2013-06-06 16:02:27 -05:00
|
|
|
else
|
2013-10-21 13:46:09 -07:00
|
|
|
# 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
|
2013-06-06 16:02:27 -05:00
|
|
|
end
|
|
|
|
end
|
2013-07-04 11:21:50 +01:00
|
|
|
|
|
|
|
def bottle_filename_formula_name filename
|
|
|
|
path = Pathname.new filename
|
2013-08-03 20:02:10 -07:00
|
|
|
version = BottleVersion.parse(path).to_s
|
2013-07-04 11:21:50 +01:00
|
|
|
basename = path.basename.to_s
|
|
|
|
basename.rpartition("-#{version}").first
|
|
|
|
end
|
2013-10-21 21:03:14 -07:00
|
|
|
|
|
|
|
class BottleCollector
|
|
|
|
def initialize
|
|
|
|
@bottles = {}
|
|
|
|
end
|
|
|
|
|
2014-07-16 14:52:18 -05:00
|
|
|
def fetch_checksum_for(tag)
|
2014-07-16 18:54:19 -05:00
|
|
|
return [@bottles[tag], tag] if key?(tag)
|
2013-10-21 21:03:14 -07:00
|
|
|
|
2013-10-21 21:25:42 -07:00
|
|
|
find_altivec_tag(tag) || find_or_later_tag(tag)
|
2013-10-21 21:03:14 -07:00
|
|
|
end
|
|
|
|
|
2014-07-15 21:55:14 -05:00
|
|
|
def keys
|
|
|
|
@bottles.keys
|
|
|
|
end
|
|
|
|
|
|
|
|
def [](key)
|
|
|
|
@bottles[key]
|
|
|
|
end
|
|
|
|
|
|
|
|
def []=(key, value)
|
|
|
|
@bottles[key] = value
|
|
|
|
end
|
2013-10-21 21:25:42 -07:00
|
|
|
|
2014-07-16 18:54:19 -05:00
|
|
|
def key?(key)
|
|
|
|
@bottles.key?(key)
|
|
|
|
end
|
|
|
|
|
2013-10-21 21:03:14 -07:00
|
|
|
# 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)$/
|
2014-07-16 18:54:19 -05:00
|
|
|
altivec_tag = "#{$1}_altivec".to_sym
|
|
|
|
return [@bottles[altivec_tag], altivec_tag] if key?(altivec_tag)
|
2013-10-21 21:03:14 -07:00
|
|
|
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
|