69 lines
1.9 KiB
Ruby
Raw Normal View History

require 'ostruct'
require 'formula'
require 'vendor/multi_json'
# Inherit from OpenStruct to gain a generic initialization method that takes a
# hash and creates an attribute for each key and value. `Tab.new` probably
# should not be called directly, instead use one of the class methods like
# `Tab.for_install`.
class Tab < OpenStruct
def self.for_install f, args
# Retrieve option flags from command line.
arg_options = args.options_only
# Pick off the option flags from the formula's `options` array by
# discarding the descriptions.
formula_options = f.options.map { |o, _| o }
Tab.new :used_options => formula_options & arg_options,
:unused_options => formula_options - arg_options,
:tabfile => f.prefix + 'INSTALL_RECEIPT.json'
end
def self.from_file path
tab = Tab.new MultiJson.decode(open(path).read)
tab.tabfile = path
return tab
end
def self.for_formula f
f = Formula.factory f unless f.kind_of? Formula
path = HOMEBREW_REPOSITORY + 'Library' + 'LinkedKegs' + f.name + 'INSTALL_RECEIPT.json'
if path.exist?
self.from_file path
else
# Really should bail out with an error if a formula was not installed
# with a Tab. However, there will be lots of legacy installs that have no
# receipt---so we fabricate one that claims the formula was installed with
# no options.
#
# TODO:
# This isn't the best behavior---perhaps a future version of Homebrew can
# treat missing Tabs as errors.
Tab.new :used_options => [],
:unused_options => f.options.map { |o, _| o}
end
end
def installed_with? opt
used_options.include? opt
end
def options
used_options + unused_options
end
def to_json
MultiJson.encode({
:used_options => used_options,
:unused_options => unused_options
})
end
def write
tabfile.write to_json
end
end