diff --git a/Library/Homebrew/formula.rb b/Library/Homebrew/formula.rb index 5953b36097..56f587ff47 100644 --- a/Library/Homebrew/formula.rb +++ b/Library/Homebrew/formula.rb @@ -2918,8 +2918,34 @@ class Formula # # 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) + # + # Alternatively, a preset reason can be passed as a symbol: + #
pour_bottle? :default_prefix_required
+ #
pour_bottle? :clt_required
+ def pour_bottle?(requirement = nil, &block) @pour_bottle_check = PourBottleCheck.new(self) + + block ||= case requirement + when :default_prefix_required + lambda do |_| + T.cast(self, PourBottleCheck).reason(+<<~EOS) + The bottle needs to be installed into #{Homebrew::DEFAULT_PREFIX}. + EOS + T.cast(self, PourBottleCheck).satisfy { HOMEBREW_PREFIX.to_s == Homebrew::DEFAULT_PREFIX } + end + when :clt_required + lambda do |_| + on_macos do + T.cast(self, PourBottleCheck).reason(+<<~EOS) + The bottle needs the Apple Command Line Tools to be installed. + You can install them, if desired, with: + xcode-select --install + EOS + T.cast(self, PourBottleCheck).satisfy { MacOS::CLT.installed? } + end + end + end + @pour_bottle_check.instance_eval(&block) end diff --git a/Library/Homebrew/test/formula_spec.rb b/Library/Homebrew/test/formula_spec.rb index 2cdb36c091..182fbc8781 100644 --- a/Library/Homebrew/test/formula_spec.rb +++ b/Library/Homebrew/test/formula_spec.rb @@ -995,6 +995,31 @@ describe Formula do expect(f).to pour_bottle end + + it "returns false when set with a symbol" do + f = formula "foo" do + url "foo-1.0" + + pour_bottle? :default_prefix_required + end + + # Homebrew::DEFAULT_PREFIX is still /usr/local or /opt/homebrew + # and HOMEBREW_PREFIX is a temporary test directory + expect(f).not_to pour_bottle + end + + it "returns true when set with a symbol" do + # Ensure that prefix matches the default + stub_const "Homebrew::DEFAULT_PREFIX", HOMEBREW_PREFIX.to_s + + f = formula "foo" do + url "foo-1.0" + + pour_bottle? :default_prefix_required + end + + expect(f).to pour_bottle + end end describe "alias changes" do