Class: Homebrew::Bundle::Brew Private

Inherits:
PackageType show all
Extended by:
Utils::Output::Mixin
Defined in:
bundle/brew.rb,
bundle/brew_services.rb

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.

Direct Known Subclasses

Services

Defined Under Namespace

Classes: Services, Topo

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Utils::Output::Mixin

issue_reporting_message, odebug, odeprecated, odie, odisabled, ofail, oh1, oh1_title, ohai, ohai_title, onoe, opoo, opoo_outside_github_actions, opoo_without_github_actions_annotation, pretty_deprecated, pretty_disabled, pretty_duration, pretty_install_status, pretty_installed, pretty_uninstalled, pretty_unmarked, pretty_upgradable, pretty_warning

Methods inherited from PackageType

check, #checkable_entries, dump_supported?, #exit_early_check, #format_checkable, #full_check, install_supported?

Constructor Details

#initialize(name = "", options = {}) ⇒ 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:

  • name (String) (defaults to: "")
  • options (Hash{Symbol => T.untyped}) (defaults to: {})


461
462
463
464
465
466
467
468
469
470
471
472
473
474
# File 'bundle/brew.rb', line 461

def initialize(name = "", options = {})
  super()
  @full_name = name
  @name = T.let(Utils.name_from_full_name(name), String)
  @args = T.let(options.fetch(:args, []).map { |arg| "--#{arg}" }, T::Array[String])
  @conflicts_with_arg = T.let(options.fetch(:conflicts_with, []), T::Array[String])
  @restart_service = T.let(options[:restart_service], T.nilable(T.any(Symbol, T::Boolean)))
  @start_service = T.let(options.fetch(:start_service, @restart_service), T.nilable(T.any(Symbol, T::Boolean)))
  @link = T.let(options.fetch(:link, nil), T.nilable(T.any(Symbol, T::Boolean)))
  @postinstall = T.let(options.fetch(:postinstall, nil), T.nilable(String))
  @version_file = T.let(options.fetch(:version_file, nil), T.nilable(String))
  @trusted = T.let(options.fetch(:trusted, false), T::Boolean)
  @changed = T.let(nil, T.nilable(T::Boolean))
end

Class Attribute Details

.formulae_by_name(name) ⇒ Hash{Symbol => T.untyped}?

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:

Returns:



252
253
254
# File 'bundle/brew.rb', line 252

def formulae_by_name(name)
  T.cast(formulae_by_full_name(name), T.nilable(T::Hash[Symbol, T.untyped])) || @formulae_by_name&.[](name)
end

Class Method Details

.check_labelString

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:



22
# File 'bundle/brew.rb', line 22

def check_label = "Formula"

.dump(describe: false, no_restart: 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:

  • describe (Boolean) (defaults to: false)
  • no_restart (Boolean) (defaults to: false)

Returns:



257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
# File 'bundle/brew.rb', line 257

def dump(describe: false, no_restart: false)
  require "bundle/brew_services"

  requested_formula = formulae.select do |f|
    f[:installed_on_request?]
  end
  trusted_formulae = Homebrew::Trust.trusted_entries(:formula)
  requested_formula.map do |f|
    brewline = if describe && f[:desc].present?
      f[:desc].split("\n").map { |s| "# #{s}\n" }.join
    else
      ""
    end
    brewline += "brew \"#{f[:full_name]}\""

    args = f[:args].map { |arg| "\"#{arg}\"" }.sort.join(", ")
    brewline += ", args: [#{args}]" unless f[:args].empty?
    brewline += ", restart_service: :changed" if !no_restart && Services.started?(f[:full_name])
    brewline += ", link: #{f[:link?]}" unless f[:link?].nil?
    brewline += ", trusted: true" if trusted_formulae.include?(f[:full_name])
    brewline
  end.join("\n")
end

.dump_output(describe: false, no_restart: 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:

  • describe (Boolean) (defaults to: false)
  • no_restart (Boolean) (defaults to: false)

Returns:



282
283
284
# File 'bundle/brew.rb', line 282

def dump_output(describe: false, no_restart: false)
  dump(describe:, no_restart:)
end

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:

Returns:

  • (Boolean)


102
103
104
105
106
107
108
109
110
111
# File 'bundle/brew.rb', line 102

def expected_link_status?(link, keg_only:)
  case link
  when :overwrite, true
    true
  when false
    false
  else
    !keg_only
  end
end

.fetchable_name(name, options = {}, no_upgrade: 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:

  • name (String)
  • options (Hash{Symbol => T.untyped}) (defaults to: {})
  • no_upgrade (Boolean) (defaults to: false)

Returns:



287
288
289
290
291
292
293
# File 'bundle/brew.rb', line 287

def fetchable_name(name, options = {}, no_upgrade: false)
  _ = options

  return if formula_installed_and_up_to_date?(name, no_upgrade:)

  name
end

.find_formula(name) ⇒ Hash{Symbol => T.untyped}?

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:

Returns:



193
194
195
196
# File 'bundle/brew.rb', line 193

def find_formula(name)
  formula = T.cast(formulae_by_full_name(name), T.nilable(T::Hash[Symbol, T.untyped]))
  formula.presence || formulae_by_name(name)
end

.formula_aliasesHash{String => 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:



296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
# File 'bundle/brew.rb', line 296

def formula_aliases
  return @formula_aliases if @formula_aliases

  @formula_aliases = {}
  formulae.each do |f|
    aliases = f[:aliases]
    next if aliases.blank?

    aliases.each do |a|
      @formula_aliases[a] = f[:full_name]
      if (tap_name = Utils.tap_from_full_name(f[:full_name]))
        @formula_aliases["#{tap_name}/#{a}"] = f[:full_name]
      end
    end
  end
  @formula_aliases
end

.formula_dep_names(name) ⇒ Array<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:

Returns:



199
200
201
# File 'bundle/brew.rb', line 199

def formula_dep_names(name)
  find_formula(name)&.fetch(:dependencies, []) || []
end

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:

Returns:

  • (Boolean, nil)


114
115
116
117
118
119
# File 'bundle/brew.rb', line 114

def formula_dump_link_status(formula)
  (
    @formulae_by_full_name&.[](formula) ||
    @formulae_by_name&.[](Utils.name_from_full_name(formula))
  )&.fetch(:link?)
end

.formula_in_array?(formula, array) ⇒ 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.

Parameters:

Returns:

  • (Boolean)


127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
# File 'bundle/brew.rb', line 127

def formula_in_array?(formula, array)
  return true if array.include?(formula)
  return true if array.include?(Utils.name_from_full_name(formula))

  old_name = formula_oldnames[formula]
  old_name ||= formula_oldnames[Utils.name_from_full_name(formula)]
  return true if old_name && array.include?(old_name)

  resolved_full_name = formula_aliases[formula]
  return false unless resolved_full_name
  return true if array.include?(resolved_full_name)
  return true if array.include?(Utils.name_from_full_name(resolved_full_name))

  false
end

.formula_installed?(formula) ⇒ 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.

Parameters:

Returns:

  • (Boolean)


144
145
146
147
148
149
150
# File 'bundle/brew.rb', line 144

def formula_installed?(formula)
  # Fully qualified tap formulae can be checked by their Cellar rack name
  # without loading the formula from an untrusted tap.
  return installed_formulae.include?(Utils.name_from_full_name(formula)) if Utils.full_name?(formula)

  formula_in_array?(formula, installed_formulae)
end

.formula_installed_and_up_to_date?(formula, no_upgrade: false) ⇒ 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.

Parameters:

  • formula (String)
  • no_upgrade (Boolean) (defaults to: false)

Returns:

  • (Boolean)


80
81
82
83
84
85
# File 'bundle/brew.rb', line 80

def formula_installed_and_up_to_date?(formula, no_upgrade: false)
  return false unless formula_installed?(formula)
  return true if no_upgrade_with_args?(no_upgrade, formula)

  !formula_upgradable?(formula)
end

.formula_oldnamesHash{String => 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:



315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
# File 'bundle/brew.rb', line 315

def formula_oldnames
  return @formula_oldnames if @formula_oldnames

  @formula_oldnames = {}
  formulae.each do |f|
    oldnames = f[:oldnames]
    next if oldnames.blank?

    oldnames.each do |oldname|
      @formula_oldnames[oldname] = f[:full_name]
      if (tap_name = Utils.tap_from_full_name(f[:full_name]))
        @formula_oldnames["#{tap_name}/#{oldname}"] = f[:full_name]
      end
    end
  end
  @formula_oldnames
end

.formula_upgradable?(formula) ⇒ 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.

Parameters:

Returns:

  • (Boolean)


153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'bundle/brew.rb', line 153

def formula_upgradable?(formula)
  return false unless formula_installed?(formula)

  # Reading the formula is needed for authoritative outdated state, so
  # report trust problems before the upgrade check tries to load it.
  if Utils.full_name?(formula) && Homebrew::EnvConfig.require_tap_trust?
    require "trust"

    unless Homebrew::Trust.trusted?(:formula, formula)
      opoo "Cannot check whether #{formula} is outdated because its tap is not trusted. " \
           "Run `brew trust --formula #{formula}` to trust it."
      return true
    end
  end

  # Check local cache first and then authoritative Homebrew source.
  (formula_in_array?(formula, upgradable_formulae) && Formula[formula].outdated?) || false
end

.formulaeArray<Hash{Symbol => T.untyped}>

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:



213
214
215
216
217
218
219
# File 'bundle/brew.rb', line 213

def formulae
  return @formulae if @formulae

  formulae_by_full_name
  # formulae_by_full_name sets @formulae as a side effect of calling sort!
  T.cast(@formulae, T::Array[T::Hash[Symbol, T.untyped]])
end

.formulae_by_full_name(name = nil) ⇒ Hash{Symbol => T.untyped}, ...

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 the full @formulae_by_full_name map when called without a name, or a single formula's attribute hash when called with a name.

Parameters:

  • name (String, nil) (defaults to: nil)

Returns:



228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
# File 'bundle/brew.rb', line 228

def formulae_by_full_name(name = nil)
  return @formulae_by_full_name[name] if name.present? && @formulae_by_full_name&.key?(name)

  require "formula"
  require "formulary"
  Formulary.enable_factory_cache!

  @formulae_by_name ||= {}
  @formulae_by_full_name ||= {}

  if name.nil?
    formulae = Formula.installed.map { add_formula(it) }
    sort!(formulae)
    return @formulae_by_full_name
  end

  formula = Formula[name]
  add_formula(formula)
rescue FormulaUnavailableError => e
  opoo "'#{name}' formula is unreadable: #{e}"
  {}
end

.inherited(subclass) ⇒ 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.

This method returns an undefined value.

Parameters:



25
26
27
28
29
# File 'bundle/brew.rb', line 25

def inherited(subclass)
  return if subclass.name == "Homebrew::Bundle::Brew::Services"

  super
end

.install!(name, preinstall: true, no_upgrade: false, verbose: false, force: false, **options) ⇒ 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.

Parameters:

  • name (String)
  • preinstall (Boolean) (defaults to: true)
  • no_upgrade (Boolean) (defaults to: false)
  • verbose (Boolean) (defaults to: false)
  • force (Boolean) (defaults to: false)
  • options (T.untyped)

Returns:

  • (Boolean)


61
62
63
# File 'bundle/brew.rb', line 61

def install!(name, preinstall: true, no_upgrade: false, verbose: false, force: false, **options)
  new(name, options).install!(preinstall:, no_upgrade:, verbose:, force:)
end

.install_verb(name, options = {}) ⇒ Object

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.



71
72
73
74
75
76
77
# File 'bundle/brew.rb', line 71

def install_verb(name, options = {})
  _ = options

  return "Installing" unless formula_upgradable?(name)

  "Upgrading"
end

.installed_formulaeArray<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:



173
174
175
# File 'bundle/brew.rb', line 173

def installed_formulae
  @installed_formulae ||= Formula.installed_formula_names
end

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:

Returns:

  • (Boolean, nil)


88
89
90
91
92
93
94
95
96
97
98
99
# File 'bundle/brew.rb', line 88

def link_status_to_check(formula, options)
  unless options.key?(:link)
    return case formula_dump_link_status(formula)
    when true
      false
    when false
      true
    end
  end

  expected_link_status?(options[:link], keg_only: Formula[formula].keg_only?)
end

.no_upgrade_with_args?(no_upgrade, formula_name) ⇒ 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.

Parameters:

  • no_upgrade (Boolean)
  • formula_name (String)

Returns:

  • (Boolean)


122
123
124
# File 'bundle/brew.rb', line 122

def no_upgrade_with_args?(no_upgrade, formula_name)
  no_upgrade && Bundle.upgrade_formulae.exclude?(formula_name)
end

.outdated_formulaeArray<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:



183
184
185
# File 'bundle/brew.rb', line 183

def outdated_formulae
  @outdated_formulae ||= formulae.filter_map { |f| f[:name] if f[:outdated?] }
end

.pinned_formulaeArray<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:



188
189
190
# File 'bundle/brew.rb', line 188

def pinned_formulae
  @pinned_formulae ||= formulae.filter_map { |f| f[:name] if f[:pinned?] }
end

.preinstall!(name, no_upgrade: false, verbose: false, **options) ⇒ 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.

Parameters:

  • name (String)
  • no_upgrade (Boolean) (defaults to: false)
  • verbose (Boolean) (defaults to: false)
  • options (T.untyped)

Returns:

  • (Boolean)


53
54
55
# File 'bundle/brew.rb', line 53

def preinstall!(name, no_upgrade: false, verbose: false, **options)
  new(name, options).preinstall!(no_upgrade:, verbose:)
end

.recursive_dep_names(name) ⇒ Set<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 recursive dependency names for lock conflict detection.

Parameters:

Returns:



205
206
207
208
209
210
# File 'bundle/brew.rb', line 205

def recursive_dep_names(name)
  require "formula"
  Formula[name].recursive_dependencies.to_set(&:name)
rescue FormulaUnavailableError
  Set.new
end

.reset!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.

This method returns an undefined value.



32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'bundle/brew.rb', line 32

def reset!
  require "bundle/brew_services"

  Homebrew::Bundle::Brew::Services.reset!
  @installed_formulae = T.let(nil, T.nilable(T::Array[String]))
  @outdated_formulae = T.let(nil, T.nilable(T::Array[String]))
  @pinned_formulae = T.let(nil, T.nilable(T::Array[String]))
  @formulae = T.let(nil, T.nilable(T::Array[T::Hash[Symbol, T.untyped]]))
  @formulae_by_full_name = T.let(nil, T.nilable(T::Hash[String, T::Hash[Symbol, T.untyped]]))
  @formulae_by_name = T.let(nil, T.nilable(T::Hash[String, T::Hash[Symbol, T.untyped]]))
  @formula_aliases = T.let(nil, T.nilable(T::Hash[String, String]))
  @formula_oldnames = T.let(nil, T.nilable(T::Hash[String, String]))
end

.typeSymbol

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:



19
# File 'bundle/brew.rb', line 19

def type = :brew

.upgradable_formulaeArray<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:



178
179
180
# File 'bundle/brew.rb', line 178

def upgradable_formulae
  outdated_formulae - pinned_formulae
end

Instance Method Details

#changed?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)


615
616
617
# File 'bundle/brew.rb', line 615

def changed?
  @changed.present?
end

#failure_reason(name, no_upgrade:) ⇒ 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:

  • name (Object)
  • no_upgrade (Boolean)

Returns:



489
490
491
492
493
494
495
496
497
498
499
# File 'bundle/brew.rb', line 489

def failure_reason(name, no_upgrade:)
  formula = formula_name(name)
  options = formula_options(name)
  return super(formula, no_upgrade:) unless self.class.formula_installed_and_up_to_date?(formula, no_upgrade:)

  link_status = self.class.link_status_to_check(formula, options)
  return super(formula, no_upgrade:) if link_status.nil?

  link_status = link_status ? "linked" : "unlinked"
  "Formula #{formula} needs to be #{link_status}."
end

#find_actionable(entries, exit_on_first_error: false, no_upgrade: false, verbose: false) ⇒ Array<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:

  • entries (Array<Dsl::Entry>)
  • exit_on_first_error (Boolean) (defaults to: false)
  • no_upgrade (Boolean) (defaults to: false)
  • verbose (Boolean) (defaults to: false)

Returns:



509
510
511
512
513
514
515
516
517
# File 'bundle/brew.rb', line 509

def find_actionable(entries, exit_on_first_error: false, no_upgrade: false, verbose: false)
  requested = instance_of?(Homebrew::Bundle::Brew) ? checkable_entries(entries) : format_checkable(entries)

  if exit_on_first_error
    exit_early_check(requested, no_upgrade:)
  else
    full_check(requested, no_upgrade:)
  end
end

#install!(preinstall: true, no_upgrade: false, verbose: false, force: false) ⇒ 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.

Parameters:

  • preinstall (Boolean) (defaults to: true)
  • no_upgrade (Boolean) (defaults to: false)
  • verbose (Boolean) (defaults to: false)
  • force (Boolean) (defaults to: false)

Returns:

  • (Boolean)


531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
# File 'bundle/brew.rb', line 531

def install!(preinstall: true, no_upgrade: false, verbose: false, force: false)
  install_result = if preinstall
    install_change_state!(no_upgrade:, verbose:, force:)
  else
    true
  end
  result = install_result

  if installed?
    service_result = service_change_state!(verbose:)
    result &&= service_result

    link_result = link_change_state!(verbose:)
    result &&= link_result

    postinstall_result = postinstall_change_state!(verbose:)
    result &&= postinstall_result

    if result && @version_file.present?
      # Use the version from the environment if it hasn't changed.
      # Strip the revision number because it's not part of the non-Homebrew version.
      version = if !changed? && (env_version = Bundle.formula_versions_from_env(@name))
        PkgVersion.parse(env_version).version
      else
        Formula[@full_name].version
      end.to_s
      File.write(@version_file, "#{version}\n")

      puts "Wrote #{@name} version #{version} to #{@version_file}" if verbose
    end
  end

  result
end

#install_change_state!(no_upgrade:, verbose:, force:) ⇒ 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.

Parameters:

  • no_upgrade (Boolean)
  • verbose (Boolean)
  • force (Boolean)

Returns:

  • (Boolean)


567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
# File 'bundle/brew.rb', line 567

def install_change_state!(no_upgrade:, verbose:, force:)
  require "tap"

  # Trust before tapping: installing the tap loads the formula, which
  # triggers the trust check before any later step could grant trust.
  # Only fully-qualified names map to a tap, so unqualified names cannot
  # be meaningfully trusted.
  Homebrew::Trust.trust!(:formula, @full_name) if @trusted && Utils.full_name?(@full_name)

  if (tap_with_name = ::Tap.with_formula_name(@full_name))
    tap, = tap_with_name
    tap.ensure_installed!
  end

  return false unless resolve_conflicts!(verbose:)

  if installed?
    upgrade_formula!(verbose:, force:)
  else
    install_formula!(verbose:, force:)
  end
end

#installed_and_up_to_date?(formula, no_upgrade: false) ⇒ 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.

Parameters:

  • formula (Object)
  • no_upgrade (Boolean) (defaults to: false)

Returns:

  • (Boolean)


477
478
479
480
481
482
483
484
485
486
# File 'bundle/brew.rb', line 477

def installed_and_up_to_date?(formula, no_upgrade: false)
  name = formula_name(formula)
  return false unless self.class.formula_installed_and_up_to_date?(name, no_upgrade:)

  options = formula_options(formula)
  link_status = self.class.link_status_to_check(name, options)
  return true if link_status.nil?

  Formula[name].linked? == link_status
end

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:

  • verbose (Boolean) (defaults to: false)

Returns:

  • (Boolean)


637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
# File 'bundle/brew.rb', line 637

def link_change_state!(verbose: false)
  link_args = []
  link_status = self.class.expected_link_status?(@link, keg_only: keg_only?)
  cmd = if link_status
    link_args << "--force" if unlinked_and_keg_only?
    link_args << "--overwrite" if @link == :overwrite
    "link" unless linked?
  elsif linked?
    "unlink"
  end

  if cmd.present?
    verb = "#{cmd}ing".capitalize
    with_args = " with #{link_args.join(" ")}" if link_args.present?
    puts "#{verb} #{@name} formula#{with_args}." if verbose
    return Bundle.brew(cmd, *link_args, @name, verbose:)
  end

  true
end

#postinstall_change_state!(verbose:) ⇒ 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.

Parameters:

  • verbose (Boolean)

Returns:

  • (Boolean)


659
660
661
662
663
664
665
# File 'bundle/brew.rb', line 659

def postinstall_change_state!(verbose:)
  return true if @postinstall.blank?
  return true unless changed?

  puts "Running postinstall for #{@name}: #{@postinstall}" if verbose
  Kernel.system(@postinstall) || false
end

#preinstall!(no_upgrade: false, verbose: false) ⇒ 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.

Parameters:

  • no_upgrade (Boolean) (defaults to: false)
  • verbose (Boolean) (defaults to: false)

Returns:

  • (Boolean)


520
521
522
523
524
525
526
527
528
# File 'bundle/brew.rb', line 520

def preinstall!(no_upgrade: false, verbose: false)
  if installed? && (self.class.no_upgrade_with_args?(no_upgrade, @name) || !upgradable?)
    puts "Skipping install of #{@name} formula. It is already installed." if verbose
    @changed = nil
    return false
  end

  true
end

#restart_service?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)


602
603
604
# File 'bundle/brew.rb', line 602

def restart_service?
  @restart_service.present?
end

#restart_service_needed?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)


607
608
609
610
611
612
# File 'bundle/brew.rb', line 607

def restart_service_needed?
  return false unless restart_service?

  # Restart if `restart_service: :always`, or if the formula was installed or upgraded
  @restart_service.to_s == "always" || changed?
end

#service_change_state!(verbose:) ⇒ 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.

Parameters:

  • verbose (Boolean)

Returns:

  • (Boolean)


620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
# File 'bundle/brew.rb', line 620

def service_change_state!(verbose:)
  require "bundle/brew_services"

  file = Services.versioned_service_file(@name)&.to_s

  if restart_service_needed?
    puts "Restarting #{@name} service." if verbose
    Services.restart(@full_name, file:, verbose:)
  elsif start_service_needed?
    puts "Starting #{@name} service." if verbose
    Services.start(@full_name, file:, verbose:)
  else
    true
  end
end

#start_service?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)


591
592
593
# File 'bundle/brew.rb', line 591

def start_service?
  @start_service.present?
end

#start_service_needed?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)


596
597
598
599
# File 'bundle/brew.rb', line 596

def start_service_needed?
  require "bundle/brew_services"
  start_service? && !Services.started?(@full_name)
end