Skip to content
Snippets Groups Projects
Commit 26ec9f9e authored by Mike McQuaid's avatar Mike McQuaid
Browse files

formula: add new pour_bottle DSL with reason.

This allows there to be a user-visible description of why a bottle is
not being installed.
parent 74858b28
No related branches found
No related tags found
No related merge requests found
......@@ -799,10 +799,16 @@ class Formula
# Can be overridden to selectively disable bottles from formulae.
# Defaults to true so overridden version does not have to check if bottles
# are supported.
# Replaced by {.pour_bottle}'s `satisfy` method if it is specified.
def pour_bottle?
true
end
# @private
def pour_bottle_check_unsatisfied_reason
self.class.pour_bottle_check_unsatisfied_reason
end
# Can be overridden to run commands on both source and bottle installation.
def post_install; end
......@@ -1614,6 +1620,11 @@ class Formula
# @private
attr_reader :plist_manual
# If `pour_bottle?` returns `false` the user-visible reason to display for
# why they cannot use the bottle.
# @private
attr_accessor :pour_bottle_check_unsatisfied_reason
# @!attribute [w] revision
# Used for creating new Homebrew versions of software without new upstream
# versions. For example, if we bump the major version of a library this
......@@ -2023,11 +2034,27 @@ class Formula
#
# The test will fail if it returns false, or if an exception is raised.
# Failed assertions and failed `system` commands will raise exceptions.
def test(&block)
define_method(:test, &block)
end
# Defines whether the {Formula}'s bottle can be used on the given Homebrew
# installation.
#
# For example, if the bottle requires the Xcode CLT to be installed a
# {Formula} would declare:
# <pre>pour_bottle? do
# reason "The bottle needs the Xcode CLT to be installed."
# satisfy { MacOS::CLT.installed? }
# end</pre>
#
# If `satisfy` returns `false` then a bottle will not be used and instead
# the {Formula} will be built from source and `reason` will be printed.
def pour_bottle?(&block)
@pour_bottle_check = PourBottleCheck.new(self)
@pour_bottle_check.instance_eval(&block)
end
# @private
def link_overwrite(*paths)
paths.flatten!
......
......@@ -351,7 +351,7 @@ class PourBottleCheck
end
def reason(reason)
@formula.pour_bottle_check_unsatisfied_reason(reason)
@formula.pour_bottle_check_unsatisfied_reason = reason
end
def satisfy(&block)
......
......@@ -367,4 +367,42 @@ class FormulaTests < Homebrew::TestCase
[f1, f2, f3].each(&:clear_cache)
f3.rack.rmtree
end
def test_pour_bottle
f_false = formula("foo") do
url "foo-1.0"
def pour_bottle?
false
end
end
refute f_false.pour_bottle?
f_true = formula("foo") do
url "foo-1.0"
def pour_bottle?
true
end
end
assert f_true.pour_bottle?
end
def test_pour_bottle_dsl
f_false = formula("foo") do
url "foo-1.0"
pour_bottle? do
reason "false reason"
satisfy { var == etc }
end
end
refute f_false.pour_bottle?
f_true = formula("foo") do
url "foo-1.0"
pour_bottle? do
reason "true reason"
satisfy { var == var }
end
end
assert f_true.pour_bottle?
end
end
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment