diff --git a/Library/Homebrew/cmd/install.rb b/Library/Homebrew/cmd/install.rb index 2acf8cd5da..a87284d834 100644 --- a/Library/Homebrew/cmd/install.rb +++ b/Library/Homebrew/cmd/install.rb @@ -249,6 +249,7 @@ module Homebrew Migrator.migrate_if_needed(f) install_formula(f) end + Homebrew.messages.display_messages rescue FormulaUnreadableError, FormulaClassUnavailableError, TapFormulaUnreadableError, TapFormulaClassUnavailableError => e # Need to rescue before `FormulaUnavailableError` (superclass of this) diff --git a/Library/Homebrew/cmd/reinstall.rb b/Library/Homebrew/cmd/reinstall.rb index 420c08dfe8..e32eb8c239 100644 --- a/Library/Homebrew/cmd/reinstall.rb +++ b/Library/Homebrew/cmd/reinstall.rb @@ -3,6 +3,7 @@ require "formula_installer" require "development_tools" +require "messages" module Homebrew module_function @@ -18,6 +19,7 @@ module Homebrew Migrator.migrate_if_needed(f) reinstall_formula(f) end + Homebrew.messages.display_messages end def reinstall_formula(f) diff --git a/Library/Homebrew/cmd/upgrade.rb b/Library/Homebrew/cmd/upgrade.rb index 9023451013..c6e79ea9f4 100644 --- a/Library/Homebrew/cmd/upgrade.rb +++ b/Library/Homebrew/cmd/upgrade.rb @@ -21,6 +21,7 @@ require "install" require "formula_installer" require "cleanup" require "development_tools" +require "messages" module Homebrew module_function @@ -102,6 +103,7 @@ module Homebrew onoe "#{f}: #{e}" end end + Homebrew.messages.display_messages end def upgrade_formula(f) diff --git a/Library/Homebrew/formula_installer.rb b/Library/Homebrew/formula_installer.rb index b34ad79393..ed08c958ee 100644 --- a/Library/Homebrew/formula_installer.rb +++ b/Library/Homebrew/formula_installer.rb @@ -14,6 +14,7 @@ require "development_tools" require "cache_store" require "linkage_checker" require "install" +require "messages" class FormulaInstaller include FormulaCellarChecks @@ -348,6 +349,7 @@ class FormulaInstaller build_bottle_postinstall if build_bottle? opoo "Nothing was installed to #{formula.prefix}" unless formula.installed? + Homebrew.messages.formula_installed(formula) end def check_conflicts @@ -604,6 +606,7 @@ class FormulaInstaller return if caveats.empty? @show_summary_heading = true ohai "Caveats", caveats.to_s + Homebrew.messages.record_caveats(formula, caveats) end def finish diff --git a/Library/Homebrew/global.rb b/Library/Homebrew/global.rb index d5c53f4b2c..9f7661c719 100644 --- a/Library/Homebrew/global.rb +++ b/Library/Homebrew/global.rb @@ -1,6 +1,7 @@ require "pathname" require "English" require "ostruct" +require "messages" require "pp" require "extend/ARGV" @@ -49,6 +50,10 @@ module Homebrew @args ||= OpenStruct.new end + def messages + @messages ||= Messages.new + end + def raise_deprecation_exceptions? @raise_deprecation_exceptions == true end diff --git a/Library/Homebrew/messages.rb b/Library/Homebrew/messages.rb new file mode 100644 index 0000000000..bf56934c84 --- /dev/null +++ b/Library/Homebrew/messages.rb @@ -0,0 +1,31 @@ +# A Messages object collects messages that may need to be displayed together +# at the end of a multi-step `brew` command run +class Messages + attr_reader :caveats, :formula_count + + def initialize + @caveats = [] + @formula_count = 0 + end + + def record_caveats(f, caveats) + @caveats.push(formula: f.name, caveats: caveats) + end + + def formula_installed(_f) + @formula_count += 1 + end + + def display_messages + display_caveats + end + + def display_caveats + return if @formula_count <= 1 + return if @caveats.empty? + oh1 "Caveats" + @caveats.each do |c| + ohai c[:formula], c[:caveats] + end + end +end diff --git a/Library/Homebrew/test/messages_spec.rb b/Library/Homebrew/test/messages_spec.rb new file mode 100644 index 0000000000..baeed4f7d1 --- /dev/null +++ b/Library/Homebrew/test/messages_spec.rb @@ -0,0 +1,36 @@ +require "messages" +require "spec_helper" + +describe Messages do + before do + @m = Messages.new + f_foo = formula("foo") do + url "http://example.com/foo-0.1.tgz" + end + f_bar = formula("bar") do + url "http://example.com/bar-0.1.tgz" + end + f_baz = formula("baz") do + url "http://example.com/baz-0.1.tgz" + end + @m.formula_installed(f_foo) + @m.record_caveats(f_foo, "Zsh completions were installed") + @m.formula_installed(f_bar) + @m.record_caveats(f_bar, "Keg-only formula") + @m.formula_installed(f_baz) + @m.record_caveats(f_baz, "A valid GOPATH is required to use the go command") + end + + it "has the right installed-formula count" do + expect(@m.formula_count).to equal(3) + end + + it "has recorded caveats" do + expect(@m.caveats).to_not be_empty + end + + it "maintained the order of recorded caveats" do + caveats_formula_order = @m.caveats.map { |x| x[:formula] } + expect(caveats_formula_order).to eq(["foo", "bar", "baz"]) + end +end