2016-04-25 17:57:51 +01:00
|
|
|
require "tab"
|
|
|
|
require "extend/ARGV"
|
|
|
|
|
|
|
|
module Utils
|
|
|
|
class Bottles
|
|
|
|
class << self
|
|
|
|
def tag
|
2018-03-07 16:14:55 +00:00
|
|
|
@tag ||= "#{ENV["HOMEBREW_PROCESSOR"]}_#{ENV["HOMEBREW_SYSTEM"]}".downcase.to_sym
|
2016-04-25 17:57:51 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def built_as?(f)
|
|
|
|
return false unless f.installed?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2016-04-25 17:57:51 +01:00
|
|
|
tab = Tab.for_keg(f.installed_prefix)
|
|
|
|
tab.built_as_bottle
|
|
|
|
end
|
|
|
|
|
|
|
|
def file_outdated?(f, file)
|
|
|
|
filename = file.basename.to_s
|
|
|
|
return unless f.bottle && filename.match(Pathname::BOTTLE_EXTNAME_RX)
|
|
|
|
|
|
|
|
bottle_ext = filename[native_regex, 1]
|
|
|
|
bottle_url_ext = f.bottle.url[native_regex, 1]
|
|
|
|
|
|
|
|
bottle_ext && bottle_url_ext && bottle_ext != bottle_url_ext
|
|
|
|
end
|
|
|
|
|
|
|
|
def native_regex
|
2016-05-08 20:35:52 +02:00
|
|
|
/(\.#{Regexp.escape(tag.to_s)}\.bottle\.(\d+\.)?tar\.gz)$/o
|
2016-04-25 17:57:51 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def receipt_path(bottle_file)
|
2017-09-25 11:10:36 -07:00
|
|
|
path = Utils.popen_read("tar", "-tzf", bottle_file).lines.map(&:chomp).find do |line|
|
2016-07-29 15:54:56 -06:00
|
|
|
line =~ %r{.+/.+/INSTALL_RECEIPT.json}
|
|
|
|
end
|
2017-09-25 11:10:36 -07:00
|
|
|
raise "This bottle does not contain the file INSTALL_RECEIPT.json: #{bottle_file}" unless path
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2017-09-25 11:10:36 -07:00
|
|
|
path
|
2016-04-25 17:57:51 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def resolve_formula_names(bottle_file)
|
|
|
|
receipt_file_path = receipt_path bottle_file
|
|
|
|
receipt_file = Utils.popen_read("tar", "-xOzf", bottle_file, receipt_file_path)
|
|
|
|
name = receipt_file_path.split("/").first
|
|
|
|
tap = Tab.from_file_content(receipt_file, "#{bottle_file}/#{receipt_file_path}").tap
|
|
|
|
|
|
|
|
if tap.nil? || tap.core_tap?
|
|
|
|
full_name = name
|
|
|
|
else
|
|
|
|
full_name = "#{tap}/#{name}"
|
|
|
|
end
|
|
|
|
|
|
|
|
[name, full_name]
|
|
|
|
end
|
|
|
|
|
|
|
|
def resolve_version(bottle_file)
|
|
|
|
PkgVersion.parse receipt_path(bottle_file).split("/")[1]
|
|
|
|
end
|
2017-09-25 22:46:51 -07:00
|
|
|
|
|
|
|
def formula_contents(bottle_file,
|
|
|
|
name: resolve_formula_names(bottle_file)[0])
|
|
|
|
bottle_version = resolve_version bottle_file
|
|
|
|
formula_path = "#{name}/#{bottle_version}/.brew/#{name}.rb"
|
|
|
|
contents = Utils.popen_read "tar", "-xOzf", bottle_file, formula_path
|
|
|
|
raise BottleFormulaUnavailableError.new(bottle_file, formula_path) unless $CHILD_STATUS.success?
|
2018-09-17 02:45:00 +02:00
|
|
|
|
2017-09-25 22:46:51 -07:00
|
|
|
contents
|
|
|
|
end
|
2016-04-25 17:57:51 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
class Bintray
|
|
|
|
def self.package(formula_name)
|
2016-08-28 23:55:43 +01:00
|
|
|
package_name = formula_name.to_s.dup
|
|
|
|
package_name.tr!("+", "x")
|
|
|
|
package_name.sub!(/(.)@(\d)/, "\\1:\\2") # Handle foo@1.2 style formulae.
|
|
|
|
package_name
|
2016-04-25 17:57:51 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
def self.repository(tap = nil)
|
|
|
|
if tap.nil? || tap.core_tap?
|
|
|
|
"bottles"
|
|
|
|
else
|
|
|
|
"bottles-#{tap.repo}"
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
class Collector
|
|
|
|
def initialize
|
|
|
|
@checksums = {}
|
|
|
|
end
|
|
|
|
|
|
|
|
def fetch_checksum_for(tag)
|
|
|
|
tag = find_matching_tag(tag)
|
|
|
|
return self[tag], tag if tag
|
|
|
|
end
|
|
|
|
|
|
|
|
def keys
|
|
|
|
@checksums.keys
|
|
|
|
end
|
|
|
|
|
|
|
|
def [](key)
|
|
|
|
@checksums[key]
|
|
|
|
end
|
|
|
|
|
|
|
|
def []=(key, value)
|
|
|
|
@checksums[key] = value
|
|
|
|
end
|
|
|
|
|
|
|
|
def key?(key)
|
|
|
|
@checksums.key?(key)
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
|
|
|
def find_matching_tag(tag)
|
|
|
|
tag if key?(tag)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
require "extend/os/bottles"
|