From 00af5250f0a7988178ed8d26520bf1a98a8dea9a Mon Sep 17 00:00:00 2001
From: Alex Dunn <dunn.alex@gmail.com>
Date: Tue, 7 Mar 2017 10:36:57 -0800
Subject: [PATCH] caveats: combine completion and function messages

Fixes https://github.com/Homebrew/homebrew-core/issues/10338.

Closes #2287.

Signed-off-by: Alex Dunn <dunn.alex@gmail.com>
---
 Library/Homebrew/caveats.rb | 79 +++++++++++++------------------------
 Library/Homebrew/keg.rb     | 27 +++++++------
 2 files changed, 42 insertions(+), 64 deletions(-)

diff --git a/Library/Homebrew/caveats.rb b/Library/Homebrew/caveats.rb
index f5543cf49a..61b7034691 100644
--- a/Library/Homebrew/caveats.rb
+++ b/Library/Homebrew/caveats.rb
@@ -16,11 +16,9 @@ class Caveats
       f.build = build
     end
     caveats << keg_only_text
-    caveats << bash_completion_caveats
-    caveats << zsh_completion_caveats
-    caveats << fish_completion_caveats
-    caveats << zsh_function_caveats
-    caveats << fish_function_caveats
+    caveats << function_completion_caveats(:bash)
+    caveats << function_completion_caveats(:zsh)
+    caveats << function_completion_caveats(:fish)
     caveats << plist_caveats
     caveats << python_caveats
     caveats << elisp_caveats
@@ -72,56 +70,35 @@ class Caveats
     s << "\n"
   end
 
-  def bash_completion_caveats
+  def function_completion_caveats(shell)
     return unless keg
-    return unless keg.completion_installed?(:bash)
+    return unless which(shell.to_s)
 
-    <<-EOS.undent
-      Bash completion has been installed to:
-        #{HOMEBREW_PREFIX}/etc/bash_completion.d
-    EOS
-  end
-
-  def zsh_completion_caveats
-    return unless keg
-    return unless keg.completion_installed?(:zsh)
-
-    <<-EOS.undent
-      zsh completion has been installed to:
-        #{HOMEBREW_PREFIX}/share/zsh/site-functions
-    EOS
-  end
-
-  def fish_completion_caveats
-    return unless keg
-    return unless keg.completion_installed?(:fish)
-    return unless which("fish")
+    completion_installed = keg.completion_installed?(shell)
+    functions_installed = keg.functions_installed?(shell)
+    return unless completion_installed || functions_installed
 
-    <<-EOS.undent
-      fish completion has been installed to:
-        #{HOMEBREW_PREFIX}/share/fish/vendor_completions.d
-    EOS
-  end
+    installed = []
+    installed << "completions" if completion_installed
+    installed << "functions" if functions_installed
 
-  def zsh_function_caveats
-    return unless keg
-    return unless keg.zsh_functions_installed?
-
-    <<-EOS.undent
-      zsh functions have been installed to:
-        #{HOMEBREW_PREFIX}/share/zsh/site-functions
-    EOS
-  end
-
-  def fish_function_caveats
-    return unless keg
-    return unless keg.fish_functions_installed?
-    return unless which("fish")
-
-    <<-EOS.undent
-      fish functions have been installed to:
-        #{HOMEBREW_PREFIX}/share/fish/vendor_functions.d
-    EOS
+    case shell
+    when :bash
+      <<-EOS.undent
+        Bash completion has been installed to:
+          #{HOMEBREW_PREFIX}/etc/bash_completion.d
+      EOS
+    when :zsh
+      <<-EOS.undent
+        zsh #{installed.join(" and ")} have been installed to:
+          #{HOMEBREW_PREFIX}/share/zsh/site-functions
+      EOS
+    when :fish
+      fish_caveats = "fish #{installed.join(" and ")} have been installed to:"
+      fish_caveats << "\n  #{HOMEBREW_PREFIX}/share/fish/vendor_completions.d" if completion_installed
+      fish_caveats << "\n  #{HOMEBREW_PREFIX}/share/fish/vendor_functions.d" if functions_installed
+      fish_caveats
+    end
   end
 
   def python_caveats
diff --git a/Library/Homebrew/keg.rb b/Library/Homebrew/keg.rb
index 86733860cd..cb9cd91139 100644
--- a/Library/Homebrew/keg.rb
+++ b/Library/Homebrew/keg.rb
@@ -302,23 +302,24 @@ class Keg
     dir = case shell
     when :bash then path.join("etc", "bash_completion.d")
     when :zsh
-      dir = path.join("share", "zsh", "site-functions")
-      dir if dir && dir.directory? && dir.children.any? { |f| f.basename.to_s.start_with?("_") }
-    when :fish then path.join("share", "fish", "vendor_completions.d")
+      dir = path/"share/zsh/site-functions"
+      dir if dir.directory? && dir.children.any? { |f| f.basename.to_s.start_with?("_") }
+    when :fish then path/"share/fish/vendor_completions.d"
     end
     dir && dir.directory? && !dir.children.empty?
   end
 
-  def zsh_functions_installed?
-    # Check for non completion functions (i.e. files not started with an underscore),
-    # since those can be checked separately
-    dir = path.join("share", "zsh", "site-functions")
-    dir && dir.directory? && dir.children.any? { |f| !f.basename.to_s.start_with?("_") }
-  end
-
-  def fish_functions_installed?
-    dir = path.join("share", "fish", "vendor_functions.d")
-    dir && dir.directory? && !dir.children.empty?
+  def functions_installed?(shell)
+    case shell
+    when :fish
+      dir = path/"share/fish/vendor_functions.d"
+      dir.directory? && !dir.children.empty?
+    when :zsh
+      # Check for non completion functions (i.e. files not started with an underscore),
+      # since those can be checked separately
+      dir = path/"share/zsh/site-functions"
+      dir.directory? && dir.children.any? { |f| !f.basename.to_s.start_with?("_") }
+    end
   end
 
   def plist_installed?
-- 
GitLab