Class: Caveats Private

Inherits:
Object show all
Extended by:
Forwardable
Defined in:
caveats.rb,
sorbet/rbi/dsl/caveats.rbi

Overview

This class is part of a private API. This class may only be used in the Homebrew/brew repository. Third parties should avoid using this class if possible, as it may be removed or changed without warning.

A formula's caveats.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(formula) ⇒ void

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:



14
15
16
17
18
# File 'caveats.rb', line 14

def initialize(formula)
  @formula = formula
  @caveats = T.let(nil, T.nilable(String))
  @completions_and_elisp = T.let(nil, T.nilable(T::Array[String]))
end

Instance Attribute Details

#formulaFormula (readonly)

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



11
12
13
# File 'caveats.rb', line 11

def formula
  @formula
end

Instance Method Details

#caveatsString

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'caveats.rb', line 21

def caveats
  @caveats ||= begin
    caveats = []
    build = formula.build
    begin
      formula.build = Tab.for_formula(formula)
      string = formula.caveats.to_s
      caveats << "#{string.chomp}\n" unless string.empty?
    ensure
      formula.build = build
    end
    caveats << keg_only_text
    caveats << shadowed_path_text
    caveats << service_caveats
    caveats.compact.join("\n")
  end
end

#completions_and_elispArray<String>

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'caveats.rb', line 47

def completions_and_elisp
  @completions_and_elisp ||= begin
    valid_shells = [:bash, :zsh, :fish, :pwsh].freeze
    current_shell = Utils::Shell.preferred || Utils::Shell.parent
    shells = if current_shell.present? &&
                (shell_sym = current_shell.to_sym) &&
                valid_shells.include?(shell_sym)
      [shell_sym]
    else
      valid_shells
    end
    completions_and_elisp = shells.map do |shell|
      function_completion_caveats(shell)
    end
    completions_and_elisp << elisp_caveats
    completions_and_elisp.compact
  end
end

#empty?Boolean

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:

  • (Boolean)


40
41
42
# File 'caveats.rb', line 40

def empty?
  caveats.blank? && completions_and_elisp.blank?
end

#keg_only_text(skip_reason: false) ⇒ String?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Parameters:

  • skip_reason (Boolean) (defaults to: false)

Returns:



67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'caveats.rb', line 67

def keg_only_text(skip_reason: false)
  return unless formula.keg_only?
  return if formula.linked?

  s = if skip_reason
    ""
  else
    <<~EOS
      #{formula.name} is keg-only, which means it was not symlinked into #{HOMEBREW_PREFIX},
      because #{formula.keg_only_reason.to_s.chomp}.
    EOS
  end.dup

  if formula.bin.directory? || formula.sbin.directory?
    s << <<~EOS

      If you need to have #{formula.name} first in your PATH, run:
    EOS
    s << "  #{Utils::Shell.prepend_path_in_profile(formula.opt_bin.to_s)}\n" if formula.bin.directory?
    s << "  #{Utils::Shell.prepend_path_in_profile(formula.opt_sbin.to_s)}\n" if formula.sbin.directory?
  end

  if formula.lib.directory? || formula.include.directory?
    s << <<~EOS

      For compilers to find #{formula.name} you may need to set:
    EOS

    s << "  #{Utils::Shell.export_value("LDFLAGS", "-L#{formula.opt_lib}")}\n" if formula.lib.directory?

    s << "  #{Utils::Shell.export_value("CPPFLAGS", "-I#{formula.opt_include}")}\n" if formula.include.directory?

    if which("pkgconf", ORIGINAL_PATHS) &&
       ((formula.lib/"pkgconfig").directory? || (formula.share/"pkgconfig").directory?)
      s << <<~EOS

        For pkgconf to find #{formula.name} you may need to set:
      EOS

      if (formula.lib/"pkgconfig").directory?
        s << "  #{Utils::Shell.export_value("PKG_CONFIG_PATH", "#{formula.opt_lib}/pkgconfig")}\n"
      end

      if (formula.share/"pkgconfig").directory?
        s << "  #{Utils::Shell.export_value("PKG_CONFIG_PATH", "#{formula.opt_share}/pkgconfig")}\n"
      end
    end

    if which("cmake", ORIGINAL_PATHS) &&
       ((formula.lib/"cmake").directory? || (formula.share/"cmake").directory?)
      s << <<~EOS

        For cmake to find #{formula.name} you may need to set:
          #{Utils::Shell.export_value("CMAKE_PREFIX_PATH", formula.opt_prefix.to_s)}
      EOS
    end
  end
  s << "\n" unless s.end_with?("\n")
  s
end

#shadowed_path_textString?

This method is part of a private API. This method may only be used in the Homebrew/brew repository. Third parties should avoid using this method if possible, as it may be removed or changed without warning.

Returns:



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'caveats.rb', line 129

def shadowed_path_text
  return if Homebrew::EnvConfig.no_path_shadow_check?
  return unless formula.any_version_installed?

  shadowed = shadowed_executables
  shadowed = shadowed.select { |_, shadower| sibling_keg_name(shadower) } if formula.keg_only? && !formula.linked?
  return if shadowed.empty?

  sibling, external = shadowed.sort_by(&:first).partition { |_, shadower| sibling_keg_name(shadower) }
  blocks = []

  if external.any?
    lines = external.map { |name, shadower| "  #{name} (shadowed by #{shadower})" }
    blocks << <<~EOS
      The following #{formula.name} executables are shadowed by other commands earlier in your PATH:
      #{lines.join("\n")}
      Running these by name will not invoke the version provided by Homebrew.
    EOS
  end

  if sibling.any?
    lines = sibling.map do |name, shadower|
      "  #{name} (shadowed by #{shadower} from #{sibling_keg_name(shadower)})"
    end
    blocks << <<~EOS
      The following #{formula.name} executables are shadowed by other linked Homebrew commands:
      #{lines.join("\n")}
      Running these by name will not invoke the version provided by this formula.
      Run `brew link #{formula.name}` to switch the active version to this keg.
    EOS
  end

  s = blocks.join("\n").dup
  unless Homebrew::EnvConfig.no_env_hints?
    s << "Disable this behaviour by setting `HOMEBREW_NO_PATH_SHADOW_CHECK=1`.\n"
    s << "Hide these hints with `HOMEBREW_NO_ENV_HINTS=1` (see `man brew`).\n"
  end
  s
end