Merge pull request #19568 from Homebrew/bundle-lazy-require

bundle: `require` more lazily
This commit is contained in:
Carlo Cabrera 2025-03-24 16:24:07 +00:00 committed by GitHub
commit 09eceba798
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
55 changed files with 251 additions and 131 deletions

View File

@ -1,40 +1,89 @@
# typed: strict # typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true # frozen_string_literal: true
require "bundle/brewfile" require "English"
require "bundle/bundle"
require "bundle/dsl" module Homebrew
require "bundle/adder" module Bundle
require "bundle/checker" class << self
require "bundle/remover" def system(cmd, *args, verbose: false)
require "bundle/skipper" return super cmd, *args if verbose
require "bundle/brew_services"
require "bundle/brew_service_checker" logs = []
require "bundle/brew_installer" success = T.let(nil, T.nilable(T::Boolean))
require "bundle/brew_checker" IO.popen([cmd, *args], err: [:child, :out]) do |pipe|
require "bundle/cask_installer" while (buf = pipe.gets)
require "bundle/mac_app_store_installer" logs << buf
require "bundle/mac_app_store_checker" end
require "bundle/tap_installer" Process.wait(pipe.pid)
require "bundle/brew_dumper" success = $CHILD_STATUS.success?
require "bundle/cask_dumper" pipe.close
require "bundle/cask_checker" end
require "bundle/mac_app_store_dumper" puts logs.join unless success
require "bundle/tap_dumper" success
require "bundle/tap_checker" end
require "bundle/dumper"
require "bundle/installer" def brew(*args, verbose: false)
require "bundle/lister" system(HOMEBREW_BREW_FILE, *args, verbose:)
require "bundle/commands/install" end
require "bundle/commands/dump"
require "bundle/commands/cleanup" def mas_installed?
require "bundle/commands/check" @mas_installed ||= which_formula("mas")
require "bundle/commands/exec" end
require "bundle/commands/list"
require "bundle/commands/add" def vscode_installed?
require "bundle/commands/remove" @vscode_installed ||= which_vscode.present?
require "bundle/whalebrew_installer" end
require "bundle/whalebrew_dumper"
require "bundle/vscode_extension_checker" def which_vscode
require "bundle/vscode_extension_dumper" @which_vscode ||= which("code", ORIGINAL_PATHS)
require "bundle/vscode_extension_installer" @which_vscode ||= which("codium", ORIGINAL_PATHS)
@which_vscode ||= which("cursor", ORIGINAL_PATHS)
@which_vscode ||= which("code-insiders", ORIGINAL_PATHS)
end
def whalebrew_installed?
@whalebrew_installed ||= which_formula("whalebrew")
end
def cask_installed?
@cask_installed ||= File.directory?("#{HOMEBREW_PREFIX}/Caskroom") &&
(File.directory?("#{HOMEBREW_LIBRARY}/Taps/homebrew/homebrew-cask") ||
!Homebrew::EnvConfig.no_install_from_api?)
end
def which_formula(name)
formula = Formulary.factory(name)
ENV["PATH"] = "#{formula.opt_bin}:#{ENV.fetch("PATH", nil)}" if formula.any_version_installed?
which(name).present?
end
def exchange_uid_if_needed!(&block)
euid = Process.euid
uid = Process.uid
return yield if euid == uid
old_euid = euid
process_reexchangeable = Process::UID.re_exchangeable?
if process_reexchangeable
Process::UID.re_exchange
else
Process::Sys.seteuid(uid)
end
home = T.must(Etc.getpwuid(Process.uid)).dir
return_value = with_env("HOME" => home, &block)
if process_reexchangeable
Process::UID.re_exchange
else
Process::Sys.seteuid(old_euid)
end
return_value
end
end
end
end
require "extend/os/bundle/bundle"

View File

@ -1,6 +1,9 @@
# typed: true # rubocop:todo Sorbet/StrictSigil # typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true # frozen_string_literal: true
require "bundle/brewfile"
require "bundle/dumper"
module Homebrew module Homebrew
module Bundle module Bundle
module Adder module Adder

View File

@ -1,6 +1,8 @@
# typed: true # rubocop:todo Sorbet/StrictSigil # typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true # frozen_string_literal: true
require "bundle/brew_installer"
module Homebrew module Homebrew
module Bundle module Bundle
module Checker module Checker

View File

@ -11,6 +11,8 @@ module Homebrew
module_function module_function
def reset! def reset!
require "bundle/brew_services"
Homebrew::Bundle::BrewServices.reset! Homebrew::Bundle::BrewServices.reset!
@formulae = nil @formulae = nil
@formulae_by_full_name = nil @formulae_by_full_name = nil
@ -54,6 +56,8 @@ module Homebrew
end end
def dump(describe: false, no_restart: false) def dump(describe: false, no_restart: false)
require "bundle/brew_services"
requested_formula = formulae.select do |f| requested_formula = formulae.select do |f|
f[:installed_on_request?] || !f[:installed_as_dependency?] f[:installed_on_request?] || !f[:installed_as_dependency?]
end end

View File

@ -77,6 +77,7 @@ module Homebrew
end end
def start_service_needed? def start_service_needed?
require "bundle/brew_services"
start_service? && !BrewServices.started?(@full_name) start_service? && !BrewServices.started?(@full_name)
end end
@ -96,6 +97,7 @@ module Homebrew
end end
def service_change_state!(verbose:) def service_change_state!(verbose:)
require "bundle/brew_services"
if restart_service_needed? if restart_service_needed?
puts "Restarting #{@name} service." if verbose puts "Restarting #{@name} service." if verbose
BrewServices.restart(@full_name, verbose:) BrewServices.restart(@full_name, verbose:)
@ -156,6 +158,7 @@ module Homebrew
return true if array.include?(formula) return true if array.include?(formula)
return true if array.include?(formula.split("/").last) return true if array.include?(formula.split("/").last)
require "bundle/brew_dumper"
old_names = Homebrew::Bundle::BrewDumper.formula_oldnames old_names = Homebrew::Bundle::BrewDumper.formula_oldnames
old_name = old_names[formula] old_name = old_names[formula]
old_name ||= old_names[formula.split("/").last] old_name ||= old_names[formula.split("/").last]
@ -195,6 +198,7 @@ module Homebrew
end end
def self.formulae def self.formulae
require "bundle/brew_dumper"
Homebrew::Bundle::BrewDumper.formulae Homebrew::Bundle::BrewDumper.formulae
end end
@ -225,6 +229,7 @@ module Homebrew
conflicts_with = Set.new conflicts_with = Set.new
conflicts_with += @conflicts_with_arg conflicts_with += @conflicts_with_arg
require "bundle/brew_dumper"
if (formula = Homebrew::Bundle::BrewDumper.formulae_by_full_name(@full_name)) && if (formula = Homebrew::Bundle::BrewDumper.formulae_by_full_name(@full_name)) &&
(formula_conflicts_with = formula[:conflicts_with]) (formula_conflicts_with = formula[:conflicts_with])
conflicts_with += formula_conflicts_with conflicts_with += formula_conflicts_with
@ -246,10 +251,11 @@ module Homebrew
end end
return false unless Bundle.brew("unlink", conflict, verbose:) return false unless Bundle.brew("unlink", conflict, verbose:)
if restart_service? next unless restart_service?
puts "Stopping #{conflict} service (if it is running)." if verbose
BrewServices.stop(conflict, verbose:) require "bundle/brew_services"
end puts "Stopping #{conflict} service (if it is running)." if verbose
BrewServices.stop(conflict, verbose:)
end end
true true

View File

@ -24,6 +24,7 @@ module Homebrew
end end
def entry_to_formula(entry) def entry_to_formula(entry)
require "bundle/brew_installer"
Homebrew::Bundle::BrewInstaller.new(entry.name, entry.options) Homebrew::Bundle::BrewInstaller.new(entry.name, entry.options)
end end
@ -32,10 +33,12 @@ module Homebrew
end end
def service_is_started?(service_name) def service_is_started?(service_name)
require "bundle/brew_services"
Homebrew::Bundle::BrewServices.started?(service_name) Homebrew::Bundle::BrewServices.started?(service_name)
end end
def lookup_old_name(service_name) def lookup_old_name(service_name)
require "bundle/brew_dumper"
@old_names ||= Homebrew::Bundle::BrewDumper.formula_oldnames @old_names ||= Homebrew::Bundle::BrewDumper.formula_oldnames
old_name = @old_names[service_name] old_name = @old_names[service_name]
old_name ||= @old_names[service_name.split("/").last] old_name ||= @old_names[service_name.split("/").last]

View File

@ -1,6 +1,8 @@
# typed: true # rubocop:todo Sorbet/StrictSigil # typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true # frozen_string_literal: true
require "bundle/dsl"
module Homebrew module Homebrew
module Bundle module Bundle
module Brewfile module Brewfile

View File

@ -1,89 +0,0 @@
# typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true
require "English"
module Homebrew
module Bundle
class << self
def system(cmd, *args, verbose: false)
return super cmd, *args if verbose
logs = []
success = T.let(nil, T.nilable(T::Boolean))
IO.popen([cmd, *args], err: [:child, :out]) do |pipe|
while (buf = pipe.gets)
logs << buf
end
Process.wait(pipe.pid)
success = $CHILD_STATUS.success?
pipe.close
end
puts logs.join unless success
success
end
def brew(*args, verbose: false)
system(HOMEBREW_BREW_FILE, *args, verbose:)
end
def mas_installed?
@mas_installed ||= which_formula("mas")
end
def vscode_installed?
@vscode_installed ||= which_vscode.present?
end
def which_vscode
@which_vscode ||= which("code", ORIGINAL_PATHS)
@which_vscode ||= which("codium", ORIGINAL_PATHS)
@which_vscode ||= which("cursor", ORIGINAL_PATHS)
@which_vscode ||= which("code-insiders", ORIGINAL_PATHS)
end
def whalebrew_installed?
@whalebrew_installed ||= which_formula("whalebrew")
end
def cask_installed?
@cask_installed ||= File.directory?("#{HOMEBREW_PREFIX}/Caskroom") &&
(File.directory?("#{HOMEBREW_LIBRARY}/Taps/homebrew/homebrew-cask") ||
!Homebrew::EnvConfig.no_install_from_api?)
end
def which_formula(name)
formula = Formulary.factory(name)
ENV["PATH"] = "#{formula.opt_bin}:#{ENV.fetch("PATH", nil)}" if formula.any_version_installed?
which(name).present?
end
def exchange_uid_if_needed!(&block)
euid = Process.euid
uid = Process.uid
return yield if euid == uid
old_euid = euid
process_reexchangeable = Process::UID.re_exchangeable?
if process_reexchangeable
Process::UID.re_exchange
else
Process::Sys.seteuid(uid)
end
home = T.must(Etc.getpwuid(Process.uid)).dir
return_value = with_env("HOME" => home, &block)
if process_reexchangeable
Process::UID.re_exchange
else
Process::Sys.seteuid(old_euid)
end
return_value
end
end
end
end
require "extend/os/bundle/bundle"

View File

@ -1,6 +1,8 @@
# typed: true # rubocop:todo Sorbet/StrictSigil # typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true # frozen_string_literal: true
require "bundle/cask_installer"
module Homebrew module Homebrew
module Bundle module Bundle
module Checker module Checker

View File

@ -14,6 +14,7 @@ module Homebrew
return true if outdated_casks.include?(name) return true if outdated_casks.include?(name)
return false unless options[:greedy] return false unless options[:greedy]
require "bundle/cask_dumper"
Homebrew::Bundle::CaskDumper.cask_is_outdated_using_greedy?(name) Homebrew::Bundle::CaskDumper.cask_is_outdated_using_greedy?(name)
end end
@ -95,10 +96,12 @@ module Homebrew
end end
def self.installed_casks def self.installed_casks
require "bundle/cask_dumper"
@installed_casks ||= Homebrew::Bundle::CaskDumper.cask_names @installed_casks ||= Homebrew::Bundle::CaskDumper.cask_names
end end
def self.outdated_casks def self.outdated_casks
require "bundle/cask_dumper"
@outdated_casks ||= Homebrew::Bundle::CaskDumper.outdated_cask_names @outdated_casks ||= Homebrew::Bundle::CaskDumper.outdated_cask_names
end end
end end

View File

@ -32,6 +32,7 @@ module Homebrew
end end
def checkable_entries(all_entries) def checkable_entries(all_entries)
require "bundle/skipper"
all_entries.select { |e| e.type == self.class::PACKAGE_TYPE } all_entries.select { |e| e.type == self.class::PACKAGE_TYPE }
.reject(&Bundle::Skipper.method(:skip?)) .reject(&Bundle::Skipper.method(:skip?))
end end
@ -67,6 +68,7 @@ module Homebrew
}.freeze }.freeze
def self.check(global: false, file: nil, exit_on_first_error: false, no_upgrade: false, verbose: false) def self.check(global: false, file: nil, exit_on_first_error: false, no_upgrade: false, verbose: false)
require "bundle/brewfile"
@dsl ||= Brewfile.read(global:, file:) @dsl ||= Brewfile.read(global:, file:)
check_method_names = CHECKS.keys check_method_names = CHECKS.keys
@ -88,6 +90,7 @@ module Homebrew
end end
def self.casks_to_install(exit_on_first_error: false, no_upgrade: false, verbose: false) def self.casks_to_install(exit_on_first_error: false, no_upgrade: false, verbose: false)
require "bundle/cask_checker"
Homebrew::Bundle::Checker::CaskChecker.new.find_actionable( Homebrew::Bundle::Checker::CaskChecker.new.find_actionable(
@dsl.entries, @dsl.entries,
exit_on_first_error:, no_upgrade:, verbose:, exit_on_first_error:, no_upgrade:, verbose:,
@ -95,6 +98,7 @@ module Homebrew
end end
def self.formulae_to_install(exit_on_first_error: false, no_upgrade: false, verbose: false) def self.formulae_to_install(exit_on_first_error: false, no_upgrade: false, verbose: false)
require "bundle/brew_checker"
Homebrew::Bundle::Checker::BrewChecker.new.find_actionable( Homebrew::Bundle::Checker::BrewChecker.new.find_actionable(
@dsl.entries, @dsl.entries,
exit_on_first_error:, no_upgrade:, verbose:, exit_on_first_error:, no_upgrade:, verbose:,
@ -102,6 +106,7 @@ module Homebrew
end end
def self.taps_to_tap(exit_on_first_error: false, no_upgrade: false, verbose: false) def self.taps_to_tap(exit_on_first_error: false, no_upgrade: false, verbose: false)
require "bundle/tap_checker"
Homebrew::Bundle::Checker::TapChecker.new.find_actionable( Homebrew::Bundle::Checker::TapChecker.new.find_actionable(
@dsl.entries, @dsl.entries,
exit_on_first_error:, no_upgrade:, verbose:, exit_on_first_error:, no_upgrade:, verbose:,
@ -109,6 +114,7 @@ module Homebrew
end end
def self.apps_to_install(exit_on_first_error: false, no_upgrade: false, verbose: false) def self.apps_to_install(exit_on_first_error: false, no_upgrade: false, verbose: false)
require "bundle/mac_app_store_checker"
Homebrew::Bundle::Checker::MacAppStoreChecker.new.find_actionable( Homebrew::Bundle::Checker::MacAppStoreChecker.new.find_actionable(
@dsl.entries, @dsl.entries,
exit_on_first_error:, no_upgrade:, verbose:, exit_on_first_error:, no_upgrade:, verbose:,
@ -116,6 +122,7 @@ module Homebrew
end end
def self.extensions_to_install(exit_on_first_error: false, no_upgrade: false, verbose: false) def self.extensions_to_install(exit_on_first_error: false, no_upgrade: false, verbose: false)
require "bundle/vscode_extension_checker"
Homebrew::Bundle::Checker::VscodeExtensionChecker.new.find_actionable( Homebrew::Bundle::Checker::VscodeExtensionChecker.new.find_actionable(
@dsl.entries, @dsl.entries,
exit_on_first_error:, no_upgrade:, verbose:, exit_on_first_error:, no_upgrade:, verbose:,
@ -123,6 +130,7 @@ module Homebrew
end end
def self.formulae_to_start(exit_on_first_error: false, no_upgrade: false, verbose: false) def self.formulae_to_start(exit_on_first_error: false, no_upgrade: false, verbose: false)
require "bundle/brew_service_checker"
Homebrew::Bundle::Checker::BrewServiceChecker.new.find_actionable( Homebrew::Bundle::Checker::BrewServiceChecker.new.find_actionable(
@dsl.entries, @dsl.entries,
exit_on_first_error:, no_upgrade:, verbose:, exit_on_first_error:, no_upgrade:, verbose:,
@ -130,6 +138,12 @@ module Homebrew
end end
def self.reset! def self.reset!
require "bundle/cask_dumper"
require "bundle/brew_dumper"
require "bundle/mac_app_store_dumper"
require "bundle/tap_dumper"
require "bundle/brew_services"
@dsl = nil @dsl = nil
Homebrew::Bundle::CaskDumper.reset! Homebrew::Bundle::CaskDumper.reset!
Homebrew::Bundle::BrewDumper.reset! Homebrew::Bundle::BrewDumper.reset!

View File

@ -1,6 +1,8 @@
# typed: true # rubocop:todo Sorbet/StrictSigil # typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true # frozen_string_literal: true
require "bundle/adder"
module Homebrew module Homebrew
module Bundle module Bundle
module Commands module Commands

View File

@ -1,6 +1,8 @@
# typed: true # rubocop:todo Sorbet/StrictSigil # typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true # frozen_string_literal: true
require "bundle/checker"
module Homebrew module Homebrew
module Bundle module Bundle
module Commands module Commands

View File

@ -9,6 +9,12 @@ module Homebrew
# TODO: refactor into multiple modules # TODO: refactor into multiple modules
module Cleanup module Cleanup
def self.reset! def self.reset!
require "bundle/cask_dumper"
require "bundle/brew_dumper"
require "bundle/tap_dumper"
require "bundle/vscode_extension_dumper"
require "bundle/brew_services"
@dsl = nil @dsl = nil
@kept_casks = nil @kept_casks = nil
@kept_formulae = nil @kept_formulae = nil
@ -87,12 +93,15 @@ module Homebrew
end end
def self.casks_to_uninstall(global: false, file: nil) def self.casks_to_uninstall(global: false, file: nil)
require "bundle/cask_dumper"
Homebrew::Bundle::CaskDumper.cask_names - kept_casks(global:, file:) Homebrew::Bundle::CaskDumper.cask_names - kept_casks(global:, file:)
end end
def self.formulae_to_uninstall(global: false, file: nil) def self.formulae_to_uninstall(global: false, file: nil)
kept_formulae = self.kept_formulae(global:, file:) kept_formulae = self.kept_formulae(global:, file:)
require "bundle/brew_dumper"
require "bundle/brew_installer"
current_formulae = Homebrew::Bundle::BrewDumper.formulae current_formulae = Homebrew::Bundle::BrewDumper.formulae
current_formulae.reject! do |f| current_formulae.reject! do |f|
Homebrew::Bundle::BrewInstaller.formula_in_array?(f[:full_name], kept_formulae) Homebrew::Bundle::BrewInstaller.formula_in_array?(f[:full_name], kept_formulae)
@ -101,6 +110,10 @@ module Homebrew
end end
private_class_method def self.kept_formulae(global: false, file: nil) private_class_method def self.kept_formulae(global: false, file: nil)
require "bundle/brewfile"
require "bundle/brew_dumper"
require "bundle/cask_dumper"
@kept_formulae ||= begin @kept_formulae ||= begin
@dsl ||= Brewfile.read(global:, file:) @dsl ||= Brewfile.read(global:, file:)
@ -117,6 +130,7 @@ module Homebrew
end end
private_class_method def self.kept_casks(global: false, file: nil) private_class_method def self.kept_casks(global: false, file: nil)
require "bundle/brewfile"
return @kept_casks if @kept_casks return @kept_casks if @kept_casks
@dsl ||= Brewfile.read(global:, file:) @dsl ||= Brewfile.read(global:, file:)
@ -152,6 +166,9 @@ module Homebrew
IGNORED_TAPS = %w[homebrew/core].freeze IGNORED_TAPS = %w[homebrew/core].freeze
def self.taps_to_untap(global: false, file: nil) def self.taps_to_untap(global: false, file: nil)
require "bundle/brewfile"
require "bundle/tap_dumper"
@dsl ||= Brewfile.read(global:, file:) @dsl ||= Brewfile.read(global:, file:)
kept_formulae = self.kept_formulae(global:, file:).filter_map(&method(:lookup_formula)) kept_formulae = self.kept_formulae(global:, file:).filter_map(&method(:lookup_formula))
kept_taps = @dsl.entries.select { |e| e.type == :tap }.map(&:name) kept_taps = @dsl.entries.select { |e| e.type == :tap }.map(&:name)
@ -168,6 +185,7 @@ module Homebrew
end end
def self.vscode_extensions_to_uninstall(global: false, file: nil) def self.vscode_extensions_to_uninstall(global: false, file: nil)
require "bundle/brewfile"
@dsl ||= Brewfile.read(global:, file:) @dsl ||= Brewfile.read(global:, file:)
kept_extensions = @dsl.entries.select { |e| e.type == :vscode }.map { |x| x.name.downcase } kept_extensions = @dsl.entries.select { |e| e.type == :vscode }.map { |x| x.name.downcase }
@ -176,6 +194,7 @@ module Homebrew
# find any in the `Brewfile`. # find any in the `Brewfile`.
return [].freeze if kept_extensions.empty? return [].freeze if kept_extensions.empty?
require "bundle/vscode_extension_dumper"
current_extensions = Homebrew::Bundle::VscodeExtensionDumper.extensions current_extensions = Homebrew::Bundle::VscodeExtensionDumper.extensions
current_extensions - kept_extensions current_extensions - kept_extensions
end end

View File

@ -1,6 +1,8 @@
# typed: true # rubocop:todo Sorbet/StrictSigil # typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true # frozen_string_literal: true
require "bundle/dumper"
module Homebrew module Homebrew
module Bundle module Bundle
module Commands module Commands

View File

@ -57,6 +57,7 @@ module Homebrew
command = args.first command = args.first
require "bundle/brewfile"
@dsl = Brewfile.read(global:, file:) @dsl = Brewfile.read(global:, file:)
require "formula" require "formula"

View File

@ -1,6 +1,9 @@
# typed: true # rubocop:todo Sorbet/StrictSigil # typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true # frozen_string_literal: true
require "bundle/brewfile"
require "bundle/installer"
module Homebrew module Homebrew
module Bundle module Bundle
module Commands module Commands

View File

@ -1,6 +1,9 @@
# typed: true # rubocop:todo Sorbet/StrictSigil # typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true # frozen_string_literal: true
require "bundle/brewfile"
require "bundle/lister"
module Homebrew module Homebrew
module Bundle module Bundle
module Commands module Commands

View File

@ -1,6 +1,8 @@
# typed: true # rubocop:todo Sorbet/StrictSigil # typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true # frozen_string_literal: true
require "bundle/remover"
module Homebrew module Homebrew
module Bundle module Bundle
module Commands module Commands

View File

@ -14,6 +14,12 @@ module Homebrew
end end
def self.build_brewfile(describe:, no_restart:, brews:, taps:, casks:, mas:, whalebrew:, vscode:) def self.build_brewfile(describe:, no_restart:, brews:, taps:, casks:, mas:, whalebrew:, vscode:)
require "bundle/tap_dumper"
require "bundle/cask_dumper"
require "bundle/mac_app_store_dumper"
require "bundle/whalebrew_dumper"
require "bundle/vscode_extension_dumper"
content = [] content = []
content << TapDumper.dump if taps content << TapDumper.dump if taps
content << BrewDumper.dump(describe:, no_restart:) if brews content << BrewDumper.dump(describe:, no_restart:) if brews
@ -33,6 +39,7 @@ module Homebrew
end end
def self.brewfile_path(global: false, file: nil) def self.brewfile_path(global: false, file: nil)
require "bundle/brewfile"
Brewfile.path(dash_writes_to_stdout: true, global:, file:) Brewfile.path(dash_writes_to_stdout: true, global:, file:)
end end

View File

@ -1,6 +1,14 @@
# typed: true # rubocop:todo Sorbet/StrictSigil # typed: true # rubocop:todo Sorbet/StrictSigil
# frozen_string_literal: true # frozen_string_literal: true
require "bundle/dsl"
require "bundle/brew_installer"
require "bundle/cask_installer"
require "bundle/mac_app_store_installer"
require "bundle/whalebrew_installer"
require "bundle/vscode_extension_installer"
require "bundle/tap_installer"
module Homebrew module Homebrew
module Bundle module Bundle
module Installer module Installer

View File

@ -61,6 +61,7 @@ module Homebrew
end end
def self.installed_app_ids def self.installed_app_ids
require "bundle/mac_app_store_dumper"
@installed_app_ids ||= Homebrew::Bundle::MacAppStoreDumper.app_ids @installed_app_ids ||= Homebrew::Bundle::MacAppStoreDumper.app_ids
end end

View File

@ -5,6 +5,9 @@ module Homebrew
module Bundle module Bundle
module Remover module Remover
def self.remove(*args, type:, global:, file:) def self.remove(*args, type:, global:, file:)
require "bundle/brewfile"
require "bundle/dumper"
brewfile = Brewfile.read(global:, file:) brewfile = Brewfile.read(global:, file:)
content = brewfile.input content = brewfile.input
entry_type = type.to_s if type != :none entry_type = type.to_s if type != :none

View File

@ -8,6 +8,8 @@ module Homebrew
module Skipper module Skipper
class << self class << self
def skip?(entry, silent: false) def skip?(entry, silent: false)
require "bundle/brew_dumper"
# TODO: use extend/OS here # TODO: use extend/OS here
# rubocop:todo Homebrew/MoveToExtendOS # rubocop:todo Homebrew/MoveToExtendOS
if (Hardware::CPU.arm? || OS.linux?) && if (Hardware::CPU.arm? || OS.linux?) &&

View File

@ -12,6 +12,7 @@ module Homebrew
requested_taps = format_checkable(entries) requested_taps = format_checkable(entries)
return [] if requested_taps.empty? return [] if requested_taps.empty?
require "bundle/tap_dumper"
current_taps = Homebrew::Bundle::TapDumper.tap_names current_taps = Homebrew::Bundle::TapDumper.tap_names
(requested_taps - current_taps).map { |entry| "Tap #{entry} needs to be tapped." } (requested_taps - current_taps).map { |entry| "Tap #{entry} needs to be tapped." }
end end

View File

@ -28,6 +28,7 @@ module Homebrew
end end
unless success unless success
require "bundle/skipper"
Homebrew::Bundle::Skipper.tap_failed!(name) Homebrew::Bundle::Skipper.tap_failed!(name)
return false return false
end end
@ -37,6 +38,7 @@ module Homebrew
end end
def self.installed_taps def self.installed_taps
require "bundle/tap_dumper"
@installed_taps ||= Homebrew::Bundle::TapDumper.tap_names @installed_taps ||= Homebrew::Bundle::TapDumper.tap_names
end end
end end

View File

@ -13,6 +13,7 @@ module Homebrew
end end
def installed_and_up_to_date?(extension, no_upgrade: false) def installed_and_up_to_date?(extension, no_upgrade: false)
require "bundle/vscode_extension_installer"
Homebrew::Bundle::VscodeExtensionInstaller.extension_installed?(extension) Homebrew::Bundle::VscodeExtensionInstaller.extension_installed?(extension)
end end
end end

View File

@ -44,6 +44,7 @@ module Homebrew
end end
def self.installed_extensions def self.installed_extensions
require "bundle/vscode_extension_dumper"
@installed_extensions ||= Homebrew::Bundle::VscodeExtensionDumper.extensions @installed_extensions ||= Homebrew::Bundle::VscodeExtensionDumper.extensions
end end
end end

View File

@ -40,6 +40,7 @@ module Homebrew
end end
def self.installed_images def self.installed_images
require "bundle/whalebrew_dumper"
@installed_images ||= Homebrew::Bundle::WhalebrewDumper.images @installed_images ||= Homebrew::Bundle::WhalebrewDumper.images
end end
end end

View File

@ -156,6 +156,7 @@ module Homebrew
raise UsageError, "`--install` cannot be used with `install`, `upgrade` or no subcommand." raise UsageError, "`--install` cannot be used with `install`, `upgrade` or no subcommand."
end end
require "bundle/commands/install"
redirect_stdout($stderr) do redirect_stdout($stderr) do
Homebrew::Bundle::Commands::Install.run(global:, file:, no_upgrade:, verbose:, force:, quiet: true) Homebrew::Bundle::Commands::Install.run(global:, file:, no_upgrade:, verbose:, force:, quiet: true)
end end
@ -163,6 +164,7 @@ module Homebrew
case subcommand case subcommand
when nil, "install", "upgrade" when nil, "install", "upgrade"
require "bundle/commands/install"
Homebrew::Bundle::Commands::Install.run(global:, file:, no_upgrade:, verbose:, force:, quiet: args.quiet?) Homebrew::Bundle::Commands::Install.run(global:, file:, no_upgrade:, verbose:, force:, quiet: args.quiet?)
cleanup = if ENV.fetch("HOMEBREW_BUNDLE_INSTALL_CLEANUP", nil) cleanup = if ENV.fetch("HOMEBREW_BUNDLE_INSTALL_CLEANUP", nil)
@ -172,6 +174,7 @@ module Homebrew
end end
if cleanup if cleanup
require "bundle/commands/cleanup"
Homebrew::Bundle::Commands::Cleanup.run( Homebrew::Bundle::Commands::Cleanup.run(
global:, file:, zap:, global:, file:, zap:,
force: true, force: true,
@ -187,6 +190,7 @@ module Homebrew
no_type_args no_type_args
end end
require "bundle/commands/dump"
Homebrew::Bundle::Commands::Dump.run( Homebrew::Bundle::Commands::Dump.run(
global:, file:, force:, global:, file:, force:,
describe: args.describe?, describe: args.describe?,
@ -199,10 +203,13 @@ module Homebrew
vscode: vscode:
) )
when "edit" when "edit"
require "bundle/brewfile"
exec_editor(Homebrew::Bundle::Brewfile.path(global:, file:)) exec_editor(Homebrew::Bundle::Brewfile.path(global:, file:))
when "cleanup" when "cleanup"
require "bundle/commands/cleanup"
Homebrew::Bundle::Commands::Cleanup.run(global:, file:, force:, zap:) Homebrew::Bundle::Commands::Cleanup.run(global:, file:, force:, zap:)
when "check" when "check"
require "bundle/commands/check"
Homebrew::Bundle::Commands::Check.run(global:, file:, no_upgrade:, verbose:) Homebrew::Bundle::Commands::Check.run(global:, file:, no_upgrade:, verbose:)
when "exec", "sh", "env" when "exec", "sh", "env"
named_args = case subcommand named_args = case subcommand
@ -225,8 +232,10 @@ module Homebrew
when "env" when "env"
["env"] ["env"]
end end
require "bundle/commands/exec"
Homebrew::Bundle::Commands::Exec.run(*named_args, global:, file:, subcommand:) Homebrew::Bundle::Commands::Exec.run(*named_args, global:, file:, subcommand:)
when "list" when "list"
require "bundle/commands/list"
Homebrew::Bundle::Commands::List.run( Homebrew::Bundle::Commands::List.run(
global:, global:,
file:, file:,
@ -259,8 +268,10 @@ module Homebrew
else t else t
end end
require "bundle/commands/add"
Homebrew::Bundle::Commands::Add.run(*named_args, type:, global:, file:) Homebrew::Bundle::Commands::Add.run(*named_args, type:, global:, file:)
else else
require "bundle/commands/remove"
Homebrew::Bundle::Commands::Remove.run(*named_args, type: selected_types.first, global:, file:) Homebrew::Bundle::Commands::Remove.run(*named_args, type: selected_types.first, global:, file:)
end end
else else

View File

@ -2,6 +2,7 @@
require "ostruct" require "ostruct"
require "bundle" require "bundle"
require "bundle/brew_dumper"
require "tsort" require "tsort"
require "formula" require "formula"
require "tab" require "tab"

View File

@ -2,6 +2,9 @@
require "bundle" require "bundle"
require "formula" require "formula"
require "bundle/brew_installer"
require "bundle/brew_dumper"
require "bundle/brew_services"
RSpec.describe Homebrew::Bundle::BrewInstaller do RSpec.describe Homebrew::Bundle::BrewInstaller do
let(:formula_name) { "mysql" } let(:formula_name) { "mysql" }

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/brew_services"
RSpec.describe Homebrew::Bundle::BrewServices do RSpec.describe Homebrew::Bundle::BrewServices do
describe ".started_services" do describe ".started_services" do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/brewfile"
RSpec.describe Homebrew::Bundle::Brewfile do RSpec.describe Homebrew::Bundle::Brewfile do
describe "path" do describe "path" do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/cask_dumper"
require "cask" require "cask"
RSpec.describe Homebrew::Bundle::CaskDumper do RSpec.describe Homebrew::Bundle::CaskDumper do

View File

@ -1,6 +1,8 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/cask_dumper"
require "bundle/cask_installer"
RSpec.describe Homebrew::Bundle::CaskInstaller do RSpec.describe Homebrew::Bundle::CaskInstaller do
describe ".installed_casks" do describe ".installed_casks" do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/commands/add"
require "cask/cask_loader" require "cask/cask_loader"
RSpec.describe Homebrew::Bundle::Commands::Add do RSpec.describe Homebrew::Bundle::Commands::Add do

View File

@ -1,6 +1,12 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/commands/check"
require "bundle/brew_checker"
require "bundle/mac_app_store_checker"
require "bundle/vscode_extension_checker"
require "bundle/brew_installer"
require "bundle/mac_app_store_installer"
RSpec.describe Homebrew::Bundle::Commands::Check do RSpec.describe Homebrew::Bundle::Commands::Check do
let(:do_check) do let(:do_check) do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/commands/cleanup"
RSpec.describe Homebrew::Bundle::Commands::Cleanup do RSpec.describe Homebrew::Bundle::Commands::Cleanup do
describe "read Brewfile and current installation" do describe "read Brewfile and current installation" do

View File

@ -1,6 +1,12 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/commands/dump"
require "bundle/cask_dumper"
require "bundle/brew_dumper"
require "bundle/tap_dumper"
require "bundle/whalebrew_dumper"
require "bundle/vscode_extension_dumper"
RSpec.describe Homebrew::Bundle::Commands::Dump do RSpec.describe Homebrew::Bundle::Commands::Dump do
subject(:dump) do subject(:dump) do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/commands/exec"
RSpec.describe Homebrew::Bundle::Commands::Exec do RSpec.describe Homebrew::Bundle::Commands::Exec do
context "when a Brewfile is not found" do context "when a Brewfile is not found" do

View File

@ -1,6 +1,8 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/commands/install"
require "bundle/skipper"
RSpec.describe Homebrew::Bundle::Commands::Install do RSpec.describe Homebrew::Bundle::Commands::Install do
before do before do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/commands/list"
RSpec.describe Homebrew::Bundle::Commands::List do RSpec.describe Homebrew::Bundle::Commands::List do
subject(:list) { described_class.run(global: false, file: nil, brews:, casks:, taps:, mas:, whalebrew:, vscode:) } subject(:list) { described_class.run(global: false, file: nil, brews:, casks:, taps:, mas:, whalebrew:, vscode:) }

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/commands/remove"
require "cask/cask_loader" require "cask/cask_loader"
RSpec.describe Homebrew::Bundle::Commands::Remove do RSpec.describe Homebrew::Bundle::Commands::Remove do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/dsl"
RSpec.describe Homebrew::Bundle::Dsl do RSpec.describe Homebrew::Bundle::Dsl do
def dsl_from_string(string) def dsl_from_string(string)

View File

@ -1,6 +1,14 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/dumper"
require "bundle/brew_dumper"
require "bundle/tap_dumper"
require "bundle/cask_dumper"
require "bundle/mac_app_store_dumper"
require "bundle/whalebrew_dumper"
require "bundle/vscode_extension_dumper"
require "bundle/brew_services"
require "cask" require "cask"
RSpec.describe Homebrew::Bundle::Dumper do RSpec.describe Homebrew::Bundle::Dumper do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/mac_app_store_dumper"
RSpec.describe Homebrew::Bundle::MacAppStoreDumper do RSpec.describe Homebrew::Bundle::MacAppStoreDumper do
subject(:dumper) { described_class } subject(:dumper) { described_class }

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/mac_app_store_installer"
RSpec.describe Homebrew::Bundle::MacAppStoreInstaller do RSpec.describe Homebrew::Bundle::MacAppStoreInstaller do
before do before do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/remover"
RSpec.describe Homebrew::Bundle::Remover do RSpec.describe Homebrew::Bundle::Remover do
subject(:remover) { described_class } subject(:remover) { described_class }

View File

@ -2,6 +2,8 @@
require "ostruct" require "ostruct"
require "bundle" require "bundle"
require "bundle/skipper"
require "bundle/dsl"
RSpec.describe Homebrew::Bundle::Skipper do RSpec.describe Homebrew::Bundle::Skipper do
subject(:skipper) { described_class } subject(:skipper) { described_class }

View File

@ -1,6 +1,8 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/skipper"
require "bundle/tap_dumper"
RSpec.describe Homebrew::Bundle::TapDumper do RSpec.describe Homebrew::Bundle::TapDumper do
subject(:dumper) { described_class } subject(:dumper) { described_class }

View File

@ -1,6 +1,8 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/tap_installer"
require "bundle/tap_dumper"
RSpec.describe Homebrew::Bundle::TapInstaller do RSpec.describe Homebrew::Bundle::TapInstaller do
describe ".installed_taps" do describe ".installed_taps" do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/vscode_extension_installer"
require "extend/kernel" require "extend/kernel"
RSpec.describe Homebrew::Bundle::VscodeExtensionInstaller do RSpec.describe Homebrew::Bundle::VscodeExtensionInstaller do

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/whalebrew_dumper"
RSpec.describe Homebrew::Bundle::WhalebrewDumper do RSpec.describe Homebrew::Bundle::WhalebrewDumper do
subject(:dumper) { described_class } subject(:dumper) { described_class }

View File

@ -1,6 +1,7 @@
# frozen_string_literal: true # frozen_string_literal: true
require "bundle" require "bundle"
require "bundle/whalebrew_installer"
RSpec.describe Homebrew::Bundle::WhalebrewInstaller do RSpec.describe Homebrew::Bundle::WhalebrewInstaller do
before do before do